<?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=Rspecht</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=Rspecht"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Rspecht"/>
	<updated>2026-04-13T16:46:57Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=37934</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=37934"/>
		<updated>2023-01-12T09:54:03Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: Beispielkonfiguration SSH wurde hinzugefügt&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=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. Seit Version 2.0 können auch Remote-Systeme abgefragt werden (Telnet).&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, CubieTruck und einige andere.&lt;br /&gt;
&lt;br /&gt;
Für Informationen zu einer FritzBox beachten Sie bitte auch Module: [[FRITZBOX]] und [[FB_CALLMONITOR]]. &lt;br /&gt;
&lt;br /&gt;
Das Modul nutzt das Perlmodule &#039;Net::Telnet&#039; für den Fernzugriff. Dieses muss ggf. nachinstalliert werden. Unter Ubuntu kann dafür das Paket libnet-telnet-perl verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [MODE[:[USER@]HOST][:PORT]] [&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;
&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;
Für Abfrage eines entfernten Systems muss mindestens deren Adresse (HOST) angegeben werden, bei Bedarf ergänzt durch den Port und/oder den Benutzernamen. Das eventuell benötigte Passwort muss einmalig mit dem Befehl &#039;set password &amp;lt;pass&amp;gt;&#039; definiert werden. Als MODE sind derzeit &#039;telnet&#039; und &#039;local&#039; erlaubt. &#039;local&#039; erfordert keine weiteren Angaben und kann auch ganz weggelassen werden.&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;br /&gt;
&lt;br /&gt;
==Beispielkonfiguration Remote System per SSH==&lt;br /&gt;
Hier bedarf es etwas Vorarbeit damit man sich per SSH verbinden kann. Hier am Beispiel geht es um einen kleinen Orange Pi als Snapcast Audioreciver. Dazu muss man ein passwortlosen Login per authkey ermöglichen. Dieser wird auf dem FHEM Server als fhem User mit folgendem Befehl erzeugt:&lt;br /&gt;
&lt;br /&gt;
    ssh-keygen -t rsa&lt;br /&gt;
&lt;br /&gt;
Auf dem zu überwachenden Gerät (Hier der OPi) wird ein User zum daten abfragen angelegt.&lt;br /&gt;
&lt;br /&gt;
    adduser fhemremote&lt;br /&gt;
&lt;br /&gt;
Nun muss noch der Key vom FHEM Server zum OPi übertragen werden (auf dem FHEM Server als fhem User ausführen):&lt;br /&gt;
&lt;br /&gt;
    ssh-copy-id fhemremote@orangeaudio1&lt;br /&gt;
&lt;br /&gt;
Jetzt noch einmal das Passwort des fhemremote User eingeben und die Vorbereitung ist geschafft.&lt;br /&gt;
&lt;br /&gt;
Jetzt kann das Device angelegt werden. Ich überwache zusätzlich noch die Installierbaren Pakete einmal am Tag.&lt;br /&gt;
&lt;br /&gt;
    define systemSysmonOrangeAudio1 SYSMON ssh:fhemremote@orangeaudio1 	1 10 10 10&lt;br /&gt;
    attr systemSysmonOrangeAudio1 room Audio,Systemgeräte&lt;br /&gt;
    attr systemSysmonOrangeAudio1 user-defined apt_upgradeable_pkg:1440:Upgradable Packages in Apt:apt-get -q -y --ignore-hold --allow-change-held-packages --allow-unauthenticated -s dist-upgrade | /bin/grep  ^Inst | wc -l&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT&amp;diff=33377</id>
		<title>MQTT</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT&amp;diff=33377"/>
		<updated>2020-06-11T12:27:40Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* OpenMQTTGateway */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MQTT ist ein Protokoll (&amp;quot;Message Queue Telemetry Transport&amp;quot;), mit dem Daten und Befehle zwischen verschiedenen Geräten ausgetauscht werden. Die Kommunikation erfolgt dabei über einen zentralen MQTT-Server, in alter Nomenklatur auch &#039;&#039;Broker&#039;&#039; genannt.&lt;br /&gt;
&lt;br /&gt;
MQTT wurde entwickelt, um möglichst effizient, sicher und mit wenig Datenlast zu kommunizieren. MQTT ist nachrichtenorientiert, daher muss ein Client nicht beständig beim Server anfragen, ob neue Daten vorliegen. Heute findet sich MQTT vor allem im Bereich des &#039;&#039;Internet of Things&#039;&#039; (IoT). MQTT kann leicht mit FHEM verbunden werden, ohne dass dabei größerer CPU- oder Datenverbrauch entsteht. &lt;br /&gt;
&lt;br /&gt;
== Eine sehr kurze Einführung in MQTT ==&lt;br /&gt;
Die folgende Einführung kann eine vollwertige Einleitung wie beispielsweise [https://github.com/mqtt/mqtt.github.io/wiki diese Wikieinträge] nicht ersetzen. &lt;br /&gt;
&lt;br /&gt;
Bei MQTT findet die nachrichtenbasierte Kommunikation zwischen einzelnen Teilnehmern&amp;lt;ref&amp;gt;Teilnehmer in diesem Sinne kann ein Stück Hardware mit einer MQTT-fähigen firmware sein, ein auf einem Computer laufendes Script (einschließlich eines MQTT-Server-Dienstes wie &#039;&#039;mosquitto&#039;&#039; oder &#039;&#039;MQTT2_SERVER&#039;&#039;, kurz: alles mögliche sein. Dadurch kann auch ein einzelner Computer unter mehreren ClientID&#039;s am MQTT-Datenaustausch beteiligt sein.&amp;lt;/ref&amp;gt; in der Regel nicht direkt statt. Stattdessen werden alle Nachrichten von einem Teilnehmer an einen Serverdienst, den MQTT-Server (früher &#039;&#039;Broker&#039;&#039; genannt) übergeben, der dann dafür sorgt, dass die Nachricht an alle (berechtigten) anderen Teilnehmer verteilt wird, die sich für derartige Nachrichten &amp;quot;interessieren&amp;quot;. Wenn also ein Teilnehmer ohne Server-Funktion (Client) Daten von einem bestimmten anderen Teilnehmer (anderer Client) empfangen will, muss es vorher dem MQTT-Server (Broker) mitteilen, dass er die Nachrichten dieses anderen Teilnehmers abonniert (deshalb wird dieser Vorgang als &#039;&#039;subscribe&#039;&#039; bezeichnet). Im IoT ist besonders interessant, dass Sender und Empfänger von Nachrichten durch den MQTT-Server vollständig entkoppelt werden können - jemand, der Daten bereit stellt, muss sich also nicht darum kümmern, wer diese Daten empfängt&amp;lt;ref&amp;gt;Aufgrund dieser Funktionsweise sollte allerdings darauf geachtet werden, die Möglichkeiten des jeweiligen Servers zur Sicherung der Daten gegen unberechtigten Zugriff zu nutzen, insbesondere wenn die Art der Daten oder die sich hierdurch ergebenden Möglichkeiten, z.B. Schaltvorgänge in der realen Welt auszulösen, dies notwendig macht!&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht besteht im Wesentlichen aus den folgenden Elementen:&lt;br /&gt;
*ClientID -  das ist die Kennung des Senders einer Nachricht&amp;lt;ref&amp;gt;Diese kann sich bei der Weitergabe der Nachricht ändern: Zunächst sendet ein Client eine Nachricht unter seiner ClientID, der MQTT-Server wird diese dann in der Regel durch seine Kennung ersetzten, wenn er die Nachricht an einen Abonnenten - der auch ein weiterer MQTT-Server sein kann - weitergibt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
*Topic - das ist die Adresse, an die eine Nachricht gesendet wird, bzw. von wo sie abgeholt werden kann (so ähnlich wie ein Postfach in der realen Welt). Topics sind einfache Strings, die mit Schrägstrichen getrennt werden (keine Leerzeichen und nur sehr wenige Sonderzeichen erlaubt). Ein Topic könnte beispielhaft so lauten: &amp;lt;code&amp;gt;zuHause/1OG/Kueche/Licht/state&amp;lt;/code&amp;gt;. Diese Topics beinhalten also eine Hierarchie der Objekte - hier im Beispiel sind sie zuerst danach sortiert, ob sie sich zu Haus befinden, dann wird nach Stockwerken sortiert und im ersten Stock schaut man auf die Küche sowie das dort vorhandene Licht.  &lt;br /&gt;
*Payload - das ist der Inhalt der Nachricht, oft handelt es sich um Befehle oder Daten.&lt;br /&gt;
*Quality of Service - soll geprüft werden, ob die Nachricht zugestellt wurde und wenn ja, mit welcher &amp;quot;Tiefe&amp;quot;?&lt;br /&gt;
*Retained Message. &lt;br /&gt;
Details bitte in der oben genannten Einführung nachlesen.&lt;br /&gt;
&lt;br /&gt;
MQTT kommuniziert üblicherweise über Port 1883, es können aber unter derselben Netzwerkadresse an unterschiedlichen Ports auch mehrere Serverdienste bereitstehen. &lt;br /&gt;
&lt;br /&gt;
== Installation in FHEM ==&lt;br /&gt;
Um MQTT in FHEM zu nutzen, benötigt man (mindestens) einen MQTT-Server.  Es gibt zwei Möglichkeiten: Man kann FHEM-externe Server-Software (oder auch einen oder mehrere im Internet bereitstehende MQTT-Server) verwenden oder man kann die MQTT-Serverkomponente aktivieren, die mit {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} in FHEM direkt bereitsteht. Hier werden kurz beide Installationswege erläutert, zwingend ist nur einer, da eben mindestens ein MQTT-Serverdienst aktiv sein muß.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Schaubilder zeigen schematisch die in FHEM zur Verfügung stehenden Wege der Einbindung von Hard- und/oder Softwarekomponenten, die über das MQTT-Protokoll Daten austauschen.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:Mqtt2 server.png|Datenaustausch mit MQTT-Geräten, wenn MQTT2_SERVER als internem MQTT-Serverdienst verwendet wird&lt;br /&gt;
Datei:Mqtt2 client v extern server.png|Datenaustausch mit MQTT-Geräten, wenn MQTT2_CLIENT iVm. mosquitto als externem MQTT-Serverdienst verwendet wird&lt;br /&gt;
Datei:00 mqtt pm.png|Datenaustausch mit MQTT-Geräten, wenn das Modul &#039;&#039;MQTT&#039;&#039; (00_MQTT.pm) iVm. mosquitto als externem MQTT-Serverdienst verwendet wird&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
=== FHEM als MQTT-Server ===&lt;br /&gt;
Die mit dem Modul {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} bereitstehende Serverkomponente kann z.B. wie folgt aktiviert werden:&lt;br /&gt;
 defmod myBroker MQTT2_SERVER 1883 global&lt;br /&gt;
Dieses [[Gerät]] übernimmt dann die Kommunikation mit den externen Clients (und wird von diesen behandelt, wie jeder andere MQTT-Server auch&amp;lt;ref&amp;gt;Bitte beachten Sie, dass (Stand: Juni 2019) MQTT2_SERVER nicht alle features des MQTT-Protokolls unterstützt.&amp;lt;/ref&amp;gt;) und verteilt die eingehenden Nachrichten als IO-Device&amp;lt;ref&amp;gt;im Sinne des [[DevelopmentModuleIntro#Zweistufiges Modell für Module|2-stufigen Modulkonzepts]]&amp;lt;/ref&amp;gt; für die Client-Module [[MQTT2_DEVICE]]&amp;lt;ref&amp;gt;Die Zahl 2 in den Modulnamen verweist nur darauf, dass es sich um eine neuere Modulfamilie handelt; die Kommunikation mit den externen Komponenten unterscheidet sich nicht zu den älteren Modulen, die vor dem Jahr 2018 genutzt werden konnten.&amp;lt;/ref&amp;gt; und {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=de|Label=MQTT_GENERIC_BRIDGE}}.&lt;br /&gt;
Ein weiterer Vorteil dieser Lösung besteht darin, dass man ein MQTT2_SERVER-Device mit Hilfe von [[allowed]] absichern kann, was auch SSL-verschlüsselte Kommunikation ermöglicht. &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; In diesem Fall muss User bzw. Passwort auch in den entsprechenden Geräten eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Wenn Sie beabsichtigen, diese Variante zu verwenden, sollten Sie als nächstes die [[MQTT2-Module - Praxisbeispiele|Praxisbeispiele zu den MQTT2-Modulen]] lesen, und ggf. später wieder hierher zurückkehren. Dort findet sich auch ein Abschnitt zu dem auf den Grafiken zu den MQTT2-IO-Modulen enthaltenen [[MQTT2-Module_-_Praxisbeispiele#bridgeRegexp|bridgeRegexp]]-Attribut.}}&lt;br /&gt;
&lt;br /&gt;
=== FHEM-externer Broker ===&lt;br /&gt;
==== Beispiel: mosquitto ====&lt;br /&gt;
Eine gern verwendete MQTT-Server-Software ist [http://mosquitto.org Mosquitto]. Sie kann ohne weiteres auf dem Raspberry Pi, der bereits eine FHEM-Installation besitzt, installiert werden und wird keine größere CPU- oder Netzwerklast verursachen. &lt;br /&gt;
&lt;br /&gt;
Eine Anleitung zur Installation findet sich beispielsweise in diesem [http://blog.wenzlaff.de/?p=6487 Blogeintrag]. Im wesentlichen beschränkt sich die Installation eines MQTT Servers aber auf wenige Arbeitsschritte. Bei &#039;&#039;stretch&#039;&#039; ist &#039;&#039;Mosquitto&#039;&#039; bereits in der Distribution enthalten und kann - zusammen mit dem client Befehl &#039;&#039;mosquito_sub&#039;&#039;, der weiter unten benötigt wird, wie folgt installiert und getestet werden&amp;lt;ref&amp;gt;Die für den Betrieb mit FHEM erforderlichen Perl-Module sind teilweise (noch) nicht in den Paketquellen verfügbar. Sie können dennoch statt mit cpan auch als Debian-Paket mit Hilfe von &#039;&#039;dh-make-perl&#039;&#039; installiert werden, wobei vorab das in den Paketquellen bereits vorhandene &#039;&#039;libmodule-pluggable-perl&#039;&#039; installiert werden sollte:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install dh-make-perl&amp;lt;br&amp;gt;&lt;br /&gt;
dh-make-perl --install --cpan Net::MQTT::simple&amp;lt;br&amp;gt;&lt;br /&gt;
dh-make-perl --install --cpan Net::MQTT::Constants&amp;lt;br&amp;gt;&lt;br /&gt;
sudo dpkg -i libnet-mqtt-simple-perl*.deb&amp;lt;br&amp;gt;&lt;br /&gt;
sudo dpkg -i libnet-mqtt-perl*.deb&amp;lt;/code&amp;gt;&amp;lt;/ref&amp;gt;:&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Für ältere Distributionen (hier am Beispiel von &#039;&#039;jessie&#039;&#039;) muß ggf. aus einer zusätzlichen Paketquelle installiert werden:&lt;br /&gt;
 wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key&lt;br /&gt;
 sudo apt-key add mosquitto-repo.gpg.key&lt;br /&gt;
 cd /etc/apt/sources.list.d/&lt;br /&gt;
 sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
Danach kann die eigentliche Installation durchgeführt werden wie links für &#039;&#039;stretch&#039;&#039; beschrieben.}}&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  sudo apt-get install mosquitto mosquitto-clients&lt;br /&gt;
 &lt;br /&gt;
 # MQTT Server Test&lt;br /&gt;
 sudo service mosquitto status&lt;br /&gt;
&lt;br /&gt;
 # Start / Stop des Servers&lt;br /&gt;
 sudo service mosquitto stop&lt;br /&gt;
 sudo service mosquitto start&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Danach ist der RPi mit &amp;lt;nowiki&amp;gt;shutdown restart&amp;lt;/nowiki&amp;gt; neu zu starten. &lt;br /&gt;
&lt;br /&gt;
==== IO-Module für externe MQTT-Server ====&lt;br /&gt;
Damit FHEM mit dem MQTT-Server kommuniziert, muss noch ein IO-Device angelegt werden. Dabei stehen zwei Varianten zur Wahl, das Modul [[MQTT (Modul)|MQTT]] oder seit Ende 2018 [[MQTT2_CLIENT]].&lt;br /&gt;
&lt;br /&gt;
Beide Module können auch dazu genutzt werden, um Daten zwischen zwei FHEM-Installationen auszutauschen, insbesondere kann auch 00_MQTT.pm als Client für einen MQTT2_SERVER eingesetzt werden, der &#039;&#039;&#039;auf der anderen Installation&#039;&#039;&#039; als MQTT-Serverdienst eingerichtet ist. Darüber hinaus bestehen eine Vielzahl von Kombinationsmöglichkeiten der diversen IO-Module, wenn die Installation auf mehrere Server verteilt ist.&lt;br /&gt;
Auf einer FHEM-Installation wird jedoch in der Regel nur eines der IO-Module benötigt. &lt;br /&gt;
&lt;br /&gt;
===== MQTT2_CLIENT =====&lt;br /&gt;
Ein MQTT2_CLIENT-IO-Device wird z.B. angelegt mit&lt;br /&gt;
 define myBroker MQTT2_CLIENT 10.0.0.5:1883 ## bitte EIGENE IP-Adresse eintragen&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Wenn Sie beabsichtigen, MQTT2_CLIENT zu verwenden, sollten Sie zuerst die [[MQTT2-Module - Praxisbeispiele|Praxisbeispiele zu den MQTT2-Modulen]] lesen, und dabei die Hinweise im Artikel [[MQTT2_CLIENT]] beachten.}}&lt;br /&gt;
&lt;br /&gt;
Ein MQTT2_CLIENT-Device kann ebenfals mit Hilfe von [[allowed]] abgesichert werden, um z.B. SSL-verschlüsselte Kommunikation zu ermöglichem. Client-Module zu diesem IO-Typ sind wiederum [[MQTT2_DEVICE]] und {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=de|Label=MQTT_GENERIC_BRIDGE}}.&lt;br /&gt;
&lt;br /&gt;
===== MQTT (Modul) ===== &lt;br /&gt;
Vorab werden für diese Variante weitere Perl-Pakete benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 # Perl Version ausgeben&lt;br /&gt;
 perl -v&lt;br /&gt;
 # Perl MQTT Module nachinstallieren (läuft ein paar Minuten)&lt;br /&gt;
 sudo cpan install Net::MQTT:Simple&lt;br /&gt;
 sudo cpan install Net::MQTT:Constants&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein IO-Device des Typs MQTT wird z.B. angelegt mit&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Sofern der Broker mit FHEM über localhost kommuniziert, kann als IP 127.0.0.1 verwendet werden.}}&lt;br /&gt;
 define myBroker MQTT 10.0.0.5:1883 ## bitte EIGENE IP-Adresse eintragen&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Außerhalb der offiziellen Quellen sind auch einige ältere Varianten des Moduls MQTT_DEVICE verfügbar, die jeweils spezielle Anforderungen (z.B. für Zigbee2mqtt) separat abbilden. Diese werden hier nicht gesondert behandelt, da solche Sonderfälle heute generischer und einfacher durch den Einsatz von MQTT2_DEVICE abzubilden sind.}}Client-Device-Module zum Modul [[MQTT (Modul)|MQTT]] sind [[MQTT_DEVICE]], {{Link2CmdRef|Anker=MQTT_BRIDGE|Lang=de|Label=MQTT_BRIDGE}} (veraltet) und {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=de|Label=MQTT_GENERIC_BRIDGE}}. Da &#039;&#039;MQTT_DEVICE&#039;&#039; payload im JSON-Format (im Unterschied zu MQTT2_DEVICE) nicht selbst verarbeiten kann wird hier zusätzlich das Modul {{Link2CmdRef|Anker=expandJSON|Lang=de|Label=expandJSON}} benötigt, um den {{Link2Forum|Topic=66761|LinkText=JSON String auszuwerten}}.&lt;br /&gt;
&lt;br /&gt;
=== Performancefragen... ===&lt;br /&gt;
...oder was sollte man als Lösung wählen, wenn man in die MQTT-Welt einsteigt&amp;lt;ref&amp;gt;vgl. hierzu diesen {{Link2Forum|Topic=94768|Message=875714|LinkText=Beitrag}} von Rudolf König&amp;lt;/ref&amp;gt;?&lt;br /&gt;
Grundsätzlich sollte man davon ausgehen, dass innerhalb von FHEM die Verarbeitung derselben Daten näherungsweise denselben Aufwand bedeuten, unabhängig davon, welche der Implementierungen (&#039;&#039;MQTT2_CLIENT&#039;&#039;, &#039;&#039;MQTT&#039;&#039; oder &#039;&#039;MQTT2_SERVER&#039;&#039;) man konkret wählt.&lt;br /&gt;
Ein externer Broker hat daher vor allem dann Vorteile, wenn die MQTT Daten überwiegend für was anderes (nicht FHEM) verwendet werden, oder MQTT zweckentfremdet wird (wie z.Bsp. für Musikübertragung). Nutzt man das MQTT-Protokoll dagegen vorwiegend innerhalb von FHEM, ist eher der Einsatz von MQTT2_SERVER in Betracht zu ziehen. Dieser soll Anfängern die Anbindung von MQTT Geräten in FHEM einfacher machen. Wer später merkt, dass er doch einen externen Broker benötigt, kann dann immer noch auf MQTT2_CLIENT in Verbindung mit einem anderen Broker wechseln.&lt;br /&gt;
Dagegen ist der Weg von MQTT_DEVICE zu MQTT2_DEVICE mit erheblich mehr Aufwand verbunden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation zu sonstigen FHEM-Geräten über MQTT  ===&lt;br /&gt;
&lt;br /&gt;
Möchte man Daten von einem [[Gerät]] (im FHEM-Sinn), das &#039;&#039;&#039;nicht&#039;&#039;&#039; vom Typ &#039;&#039;MQTT2_DEVICE&#039;&#039; oder &#039;&#039;MQTT_DEVICE&#039;&#039; (je nach IO-Modul) ist, per MQTT-Protokoll versenden (z.B. für eine andere Visualisierungslösung als FHEMWEB, oder als FHEM2FHEM-Ersatzlösung), oder diese sonstigen Geräte über MQTT-Anweisungen von außen steuern können, hat man mehrere Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
==== MQTT_GENERIC_BRIDGE ====&lt;br /&gt;
Das Modul {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=en|Label=MQTT_GENERIC_BRIDGE}} ermöglicht es, sein jeweiliges IO-Modul-Gerät zu nutzen, um diesen Kommunikationsweg für beliebig viele andere FHEM-Geräte bereitzustellen. Dabei erfolgt am MQTT_GENERIC_BRIDGE-Gerät selbst nur eine Basiskonfiguration, im Übrigen durch Attribute an dem jeweiligen Gerät selbst. So kann z.B. ein Aktor des Typs [[CUL_HM]] an- oder ausgeschaltet werden oder auch einfach nur seinen aktuellen Schaltzustand per MQTT-Protokoll publizieren.&lt;br /&gt;
 &lt;br /&gt;
Dieses Modul kann seit November 2018 mit allen drei IO-Modul-Varianten zusammen eingesetzt werden, also sowohl mit &#039;&#039;MQTT2_SERVER&#039;&#039; bzw. &#039;&#039;MQTT2_CLIENT&#039;&#039; oder &#039;&#039;MQTT&#039;&#039; (00_MQTT.pm). &lt;br /&gt;
&lt;br /&gt;
Dabei sollte man jedoch beachten, dass zur Verwendung mit den MQTT2-IO&#039;s unbedingt die autocreate-Funktion des betreffenden IOs ausgeschaltet wird und dies auch bleibt&amp;lt;ref&amp;gt;siehe dazu diesen {{Link2Forum|Topic=95341|LinkText=Thread}} zu den technischen Hintergründen&amp;lt;/ref&amp;gt;! Weiter wird das Perl-Modul &#039;&#039;libmodule-pluggable-perl&#039;&#039; benötigt&amp;lt;ref&amp;gt;Dieses kann über &amp;lt;code&amp;gt;apt-get install libmodule-pluggable-perl&amp;lt;/code&amp;gt; installiert werden&amp;lt;/ref&amp;gt;, damit im Hintergrund auch das Modul [[MQTT (Modul)|MQTT]] geladen werden kann. Damit gelten auch für diesen Modul die Installationsvoraussetzungen für [[MQTT#MQTT_.28Modul.29|MQTT]]!&lt;br /&gt;
&lt;br /&gt;
Anwendungsfälle und -beispiele für das Modul sind diesem {{Link2Forum|Topic=91642|LinkText=Thread}} zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
==== MQTT_BRIDGE ====&lt;br /&gt;
Dieses Modul kann nur zusammen mit einem IO-Gerät des Typs [[MQTT (Modul)|MQTT]] verwendet werden. Dabei wird pro weiterzuleitendem anderen FHEM-Gerät eine eigene Instanz dieses Moduls verwendet. Auf den Einsatz dieser Option sollte in neuen Installationen zugunsten von &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039; verzichtet werden.&lt;br /&gt;
&lt;br /&gt;
==== Per publish-Befehl am IO-Gerät ====&lt;br /&gt;
Alle drei IO-Module kennen direkte &#039;&#039;publish&#039;&#039;-Anweisungen, mit deren Hilfe beliebige &#039;&#039;payloads&#039;&#039; an beliebige &#039;&#039;topics&#039;&#039; gesendet werden können. Dies kann man z.B. in einem [[notify]] oder [[at]] nutzen, um einzelne Events zu publishen oder Werteanfragen abzusetzen.&lt;br /&gt;
&lt;br /&gt;
Hier eine regelmäßige Werteabfrage auf einen [[EBUS-MQTT2|ebus]]:&lt;br /&gt;
 defmod get_ebus_updates at +*00:15:00 set ebusMQTT publish ebusd/430/Hc1HeatCurve/get;&lt;br /&gt;
 set ebusMQTT publish ebusd/430/HwcTempDesired/get;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RAW-Events am IO-Gerät (MQTT2.*) ====&lt;br /&gt;
Bei beiden MQTT2-IO-Modulen (MQTT2_SERVER und MQTT2_CLIENT) kann per [[Regulärer Ausdruck|regulärem Ausdruck]] festgelegt werden, welche Nachrichten ein Event erzeugen sollen, auf das dann wieder z.B. mit einem [[notify]] reagiert werden kann, z.B. um beliebige Schaltaktionen auszulösen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT-Clients (Beispiele) ==&lt;br /&gt;
&lt;br /&gt;
===Arduino-library===&lt;br /&gt;
Zur Kommunikation mit dem Broker von Seiten eines [[Arduino|Arduinos]] mit selbst erstellten Sketches böte sich der PubSubClient an.&lt;br /&gt;
&lt;br /&gt;
===PC-Software===&lt;br /&gt;
Um die Funktionalität des Brokers zu testen kann z.B. ein Analyse-Tool wie MQTT.fx verwendet werden, oder die im Paket &#039;&#039;mosquitto-clients&#039;&#039; enthaltenen Linux-Kommandozeilen-Programme &#039;&#039;mosquitto_sub&#039;&#039; und &#039;&#039;mosquitto_pub&#039;&#039;. Letzterer könnte z.E. auch aus beliebigen &#039;&#039;shell-scripten&#039;&#039; heraus aufgerufen werden. Als Perl-Bibliothek steht alternativ z.B. [https://metacpan.org/pod/distribution/AnyEvent-MQTT/bin/anyevent-mqtt-pub anyevent-mqtt-pub] zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== Tasmota ===&lt;br /&gt;
Eine derzeit oft genutzte Möglichkeit für MQTT bilden die [[Sonoff]]-Geräte und weitere [[ESP8266]]-basierte Hardware, die unter vielen Handelsnamen erhältlich sind. Werden diese mit Tasmota (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) geflasht, so kommunizieren sie über MQTT. Um diese Geräte einzubinden, ist wie folgt vorzugehen. Zuerst ist ein Serverdienst (Broker) bereitzustellen, wie oben beschrieben.&lt;br /&gt;
&lt;br /&gt;
Unter Sonoff sind einige Topics voreingestellt. arendst stellt insbesondere drei Topic-Präfixe bereit, die seiner Meinung jedes Topic einleiten sollen (in den Eingabemasken als &amp;quot;%prefix%&amp;quot; notiert). Das sind einmal Kommandos (abgekürzt als cmnd), die dazu dienen, Befehle auszuführen. Daten werden mit tele und stat übertragen. Ein Topic besteht dann zuerst aus diesem Präfix und danach dem eigentlichen Topic. Wer also beispielsweise einem Sonoff_Switch einen Befehl senden will, sollte als Topic cmnd/Sonoff_Switch wählen. Wenn der Switch ein- und ausgeschaltet werden kann, muss der Topic noch das Wort POWER enthalten (in MQTT werden viele Kennworte komplett groß geschrieben). Der Topic lautet damit vollständig &amp;quot;cmnd/Sonoff_Switch/POWER/set&amp;quot; &lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Dabei ist darauf zu achten, dass für den Parameter &#039;&#039;topic = %topic% (sonoff)&#039;&#039; statt &#039;&#039;sonoff&#039;&#039; ein gerätespezifischer eigener Name eingetragen wird. Hierzu kann man z.B. auch die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; verwenden, indem man die unter &#039;&#039;client (DVES_8BABA9)&#039;&#039; zu findende Angabe kopiert. Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
&lt;br /&gt;
Link zum Forum: {{Link2Forum|Topic=27532|LinkText=MQTT FHEM Einrichtung}} (hier als &#039;&#039;MQTT_DEVICE&#039;&#039;!):&lt;br /&gt;
&lt;br /&gt;
 ### FHEM Device mit MQTT verbinden ###&lt;br /&gt;
 define Sonoff_Switch MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_Switch IODev myBroker&lt;br /&gt;
 attr Sonoff_Switch devStateIcon ON:rc_GREEN:OFF OFF:rc_RED:ON&lt;br /&gt;
 attr Sonoff_Switch icon hue_filled_br30&lt;br /&gt;
 attr Sonoff_Switch publishSet ON OFF cmnd/TestSwitch/POWER&lt;br /&gt;
 attr Sonoff_Switch room MQTT&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Licht stat/Sonoff_Switch/POWER&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Sensor tele/Sonoff_Switch/SENSOR&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Status stat/Sonoff_Switch/STATUS&lt;br /&gt;
 attr Sonoff_Switch webCmd ON:OFF&lt;br /&gt;
&lt;br /&gt;
Der hier dargestellte Beispielcode realisiert die Kommunikation zwischen FHEM und dem sonoff Modul via MQTT Broker. Zu beachten ist hier, dass &#039;&#039;&#039;subscribeReading_Licht&#039;&#039;&#039; und &#039;&#039;&#039;subscribeReading_Status&#039;&#039;&#039; unterschiedliche Syntax des Topic Strings haben!&lt;br /&gt;
&lt;br /&gt;
=== OpenMQTTGateway ===&lt;br /&gt;
Um verschiedene Systeme wie BLE usw. auf MQTT zu bringen bietet sich OpenMQTTGateway an.&lt;br /&gt;
&lt;br /&gt;
Ich habe es für BLE kompiliert und auf einem ESP32 installiert. Hierzu braucht man nur das blanke Board ohne Zusatzhardware.&lt;br /&gt;
&lt;br /&gt;
Weiter infos hier: [https://github.com/1technophile/OpenMQTTGateway]&lt;br /&gt;
&lt;br /&gt;
In FHEM wird das ganze über den eigenen Broker oder einen extern Broker (z.B.: Mosquitto) eingebunden.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich legt ihr noch ein Device hierzu an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define MQTT2_OMG1 MQTT2_DEVICE&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich habe es noch in den Raum MQTT2 geschoben.&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;set MQTT2_OMG1 attrTemplate OpenMQTTGateway_MCU&amp;lt;/code&amp;gt; wird das Template festgelegt.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Device raus könnt ihr euch nun auch ein Dummy für z.B. einen MiFlora anlegen lassen. Das geschieht dann über &amp;lt;code&amp;gt;set MQTT2_OMG1 attrTemplate OpenMQTTGateway_BT_mi_flora_sensor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sicherheit ==&lt;br /&gt;
Prinzipiell ist MQTT ebenso sicher wie eine Postkarte. Solange man es nicht extra absichert, kann jeder der, im eigenen LAN ist (und die Adresse vom Broker kennt) alle Topics mitlesen.&lt;br /&gt;
:&amp;lt;code&amp;gt;meinHaus/Flur/Haustuer:open / close&amp;lt;/code&amp;gt;&lt;br /&gt;
bietet unter diesen Umständen reichlich Raum für Verbesserungen! &lt;br /&gt;
&lt;br /&gt;
Abhilfe:&lt;br /&gt;
=== Username / Passwort ===&lt;br /&gt;
Zunächst kann man erst mal einen Username / Passwort vergeben, was alle IO-Device-Module unterstützen. Da ist zwar auch noch lange nicht sicher, aber zumindest steigert es den Aufwand schon mal. Jetzt muss man zumindest schon mal Pakete sniffen und verstehen, um unbefugt zu lesen oder gar zu publishen.&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
Um wirklich sicher zu werden, führt kein Weg an TLS vorbei. &lt;br /&gt;
&lt;br /&gt;
Der MQTT-Client in [[#Tasmota|Tasmota]] (für ESP8266) kann mit TLS betrieben werden, vgl. [https://github.com/arendst/Tasmota/wiki/TLS Beschreibung im Tasmota-Wiki].&lt;br /&gt;
&lt;br /&gt;
Leider kann z.B. ein Arduino das schlicht nicht mehr, da die einfacheren Modelle nicht über ausreichend Speicher und die Rechenleistung verfügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;(Hier fehlt eine Anleitung für allowed usw.)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
=== Anweisung und Ergebnis weichen voneinander ab ===&lt;br /&gt;
In der Regel melden MQTT-fähige Geräte entweder den Erhalt einer Nachricht zurück oder den Status nach Durchführung der in der &#039;&#039;payload&#039;&#039; enthaltenen Anweisung. Dabei findet aber in der Regel beim Empfänger eine Verarbeitung der Nachricht statt, ggf. wird diese auch weitergesendet und nochmals verarbeitet, bevor dann ggf. eine Rückmeldung des neuen Status an den MQTT-Server erfolgt. Handelt es sich um einfache on/off-Befehle, bleibt Anweisung und Ergebnis in der Regel identisch. Bei anderen, namentlich bei Dimmer-Werten, kann es zu Rundungsdifferenzen bei nummerischen Werten kommen. So kann z.B. ein Dimm-Wert von 70% gesetzt werden, zürückgemeldet wird dann aber 72% (oder 67%). &lt;br /&gt;
Dies ist technisch bedingt, vermeiden kann das jedoch in aller Regel nur der Autor der jeweiligen software/firmware auf dem &amp;quot;rechnenden&amp;quot; Gerät.&lt;br /&gt;
&lt;br /&gt;
=== Unbeabsichtigte Schleifen ===&lt;br /&gt;
Durch Fehler in der topic-Struktur können unbeabsichtigte Schleifen entstehen, die FHEM komplett blockieren können. Es ist unbedingt darauf zu achten, dass die jeweiligen Sende- und Empfangs-topics andere sind!&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://mqtt.org Offizielle Homepage von MQTT, englisch]&lt;br /&gt;
* [http://www.hivemq.com/blog/mqtt-essentials-part-1-introducing-mqtt Sehr gute Einführung, englisch, sind 5 lesenswerte Teile]&lt;br /&gt;
* [https://www.heise.de/developer/artikel/MQTT-Protokoll-fuer-das-Internet-der-Dinge-2168152.html Ein Exkurs von Heise mit Beispielen, deutsch, sehr lesenswert]&lt;br /&gt;
* [http://www.mqttfx.org/ MQTT FX - ein sehr praktisches Analysetool]&lt;br /&gt;
* {{Link2Forum|Topic=69230|LinkText=Diskussionsthread im Forum}}&lt;br /&gt;
* {{Link2Forum|Topic=92888|LinkText=Thread, zur Entstehungsgeschichte von MQTT2_CLIENT}}&lt;br /&gt;
* {{Link2Forum|Topic=93255|LinkText=Ankündigungsthread zur MQTT2-Erweiterung der MQTT_GENERIC_BRIDGE}}&lt;br /&gt;
* [[MQTT_Einf%C3%BChrung_Teil_2|Teil 2 der MQTT Einführung]]: Detailaspekte (vorrangig zur Modulfamilie MQTT/MQTT_DEVICE)&lt;br /&gt;
* [[MQTT Einführung Teil 3|Teil 3 der MQTT Einführung]]: Arduino-Client selbst programmieren&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT|Einführung]]&lt;br /&gt;
[[Kategorie:MQTT| ]]&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT&amp;diff=33376</id>
		<title>MQTT</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT&amp;diff=33376"/>
		<updated>2020-06-11T11:41:03Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* OpenMQTTGateway hinzugefügt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MQTT ist ein Protokoll (&amp;quot;Message Queue Telemetry Transport&amp;quot;), mit dem Daten und Befehle zwischen verschiedenen Geräten ausgetauscht werden. Die Kommunikation erfolgt dabei über einen zentralen MQTT-Server, in alter Nomenklatur auch &#039;&#039;Broker&#039;&#039; genannt.&lt;br /&gt;
&lt;br /&gt;
MQTT wurde entwickelt, um möglichst effizient, sicher und mit wenig Datenlast zu kommunizieren. MQTT ist nachrichtenorientiert, daher muss ein Client nicht beständig beim Server anfragen, ob neue Daten vorliegen. Heute findet sich MQTT vor allem im Bereich des &#039;&#039;Internet of Things&#039;&#039; (IoT). MQTT kann leicht mit FHEM verbunden werden, ohne dass dabei größerer CPU- oder Datenverbrauch entsteht. &lt;br /&gt;
&lt;br /&gt;
== Eine sehr kurze Einführung in MQTT ==&lt;br /&gt;
Die folgende Einführung kann eine vollwertige Einleitung wie beispielsweise [https://github.com/mqtt/mqtt.github.io/wiki diese Wikieinträge] nicht ersetzen. &lt;br /&gt;
&lt;br /&gt;
Bei MQTT findet die nachrichtenbasierte Kommunikation zwischen einzelnen Teilnehmern&amp;lt;ref&amp;gt;Teilnehmer in diesem Sinne kann ein Stück Hardware mit einer MQTT-fähigen firmware sein, ein auf einem Computer laufendes Script (einschließlich eines MQTT-Server-Dienstes wie &#039;&#039;mosquitto&#039;&#039; oder &#039;&#039;MQTT2_SERVER&#039;&#039;, kurz: alles mögliche sein. Dadurch kann auch ein einzelner Computer unter mehreren ClientID&#039;s am MQTT-Datenaustausch beteiligt sein.&amp;lt;/ref&amp;gt; in der Regel nicht direkt statt. Stattdessen werden alle Nachrichten von einem Teilnehmer an einen Serverdienst, den MQTT-Server (früher &#039;&#039;Broker&#039;&#039; genannt) übergeben, der dann dafür sorgt, dass die Nachricht an alle (berechtigten) anderen Teilnehmer verteilt wird, die sich für derartige Nachrichten &amp;quot;interessieren&amp;quot;. Wenn also ein Teilnehmer ohne Server-Funktion (Client) Daten von einem bestimmten anderen Teilnehmer (anderer Client) empfangen will, muss es vorher dem MQTT-Server (Broker) mitteilen, dass er die Nachrichten dieses anderen Teilnehmers abonniert (deshalb wird dieser Vorgang als &#039;&#039;subscribe&#039;&#039; bezeichnet). Im IoT ist besonders interessant, dass Sender und Empfänger von Nachrichten durch den MQTT-Server vollständig entkoppelt werden können - jemand, der Daten bereit stellt, muss sich also nicht darum kümmern, wer diese Daten empfängt&amp;lt;ref&amp;gt;Aufgrund dieser Funktionsweise sollte allerdings darauf geachtet werden, die Möglichkeiten des jeweiligen Servers zur Sicherung der Daten gegen unberechtigten Zugriff zu nutzen, insbesondere wenn die Art der Daten oder die sich hierdurch ergebenden Möglichkeiten, z.B. Schaltvorgänge in der realen Welt auszulösen, dies notwendig macht!&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht besteht im Wesentlichen aus den folgenden Elementen:&lt;br /&gt;
*ClientID -  das ist die Kennung des Senders einer Nachricht&amp;lt;ref&amp;gt;Diese kann sich bei der Weitergabe der Nachricht ändern: Zunächst sendet ein Client eine Nachricht unter seiner ClientID, der MQTT-Server wird diese dann in der Regel durch seine Kennung ersetzten, wenn er die Nachricht an einen Abonnenten - der auch ein weiterer MQTT-Server sein kann - weitergibt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
*Topic - das ist die Adresse, an die eine Nachricht gesendet wird, bzw. von wo sie abgeholt werden kann (so ähnlich wie ein Postfach in der realen Welt). Topics sind einfache Strings, die mit Schrägstrichen getrennt werden (keine Leerzeichen und nur sehr wenige Sonderzeichen erlaubt). Ein Topic könnte beispielhaft so lauten: &amp;lt;code&amp;gt;zuHause/1OG/Kueche/Licht/state&amp;lt;/code&amp;gt;. Diese Topics beinhalten also eine Hierarchie der Objekte - hier im Beispiel sind sie zuerst danach sortiert, ob sie sich zu Haus befinden, dann wird nach Stockwerken sortiert und im ersten Stock schaut man auf die Küche sowie das dort vorhandene Licht.  &lt;br /&gt;
*Payload - das ist der Inhalt der Nachricht, oft handelt es sich um Befehle oder Daten.&lt;br /&gt;
*Quality of Service - soll geprüft werden, ob die Nachricht zugestellt wurde und wenn ja, mit welcher &amp;quot;Tiefe&amp;quot;?&lt;br /&gt;
*Retained Message. &lt;br /&gt;
Details bitte in der oben genannten Einführung nachlesen.&lt;br /&gt;
&lt;br /&gt;
MQTT kommuniziert üblicherweise über Port 1883, es können aber unter derselben Netzwerkadresse an unterschiedlichen Ports auch mehrere Serverdienste bereitstehen. &lt;br /&gt;
&lt;br /&gt;
== Installation in FHEM ==&lt;br /&gt;
Um MQTT in FHEM zu nutzen, benötigt man (mindestens) einen MQTT-Server.  Es gibt zwei Möglichkeiten: Man kann FHEM-externe Server-Software (oder auch einen oder mehrere im Internet bereitstehende MQTT-Server) verwenden oder man kann die MQTT-Serverkomponente aktivieren, die mit {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} in FHEM direkt bereitsteht. Hier werden kurz beide Installationswege erläutert, zwingend ist nur einer, da eben mindestens ein MQTT-Serverdienst aktiv sein muß.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Schaubilder zeigen schematisch die in FHEM zur Verfügung stehenden Wege der Einbindung von Hard- und/oder Softwarekomponenten, die über das MQTT-Protokoll Daten austauschen.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:Mqtt2 server.png|Datenaustausch mit MQTT-Geräten, wenn MQTT2_SERVER als internem MQTT-Serverdienst verwendet wird&lt;br /&gt;
Datei:Mqtt2 client v extern server.png|Datenaustausch mit MQTT-Geräten, wenn MQTT2_CLIENT iVm. mosquitto als externem MQTT-Serverdienst verwendet wird&lt;br /&gt;
Datei:00 mqtt pm.png|Datenaustausch mit MQTT-Geräten, wenn das Modul &#039;&#039;MQTT&#039;&#039; (00_MQTT.pm) iVm. mosquitto als externem MQTT-Serverdienst verwendet wird&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
=== FHEM als MQTT-Server ===&lt;br /&gt;
Die mit dem Modul {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} bereitstehende Serverkomponente kann z.B. wie folgt aktiviert werden:&lt;br /&gt;
 defmod myBroker MQTT2_SERVER 1883 global&lt;br /&gt;
Dieses [[Gerät]] übernimmt dann die Kommunikation mit den externen Clients (und wird von diesen behandelt, wie jeder andere MQTT-Server auch&amp;lt;ref&amp;gt;Bitte beachten Sie, dass (Stand: Juni 2019) MQTT2_SERVER nicht alle features des MQTT-Protokolls unterstützt.&amp;lt;/ref&amp;gt;) und verteilt die eingehenden Nachrichten als IO-Device&amp;lt;ref&amp;gt;im Sinne des [[DevelopmentModuleIntro#Zweistufiges Modell für Module|2-stufigen Modulkonzepts]]&amp;lt;/ref&amp;gt; für die Client-Module [[MQTT2_DEVICE]]&amp;lt;ref&amp;gt;Die Zahl 2 in den Modulnamen verweist nur darauf, dass es sich um eine neuere Modulfamilie handelt; die Kommunikation mit den externen Komponenten unterscheidet sich nicht zu den älteren Modulen, die vor dem Jahr 2018 genutzt werden konnten.&amp;lt;/ref&amp;gt; und {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=de|Label=MQTT_GENERIC_BRIDGE}}.&lt;br /&gt;
Ein weiterer Vorteil dieser Lösung besteht darin, dass man ein MQTT2_SERVER-Device mit Hilfe von [[allowed]] absichern kann, was auch SSL-verschlüsselte Kommunikation ermöglicht. &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; In diesem Fall muss User bzw. Passwort auch in den entsprechenden Geräten eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Wenn Sie beabsichtigen, diese Variante zu verwenden, sollten Sie als nächstes die [[MQTT2-Module - Praxisbeispiele|Praxisbeispiele zu den MQTT2-Modulen]] lesen, und ggf. später wieder hierher zurückkehren. Dort findet sich auch ein Abschnitt zu dem auf den Grafiken zu den MQTT2-IO-Modulen enthaltenen [[MQTT2-Module_-_Praxisbeispiele#bridgeRegexp|bridgeRegexp]]-Attribut.}}&lt;br /&gt;
&lt;br /&gt;
=== FHEM-externer Broker ===&lt;br /&gt;
==== Beispiel: mosquitto ====&lt;br /&gt;
Eine gern verwendete MQTT-Server-Software ist [http://mosquitto.org Mosquitto]. Sie kann ohne weiteres auf dem Raspberry Pi, der bereits eine FHEM-Installation besitzt, installiert werden und wird keine größere CPU- oder Netzwerklast verursachen. &lt;br /&gt;
&lt;br /&gt;
Eine Anleitung zur Installation findet sich beispielsweise in diesem [http://blog.wenzlaff.de/?p=6487 Blogeintrag]. Im wesentlichen beschränkt sich die Installation eines MQTT Servers aber auf wenige Arbeitsschritte. Bei &#039;&#039;stretch&#039;&#039; ist &#039;&#039;Mosquitto&#039;&#039; bereits in der Distribution enthalten und kann - zusammen mit dem client Befehl &#039;&#039;mosquito_sub&#039;&#039;, der weiter unten benötigt wird, wie folgt installiert und getestet werden&amp;lt;ref&amp;gt;Die für den Betrieb mit FHEM erforderlichen Perl-Module sind teilweise (noch) nicht in den Paketquellen verfügbar. Sie können dennoch statt mit cpan auch als Debian-Paket mit Hilfe von &#039;&#039;dh-make-perl&#039;&#039; installiert werden, wobei vorab das in den Paketquellen bereits vorhandene &#039;&#039;libmodule-pluggable-perl&#039;&#039; installiert werden sollte:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install dh-make-perl&amp;lt;br&amp;gt;&lt;br /&gt;
dh-make-perl --install --cpan Net::MQTT::simple&amp;lt;br&amp;gt;&lt;br /&gt;
dh-make-perl --install --cpan Net::MQTT::Constants&amp;lt;br&amp;gt;&lt;br /&gt;
sudo dpkg -i libnet-mqtt-simple-perl*.deb&amp;lt;br&amp;gt;&lt;br /&gt;
sudo dpkg -i libnet-mqtt-perl*.deb&amp;lt;/code&amp;gt;&amp;lt;/ref&amp;gt;:&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Für ältere Distributionen (hier am Beispiel von &#039;&#039;jessie&#039;&#039;) muß ggf. aus einer zusätzlichen Paketquelle installiert werden:&lt;br /&gt;
 wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key&lt;br /&gt;
 sudo apt-key add mosquitto-repo.gpg.key&lt;br /&gt;
 cd /etc/apt/sources.list.d/&lt;br /&gt;
 sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
Danach kann die eigentliche Installation durchgeführt werden wie links für &#039;&#039;stretch&#039;&#039; beschrieben.}}&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  sudo apt-get install mosquitto mosquitto-clients&lt;br /&gt;
 &lt;br /&gt;
 # MQTT Server Test&lt;br /&gt;
 sudo service mosquitto status&lt;br /&gt;
&lt;br /&gt;
 # Start / Stop des Servers&lt;br /&gt;
 sudo service mosquitto stop&lt;br /&gt;
 sudo service mosquitto start&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Danach ist der RPi mit &amp;lt;nowiki&amp;gt;shutdown restart&amp;lt;/nowiki&amp;gt; neu zu starten. &lt;br /&gt;
&lt;br /&gt;
==== IO-Module für externe MQTT-Server ====&lt;br /&gt;
Damit FHEM mit dem MQTT-Server kommuniziert, muss noch ein IO-Device angelegt werden. Dabei stehen zwei Varianten zur Wahl, das Modul [[MQTT (Modul)|MQTT]] oder seit Ende 2018 [[MQTT2_CLIENT]].&lt;br /&gt;
&lt;br /&gt;
Beide Module können auch dazu genutzt werden, um Daten zwischen zwei FHEM-Installationen auszutauschen, insbesondere kann auch 00_MQTT.pm als Client für einen MQTT2_SERVER eingesetzt werden, der &#039;&#039;&#039;auf der anderen Installation&#039;&#039;&#039; als MQTT-Serverdienst eingerichtet ist. Darüber hinaus bestehen eine Vielzahl von Kombinationsmöglichkeiten der diversen IO-Module, wenn die Installation auf mehrere Server verteilt ist.&lt;br /&gt;
Auf einer FHEM-Installation wird jedoch in der Regel nur eines der IO-Module benötigt. &lt;br /&gt;
&lt;br /&gt;
===== MQTT2_CLIENT =====&lt;br /&gt;
Ein MQTT2_CLIENT-IO-Device wird z.B. angelegt mit&lt;br /&gt;
 define myBroker MQTT2_CLIENT 10.0.0.5:1883 ## bitte EIGENE IP-Adresse eintragen&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Wenn Sie beabsichtigen, MQTT2_CLIENT zu verwenden, sollten Sie zuerst die [[MQTT2-Module - Praxisbeispiele|Praxisbeispiele zu den MQTT2-Modulen]] lesen, und dabei die Hinweise im Artikel [[MQTT2_CLIENT]] beachten.}}&lt;br /&gt;
&lt;br /&gt;
Ein MQTT2_CLIENT-Device kann ebenfals mit Hilfe von [[allowed]] abgesichert werden, um z.B. SSL-verschlüsselte Kommunikation zu ermöglichem. Client-Module zu diesem IO-Typ sind wiederum [[MQTT2_DEVICE]] und {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=de|Label=MQTT_GENERIC_BRIDGE}}.&lt;br /&gt;
&lt;br /&gt;
===== MQTT (Modul) ===== &lt;br /&gt;
Vorab werden für diese Variante weitere Perl-Pakete benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 # Perl Version ausgeben&lt;br /&gt;
 perl -v&lt;br /&gt;
 # Perl MQTT Module nachinstallieren (läuft ein paar Minuten)&lt;br /&gt;
 sudo cpan install Net::MQTT:Simple&lt;br /&gt;
 sudo cpan install Net::MQTT:Constants&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein IO-Device des Typs MQTT wird z.B. angelegt mit&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Sofern der Broker mit FHEM über localhost kommuniziert, kann als IP 127.0.0.1 verwendet werden.}}&lt;br /&gt;
 define myBroker MQTT 10.0.0.5:1883 ## bitte EIGENE IP-Adresse eintragen&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Außerhalb der offiziellen Quellen sind auch einige ältere Varianten des Moduls MQTT_DEVICE verfügbar, die jeweils spezielle Anforderungen (z.B. für Zigbee2mqtt) separat abbilden. Diese werden hier nicht gesondert behandelt, da solche Sonderfälle heute generischer und einfacher durch den Einsatz von MQTT2_DEVICE abzubilden sind.}}Client-Device-Module zum Modul [[MQTT (Modul)|MQTT]] sind [[MQTT_DEVICE]], {{Link2CmdRef|Anker=MQTT_BRIDGE|Lang=de|Label=MQTT_BRIDGE}} (veraltet) und {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=de|Label=MQTT_GENERIC_BRIDGE}}. Da &#039;&#039;MQTT_DEVICE&#039;&#039; payload im JSON-Format (im Unterschied zu MQTT2_DEVICE) nicht selbst verarbeiten kann wird hier zusätzlich das Modul {{Link2CmdRef|Anker=expandJSON|Lang=de|Label=expandJSON}} benötigt, um den {{Link2Forum|Topic=66761|LinkText=JSON String auszuwerten}}.&lt;br /&gt;
&lt;br /&gt;
=== Performancefragen... ===&lt;br /&gt;
...oder was sollte man als Lösung wählen, wenn man in die MQTT-Welt einsteigt&amp;lt;ref&amp;gt;vgl. hierzu diesen {{Link2Forum|Topic=94768|Message=875714|LinkText=Beitrag}} von Rudolf König&amp;lt;/ref&amp;gt;?&lt;br /&gt;
Grundsätzlich sollte man davon ausgehen, dass innerhalb von FHEM die Verarbeitung derselben Daten näherungsweise denselben Aufwand bedeuten, unabhängig davon, welche der Implementierungen (&#039;&#039;MQTT2_CLIENT&#039;&#039;, &#039;&#039;MQTT&#039;&#039; oder &#039;&#039;MQTT2_SERVER&#039;&#039;) man konkret wählt.&lt;br /&gt;
Ein externer Broker hat daher vor allem dann Vorteile, wenn die MQTT Daten überwiegend für was anderes (nicht FHEM) verwendet werden, oder MQTT zweckentfremdet wird (wie z.Bsp. für Musikübertragung). Nutzt man das MQTT-Protokoll dagegen vorwiegend innerhalb von FHEM, ist eher der Einsatz von MQTT2_SERVER in Betracht zu ziehen. Dieser soll Anfängern die Anbindung von MQTT Geräten in FHEM einfacher machen. Wer später merkt, dass er doch einen externen Broker benötigt, kann dann immer noch auf MQTT2_CLIENT in Verbindung mit einem anderen Broker wechseln.&lt;br /&gt;
Dagegen ist der Weg von MQTT_DEVICE zu MQTT2_DEVICE mit erheblich mehr Aufwand verbunden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation zu sonstigen FHEM-Geräten über MQTT  ===&lt;br /&gt;
&lt;br /&gt;
Möchte man Daten von einem [[Gerät]] (im FHEM-Sinn), das &#039;&#039;&#039;nicht&#039;&#039;&#039; vom Typ &#039;&#039;MQTT2_DEVICE&#039;&#039; oder &#039;&#039;MQTT_DEVICE&#039;&#039; (je nach IO-Modul) ist, per MQTT-Protokoll versenden (z.B. für eine andere Visualisierungslösung als FHEMWEB, oder als FHEM2FHEM-Ersatzlösung), oder diese sonstigen Geräte über MQTT-Anweisungen von außen steuern können, hat man mehrere Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
==== MQTT_GENERIC_BRIDGE ====&lt;br /&gt;
Das Modul {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=en|Label=MQTT_GENERIC_BRIDGE}} ermöglicht es, sein jeweiliges IO-Modul-Gerät zu nutzen, um diesen Kommunikationsweg für beliebig viele andere FHEM-Geräte bereitzustellen. Dabei erfolgt am MQTT_GENERIC_BRIDGE-Gerät selbst nur eine Basiskonfiguration, im Übrigen durch Attribute an dem jeweiligen Gerät selbst. So kann z.B. ein Aktor des Typs [[CUL_HM]] an- oder ausgeschaltet werden oder auch einfach nur seinen aktuellen Schaltzustand per MQTT-Protokoll publizieren.&lt;br /&gt;
 &lt;br /&gt;
Dieses Modul kann seit November 2018 mit allen drei IO-Modul-Varianten zusammen eingesetzt werden, also sowohl mit &#039;&#039;MQTT2_SERVER&#039;&#039; bzw. &#039;&#039;MQTT2_CLIENT&#039;&#039; oder &#039;&#039;MQTT&#039;&#039; (00_MQTT.pm). &lt;br /&gt;
&lt;br /&gt;
Dabei sollte man jedoch beachten, dass zur Verwendung mit den MQTT2-IO&#039;s unbedingt die autocreate-Funktion des betreffenden IOs ausgeschaltet wird und dies auch bleibt&amp;lt;ref&amp;gt;siehe dazu diesen {{Link2Forum|Topic=95341|LinkText=Thread}} zu den technischen Hintergründen&amp;lt;/ref&amp;gt;! Weiter wird das Perl-Modul &#039;&#039;libmodule-pluggable-perl&#039;&#039; benötigt&amp;lt;ref&amp;gt;Dieses kann über &amp;lt;code&amp;gt;apt-get install libmodule-pluggable-perl&amp;lt;/code&amp;gt; installiert werden&amp;lt;/ref&amp;gt;, damit im Hintergrund auch das Modul [[MQTT (Modul)|MQTT]] geladen werden kann. Damit gelten auch für diesen Modul die Installationsvoraussetzungen für [[MQTT#MQTT_.28Modul.29|MQTT]]!&lt;br /&gt;
&lt;br /&gt;
Anwendungsfälle und -beispiele für das Modul sind diesem {{Link2Forum|Topic=91642|LinkText=Thread}} zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
==== MQTT_BRIDGE ====&lt;br /&gt;
Dieses Modul kann nur zusammen mit einem IO-Gerät des Typs [[MQTT (Modul)|MQTT]] verwendet werden. Dabei wird pro weiterzuleitendem anderen FHEM-Gerät eine eigene Instanz dieses Moduls verwendet. Auf den Einsatz dieser Option sollte in neuen Installationen zugunsten von &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039; verzichtet werden.&lt;br /&gt;
&lt;br /&gt;
==== Per publish-Befehl am IO-Gerät ====&lt;br /&gt;
Alle drei IO-Module kennen direkte &#039;&#039;publish&#039;&#039;-Anweisungen, mit deren Hilfe beliebige &#039;&#039;payloads&#039;&#039; an beliebige &#039;&#039;topics&#039;&#039; gesendet werden können. Dies kann man z.B. in einem [[notify]] oder [[at]] nutzen, um einzelne Events zu publishen oder Werteanfragen abzusetzen.&lt;br /&gt;
&lt;br /&gt;
Hier eine regelmäßige Werteabfrage auf einen [[EBUS-MQTT2|ebus]]:&lt;br /&gt;
 defmod get_ebus_updates at +*00:15:00 set ebusMQTT publish ebusd/430/Hc1HeatCurve/get;&lt;br /&gt;
 set ebusMQTT publish ebusd/430/HwcTempDesired/get;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RAW-Events am IO-Gerät (MQTT2.*) ====&lt;br /&gt;
Bei beiden MQTT2-IO-Modulen (MQTT2_SERVER und MQTT2_CLIENT) kann per [[Regulärer Ausdruck|regulärem Ausdruck]] festgelegt werden, welche Nachrichten ein Event erzeugen sollen, auf das dann wieder z.B. mit einem [[notify]] reagiert werden kann, z.B. um beliebige Schaltaktionen auszulösen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT-Clients (Beispiele) ==&lt;br /&gt;
&lt;br /&gt;
===Arduino-library===&lt;br /&gt;
Zur Kommunikation mit dem Broker von Seiten eines [[Arduino|Arduinos]] mit selbst erstellten Sketches böte sich der PubSubClient an.&lt;br /&gt;
&lt;br /&gt;
===PC-Software===&lt;br /&gt;
Um die Funktionalität des Brokers zu testen kann z.B. ein Analyse-Tool wie MQTT.fx verwendet werden, oder die im Paket &#039;&#039;mosquitto-clients&#039;&#039; enthaltenen Linux-Kommandozeilen-Programme &#039;&#039;mosquitto_sub&#039;&#039; und &#039;&#039;mosquitto_pub&#039;&#039;. Letzterer könnte z.E. auch aus beliebigen &#039;&#039;shell-scripten&#039;&#039; heraus aufgerufen werden. Als Perl-Bibliothek steht alternativ z.B. [https://metacpan.org/pod/distribution/AnyEvent-MQTT/bin/anyevent-mqtt-pub anyevent-mqtt-pub] zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== Tasmota ===&lt;br /&gt;
Eine derzeit oft genutzte Möglichkeit für MQTT bilden die [[Sonoff]]-Geräte und weitere [[ESP8266]]-basierte Hardware, die unter vielen Handelsnamen erhältlich sind. Werden diese mit Tasmota (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) geflasht, so kommunizieren sie über MQTT. Um diese Geräte einzubinden, ist wie folgt vorzugehen. Zuerst ist ein Serverdienst (Broker) bereitzustellen, wie oben beschrieben.&lt;br /&gt;
&lt;br /&gt;
Unter Sonoff sind einige Topics voreingestellt. arendst stellt insbesondere drei Topic-Präfixe bereit, die seiner Meinung jedes Topic einleiten sollen (in den Eingabemasken als &amp;quot;%prefix%&amp;quot; notiert). Das sind einmal Kommandos (abgekürzt als cmnd), die dazu dienen, Befehle auszuführen. Daten werden mit tele und stat übertragen. Ein Topic besteht dann zuerst aus diesem Präfix und danach dem eigentlichen Topic. Wer also beispielsweise einem Sonoff_Switch einen Befehl senden will, sollte als Topic cmnd/Sonoff_Switch wählen. Wenn der Switch ein- und ausgeschaltet werden kann, muss der Topic noch das Wort POWER enthalten (in MQTT werden viele Kennworte komplett groß geschrieben). Der Topic lautet damit vollständig &amp;quot;cmnd/Sonoff_Switch/POWER/set&amp;quot; &lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Dabei ist darauf zu achten, dass für den Parameter &#039;&#039;topic = %topic% (sonoff)&#039;&#039; statt &#039;&#039;sonoff&#039;&#039; ein gerätespezifischer eigener Name eingetragen wird. Hierzu kann man z.B. auch die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; verwenden, indem man die unter &#039;&#039;client (DVES_8BABA9)&#039;&#039; zu findende Angabe kopiert. Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
&lt;br /&gt;
Link zum Forum: {{Link2Forum|Topic=27532|LinkText=MQTT FHEM Einrichtung}} (hier als &#039;&#039;MQTT_DEVICE&#039;&#039;!):&lt;br /&gt;
&lt;br /&gt;
 ### FHEM Device mit MQTT verbinden ###&lt;br /&gt;
 define Sonoff_Switch MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_Switch IODev myBroker&lt;br /&gt;
 attr Sonoff_Switch devStateIcon ON:rc_GREEN:OFF OFF:rc_RED:ON&lt;br /&gt;
 attr Sonoff_Switch icon hue_filled_br30&lt;br /&gt;
 attr Sonoff_Switch publishSet ON OFF cmnd/TestSwitch/POWER&lt;br /&gt;
 attr Sonoff_Switch room MQTT&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Licht stat/Sonoff_Switch/POWER&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Sensor tele/Sonoff_Switch/SENSOR&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Status stat/Sonoff_Switch/STATUS&lt;br /&gt;
 attr Sonoff_Switch webCmd ON:OFF&lt;br /&gt;
&lt;br /&gt;
Der hier dargestellte Beispielcode realisiert die Kommunikation zwischen FHEM und dem sonoff Modul via MQTT Broker. Zu beachten ist hier, dass &#039;&#039;&#039;subscribeReading_Licht&#039;&#039;&#039; und &#039;&#039;&#039;subscribeReading_Status&#039;&#039;&#039; unterschiedliche Syntax des Topic Strings haben!&lt;br /&gt;
&lt;br /&gt;
=== OpenMQTTGateway ===&lt;br /&gt;
Um verschiedene Systeme wie BLE usw. auf MQTT zu bringen bietet sich OpenMQTTGateway an.&lt;br /&gt;
&lt;br /&gt;
Ich habe es für BLE kompiliert und auf einem ESP32 installiert. Hierzu braucht man nur das blanke Board ohne Zusatzhardware.&lt;br /&gt;
&lt;br /&gt;
Weiter infos hier: [https://github.com/1technophile/OpenMQTTGateway]&lt;br /&gt;
&lt;br /&gt;
In FHEM wird das ganze über den eigenen Broker oder einen extern Broker (z.B.: Mosquitto) eingebunden.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich legt ihr noch ein Device hierzu an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define MQTT2_OMG1 MQTT2_DEVICE&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich habe es noch in den Raum MQTT2 geschoben.&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;set MQTT2_OMG1 attrTemplate OpenMQTTGateway_MCU&amp;lt;/code&amp;gt; wird das Template festgelegt.&lt;br /&gt;
&lt;br /&gt;
== Sicherheit ==&lt;br /&gt;
Prinzipiell ist MQTT ebenso sicher wie eine Postkarte. Solange man es nicht extra absichert, kann jeder der, im eigenen LAN ist (und die Adresse vom Broker kennt) alle Topics mitlesen.&lt;br /&gt;
:&amp;lt;code&amp;gt;meinHaus/Flur/Haustuer:open / close&amp;lt;/code&amp;gt;&lt;br /&gt;
bietet unter diesen Umständen reichlich Raum für Verbesserungen! &lt;br /&gt;
&lt;br /&gt;
Abhilfe:&lt;br /&gt;
=== Username / Passwort ===&lt;br /&gt;
Zunächst kann man erst mal einen Username / Passwort vergeben, was alle IO-Device-Module unterstützen. Da ist zwar auch noch lange nicht sicher, aber zumindest steigert es den Aufwand schon mal. Jetzt muss man zumindest schon mal Pakete sniffen und verstehen, um unbefugt zu lesen oder gar zu publishen.&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
Um wirklich sicher zu werden, führt kein Weg an TLS vorbei. &lt;br /&gt;
&lt;br /&gt;
Der MQTT-Client in [[#Tasmota|Tasmota]] (für ESP8266) kann mit TLS betrieben werden, vgl. [https://github.com/arendst/Tasmota/wiki/TLS Beschreibung im Tasmota-Wiki].&lt;br /&gt;
&lt;br /&gt;
Leider kann z.B. ein Arduino das schlicht nicht mehr, da die einfacheren Modelle nicht über ausreichend Speicher und die Rechenleistung verfügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;(Hier fehlt eine Anleitung für allowed usw.)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
=== Anweisung und Ergebnis weichen voneinander ab ===&lt;br /&gt;
In der Regel melden MQTT-fähige Geräte entweder den Erhalt einer Nachricht zurück oder den Status nach Durchführung der in der &#039;&#039;payload&#039;&#039; enthaltenen Anweisung. Dabei findet aber in der Regel beim Empfänger eine Verarbeitung der Nachricht statt, ggf. wird diese auch weitergesendet und nochmals verarbeitet, bevor dann ggf. eine Rückmeldung des neuen Status an den MQTT-Server erfolgt. Handelt es sich um einfache on/off-Befehle, bleibt Anweisung und Ergebnis in der Regel identisch. Bei anderen, namentlich bei Dimmer-Werten, kann es zu Rundungsdifferenzen bei nummerischen Werten kommen. So kann z.B. ein Dimm-Wert von 70% gesetzt werden, zürückgemeldet wird dann aber 72% (oder 67%). &lt;br /&gt;
Dies ist technisch bedingt, vermeiden kann das jedoch in aller Regel nur der Autor der jeweiligen software/firmware auf dem &amp;quot;rechnenden&amp;quot; Gerät.&lt;br /&gt;
&lt;br /&gt;
=== Unbeabsichtigte Schleifen ===&lt;br /&gt;
Durch Fehler in der topic-Struktur können unbeabsichtigte Schleifen entstehen, die FHEM komplett blockieren können. Es ist unbedingt darauf zu achten, dass die jeweiligen Sende- und Empfangs-topics andere sind!&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://mqtt.org Offizielle Homepage von MQTT, englisch]&lt;br /&gt;
* [http://www.hivemq.com/blog/mqtt-essentials-part-1-introducing-mqtt Sehr gute Einführung, englisch, sind 5 lesenswerte Teile]&lt;br /&gt;
* [https://www.heise.de/developer/artikel/MQTT-Protokoll-fuer-das-Internet-der-Dinge-2168152.html Ein Exkurs von Heise mit Beispielen, deutsch, sehr lesenswert]&lt;br /&gt;
* [http://www.mqttfx.org/ MQTT FX - ein sehr praktisches Analysetool]&lt;br /&gt;
* {{Link2Forum|Topic=69230|LinkText=Diskussionsthread im Forum}}&lt;br /&gt;
* {{Link2Forum|Topic=92888|LinkText=Thread, zur Entstehungsgeschichte von MQTT2_CLIENT}}&lt;br /&gt;
* {{Link2Forum|Topic=93255|LinkText=Ankündigungsthread zur MQTT2-Erweiterung der MQTT_GENERIC_BRIDGE}}&lt;br /&gt;
* [[MQTT_Einf%C3%BChrung_Teil_2|Teil 2 der MQTT Einführung]]: Detailaspekte (vorrangig zur Modulfamilie MQTT/MQTT_DEVICE)&lt;br /&gt;
* [[MQTT Einführung Teil 3|Teil 3 der MQTT Einführung]]: Arduino-Client selbst programmieren&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT|Einführung]]&lt;br /&gt;
[[Kategorie:MQTT| ]]&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT&amp;diff=33375</id>
		<title>MQTT</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT&amp;diff=33375"/>
		<updated>2020-06-11T11:35:07Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Openmqttgateway angelegt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MQTT ist ein Protokoll (&amp;quot;Message Queue Telemetry Transport&amp;quot;), mit dem Daten und Befehle zwischen verschiedenen Geräten ausgetauscht werden. Die Kommunikation erfolgt dabei über einen zentralen MQTT-Server, in alter Nomenklatur auch &#039;&#039;Broker&#039;&#039; genannt.&lt;br /&gt;
&lt;br /&gt;
MQTT wurde entwickelt, um möglichst effizient, sicher und mit wenig Datenlast zu kommunizieren. MQTT ist nachrichtenorientiert, daher muss ein Client nicht beständig beim Server anfragen, ob neue Daten vorliegen. Heute findet sich MQTT vor allem im Bereich des &#039;&#039;Internet of Things&#039;&#039; (IoT). MQTT kann leicht mit FHEM verbunden werden, ohne dass dabei größerer CPU- oder Datenverbrauch entsteht. &lt;br /&gt;
&lt;br /&gt;
== Eine sehr kurze Einführung in MQTT ==&lt;br /&gt;
Die folgende Einführung kann eine vollwertige Einleitung wie beispielsweise [https://github.com/mqtt/mqtt.github.io/wiki diese Wikieinträge] nicht ersetzen. &lt;br /&gt;
&lt;br /&gt;
Bei MQTT findet die nachrichtenbasierte Kommunikation zwischen einzelnen Teilnehmern&amp;lt;ref&amp;gt;Teilnehmer in diesem Sinne kann ein Stück Hardware mit einer MQTT-fähigen firmware sein, ein auf einem Computer laufendes Script (einschließlich eines MQTT-Server-Dienstes wie &#039;&#039;mosquitto&#039;&#039; oder &#039;&#039;MQTT2_SERVER&#039;&#039;, kurz: alles mögliche sein. Dadurch kann auch ein einzelner Computer unter mehreren ClientID&#039;s am MQTT-Datenaustausch beteiligt sein.&amp;lt;/ref&amp;gt; in der Regel nicht direkt statt. Stattdessen werden alle Nachrichten von einem Teilnehmer an einen Serverdienst, den MQTT-Server (früher &#039;&#039;Broker&#039;&#039; genannt) übergeben, der dann dafür sorgt, dass die Nachricht an alle (berechtigten) anderen Teilnehmer verteilt wird, die sich für derartige Nachrichten &amp;quot;interessieren&amp;quot;. Wenn also ein Teilnehmer ohne Server-Funktion (Client) Daten von einem bestimmten anderen Teilnehmer (anderer Client) empfangen will, muss es vorher dem MQTT-Server (Broker) mitteilen, dass er die Nachrichten dieses anderen Teilnehmers abonniert (deshalb wird dieser Vorgang als &#039;&#039;subscribe&#039;&#039; bezeichnet). Im IoT ist besonders interessant, dass Sender und Empfänger von Nachrichten durch den MQTT-Server vollständig entkoppelt werden können - jemand, der Daten bereit stellt, muss sich also nicht darum kümmern, wer diese Daten empfängt&amp;lt;ref&amp;gt;Aufgrund dieser Funktionsweise sollte allerdings darauf geachtet werden, die Möglichkeiten des jeweiligen Servers zur Sicherung der Daten gegen unberechtigten Zugriff zu nutzen, insbesondere wenn die Art der Daten oder die sich hierdurch ergebenden Möglichkeiten, z.B. Schaltvorgänge in der realen Welt auszulösen, dies notwendig macht!&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht besteht im Wesentlichen aus den folgenden Elementen:&lt;br /&gt;
*ClientID -  das ist die Kennung des Senders einer Nachricht&amp;lt;ref&amp;gt;Diese kann sich bei der Weitergabe der Nachricht ändern: Zunächst sendet ein Client eine Nachricht unter seiner ClientID, der MQTT-Server wird diese dann in der Regel durch seine Kennung ersetzten, wenn er die Nachricht an einen Abonnenten - der auch ein weiterer MQTT-Server sein kann - weitergibt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
*Topic - das ist die Adresse, an die eine Nachricht gesendet wird, bzw. von wo sie abgeholt werden kann (so ähnlich wie ein Postfach in der realen Welt). Topics sind einfache Strings, die mit Schrägstrichen getrennt werden (keine Leerzeichen und nur sehr wenige Sonderzeichen erlaubt). Ein Topic könnte beispielhaft so lauten: &amp;lt;code&amp;gt;zuHause/1OG/Kueche/Licht/state&amp;lt;/code&amp;gt;. Diese Topics beinhalten also eine Hierarchie der Objekte - hier im Beispiel sind sie zuerst danach sortiert, ob sie sich zu Haus befinden, dann wird nach Stockwerken sortiert und im ersten Stock schaut man auf die Küche sowie das dort vorhandene Licht.  &lt;br /&gt;
*Payload - das ist der Inhalt der Nachricht, oft handelt es sich um Befehle oder Daten.&lt;br /&gt;
*Quality of Service - soll geprüft werden, ob die Nachricht zugestellt wurde und wenn ja, mit welcher &amp;quot;Tiefe&amp;quot;?&lt;br /&gt;
*Retained Message. &lt;br /&gt;
Details bitte in der oben genannten Einführung nachlesen.&lt;br /&gt;
&lt;br /&gt;
MQTT kommuniziert üblicherweise über Port 1883, es können aber unter derselben Netzwerkadresse an unterschiedlichen Ports auch mehrere Serverdienste bereitstehen. &lt;br /&gt;
&lt;br /&gt;
== Installation in FHEM ==&lt;br /&gt;
Um MQTT in FHEM zu nutzen, benötigt man (mindestens) einen MQTT-Server.  Es gibt zwei Möglichkeiten: Man kann FHEM-externe Server-Software (oder auch einen oder mehrere im Internet bereitstehende MQTT-Server) verwenden oder man kann die MQTT-Serverkomponente aktivieren, die mit {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} in FHEM direkt bereitsteht. Hier werden kurz beide Installationswege erläutert, zwingend ist nur einer, da eben mindestens ein MQTT-Serverdienst aktiv sein muß.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Schaubilder zeigen schematisch die in FHEM zur Verfügung stehenden Wege der Einbindung von Hard- und/oder Softwarekomponenten, die über das MQTT-Protokoll Daten austauschen.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:Mqtt2 server.png|Datenaustausch mit MQTT-Geräten, wenn MQTT2_SERVER als internem MQTT-Serverdienst verwendet wird&lt;br /&gt;
Datei:Mqtt2 client v extern server.png|Datenaustausch mit MQTT-Geräten, wenn MQTT2_CLIENT iVm. mosquitto als externem MQTT-Serverdienst verwendet wird&lt;br /&gt;
Datei:00 mqtt pm.png|Datenaustausch mit MQTT-Geräten, wenn das Modul &#039;&#039;MQTT&#039;&#039; (00_MQTT.pm) iVm. mosquitto als externem MQTT-Serverdienst verwendet wird&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
=== FHEM als MQTT-Server ===&lt;br /&gt;
Die mit dem Modul {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} bereitstehende Serverkomponente kann z.B. wie folgt aktiviert werden:&lt;br /&gt;
 defmod myBroker MQTT2_SERVER 1883 global&lt;br /&gt;
Dieses [[Gerät]] übernimmt dann die Kommunikation mit den externen Clients (und wird von diesen behandelt, wie jeder andere MQTT-Server auch&amp;lt;ref&amp;gt;Bitte beachten Sie, dass (Stand: Juni 2019) MQTT2_SERVER nicht alle features des MQTT-Protokolls unterstützt.&amp;lt;/ref&amp;gt;) und verteilt die eingehenden Nachrichten als IO-Device&amp;lt;ref&amp;gt;im Sinne des [[DevelopmentModuleIntro#Zweistufiges Modell für Module|2-stufigen Modulkonzepts]]&amp;lt;/ref&amp;gt; für die Client-Module [[MQTT2_DEVICE]]&amp;lt;ref&amp;gt;Die Zahl 2 in den Modulnamen verweist nur darauf, dass es sich um eine neuere Modulfamilie handelt; die Kommunikation mit den externen Komponenten unterscheidet sich nicht zu den älteren Modulen, die vor dem Jahr 2018 genutzt werden konnten.&amp;lt;/ref&amp;gt; und {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=de|Label=MQTT_GENERIC_BRIDGE}}.&lt;br /&gt;
Ein weiterer Vorteil dieser Lösung besteht darin, dass man ein MQTT2_SERVER-Device mit Hilfe von [[allowed]] absichern kann, was auch SSL-verschlüsselte Kommunikation ermöglicht. &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; In diesem Fall muss User bzw. Passwort auch in den entsprechenden Geräten eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Wenn Sie beabsichtigen, diese Variante zu verwenden, sollten Sie als nächstes die [[MQTT2-Module - Praxisbeispiele|Praxisbeispiele zu den MQTT2-Modulen]] lesen, und ggf. später wieder hierher zurückkehren. Dort findet sich auch ein Abschnitt zu dem auf den Grafiken zu den MQTT2-IO-Modulen enthaltenen [[MQTT2-Module_-_Praxisbeispiele#bridgeRegexp|bridgeRegexp]]-Attribut.}}&lt;br /&gt;
&lt;br /&gt;
=== FHEM-externer Broker ===&lt;br /&gt;
==== Beispiel: mosquitto ====&lt;br /&gt;
Eine gern verwendete MQTT-Server-Software ist [http://mosquitto.org Mosquitto]. Sie kann ohne weiteres auf dem Raspberry Pi, der bereits eine FHEM-Installation besitzt, installiert werden und wird keine größere CPU- oder Netzwerklast verursachen. &lt;br /&gt;
&lt;br /&gt;
Eine Anleitung zur Installation findet sich beispielsweise in diesem [http://blog.wenzlaff.de/?p=6487 Blogeintrag]. Im wesentlichen beschränkt sich die Installation eines MQTT Servers aber auf wenige Arbeitsschritte. Bei &#039;&#039;stretch&#039;&#039; ist &#039;&#039;Mosquitto&#039;&#039; bereits in der Distribution enthalten und kann - zusammen mit dem client Befehl &#039;&#039;mosquito_sub&#039;&#039;, der weiter unten benötigt wird, wie folgt installiert und getestet werden&amp;lt;ref&amp;gt;Die für den Betrieb mit FHEM erforderlichen Perl-Module sind teilweise (noch) nicht in den Paketquellen verfügbar. Sie können dennoch statt mit cpan auch als Debian-Paket mit Hilfe von &#039;&#039;dh-make-perl&#039;&#039; installiert werden, wobei vorab das in den Paketquellen bereits vorhandene &#039;&#039;libmodule-pluggable-perl&#039;&#039; installiert werden sollte:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install dh-make-perl&amp;lt;br&amp;gt;&lt;br /&gt;
dh-make-perl --install --cpan Net::MQTT::simple&amp;lt;br&amp;gt;&lt;br /&gt;
dh-make-perl --install --cpan Net::MQTT::Constants&amp;lt;br&amp;gt;&lt;br /&gt;
sudo dpkg -i libnet-mqtt-simple-perl*.deb&amp;lt;br&amp;gt;&lt;br /&gt;
sudo dpkg -i libnet-mqtt-perl*.deb&amp;lt;/code&amp;gt;&amp;lt;/ref&amp;gt;:&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Für ältere Distributionen (hier am Beispiel von &#039;&#039;jessie&#039;&#039;) muß ggf. aus einer zusätzlichen Paketquelle installiert werden:&lt;br /&gt;
 wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key&lt;br /&gt;
 sudo apt-key add mosquitto-repo.gpg.key&lt;br /&gt;
 cd /etc/apt/sources.list.d/&lt;br /&gt;
 sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
Danach kann die eigentliche Installation durchgeführt werden wie links für &#039;&#039;stretch&#039;&#039; beschrieben.}}&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  sudo apt-get install mosquitto mosquitto-clients&lt;br /&gt;
 &lt;br /&gt;
 # MQTT Server Test&lt;br /&gt;
 sudo service mosquitto status&lt;br /&gt;
&lt;br /&gt;
 # Start / Stop des Servers&lt;br /&gt;
 sudo service mosquitto stop&lt;br /&gt;
 sudo service mosquitto start&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Danach ist der RPi mit &amp;lt;nowiki&amp;gt;shutdown restart&amp;lt;/nowiki&amp;gt; neu zu starten. &lt;br /&gt;
&lt;br /&gt;
==== IO-Module für externe MQTT-Server ====&lt;br /&gt;
Damit FHEM mit dem MQTT-Server kommuniziert, muss noch ein IO-Device angelegt werden. Dabei stehen zwei Varianten zur Wahl, das Modul [[MQTT (Modul)|MQTT]] oder seit Ende 2018 [[MQTT2_CLIENT]].&lt;br /&gt;
&lt;br /&gt;
Beide Module können auch dazu genutzt werden, um Daten zwischen zwei FHEM-Installationen auszutauschen, insbesondere kann auch 00_MQTT.pm als Client für einen MQTT2_SERVER eingesetzt werden, der &#039;&#039;&#039;auf der anderen Installation&#039;&#039;&#039; als MQTT-Serverdienst eingerichtet ist. Darüber hinaus bestehen eine Vielzahl von Kombinationsmöglichkeiten der diversen IO-Module, wenn die Installation auf mehrere Server verteilt ist.&lt;br /&gt;
Auf einer FHEM-Installation wird jedoch in der Regel nur eines der IO-Module benötigt. &lt;br /&gt;
&lt;br /&gt;
===== MQTT2_CLIENT =====&lt;br /&gt;
Ein MQTT2_CLIENT-IO-Device wird z.B. angelegt mit&lt;br /&gt;
 define myBroker MQTT2_CLIENT 10.0.0.5:1883 ## bitte EIGENE IP-Adresse eintragen&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Wenn Sie beabsichtigen, MQTT2_CLIENT zu verwenden, sollten Sie zuerst die [[MQTT2-Module - Praxisbeispiele|Praxisbeispiele zu den MQTT2-Modulen]] lesen, und dabei die Hinweise im Artikel [[MQTT2_CLIENT]] beachten.}}&lt;br /&gt;
&lt;br /&gt;
Ein MQTT2_CLIENT-Device kann ebenfals mit Hilfe von [[allowed]] abgesichert werden, um z.B. SSL-verschlüsselte Kommunikation zu ermöglichem. Client-Module zu diesem IO-Typ sind wiederum [[MQTT2_DEVICE]] und {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=de|Label=MQTT_GENERIC_BRIDGE}}.&lt;br /&gt;
&lt;br /&gt;
===== MQTT (Modul) ===== &lt;br /&gt;
Vorab werden für diese Variante weitere Perl-Pakete benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 # Perl Version ausgeben&lt;br /&gt;
 perl -v&lt;br /&gt;
 # Perl MQTT Module nachinstallieren (läuft ein paar Minuten)&lt;br /&gt;
 sudo cpan install Net::MQTT:Simple&lt;br /&gt;
 sudo cpan install Net::MQTT:Constants&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein IO-Device des Typs MQTT wird z.B. angelegt mit&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Sofern der Broker mit FHEM über localhost kommuniziert, kann als IP 127.0.0.1 verwendet werden.}}&lt;br /&gt;
 define myBroker MQTT 10.0.0.5:1883 ## bitte EIGENE IP-Adresse eintragen&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Außerhalb der offiziellen Quellen sind auch einige ältere Varianten des Moduls MQTT_DEVICE verfügbar, die jeweils spezielle Anforderungen (z.B. für Zigbee2mqtt) separat abbilden. Diese werden hier nicht gesondert behandelt, da solche Sonderfälle heute generischer und einfacher durch den Einsatz von MQTT2_DEVICE abzubilden sind.}}Client-Device-Module zum Modul [[MQTT (Modul)|MQTT]] sind [[MQTT_DEVICE]], {{Link2CmdRef|Anker=MQTT_BRIDGE|Lang=de|Label=MQTT_BRIDGE}} (veraltet) und {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=de|Label=MQTT_GENERIC_BRIDGE}}. Da &#039;&#039;MQTT_DEVICE&#039;&#039; payload im JSON-Format (im Unterschied zu MQTT2_DEVICE) nicht selbst verarbeiten kann wird hier zusätzlich das Modul {{Link2CmdRef|Anker=expandJSON|Lang=de|Label=expandJSON}} benötigt, um den {{Link2Forum|Topic=66761|LinkText=JSON String auszuwerten}}.&lt;br /&gt;
&lt;br /&gt;
=== Performancefragen... ===&lt;br /&gt;
...oder was sollte man als Lösung wählen, wenn man in die MQTT-Welt einsteigt&amp;lt;ref&amp;gt;vgl. hierzu diesen {{Link2Forum|Topic=94768|Message=875714|LinkText=Beitrag}} von Rudolf König&amp;lt;/ref&amp;gt;?&lt;br /&gt;
Grundsätzlich sollte man davon ausgehen, dass innerhalb von FHEM die Verarbeitung derselben Daten näherungsweise denselben Aufwand bedeuten, unabhängig davon, welche der Implementierungen (&#039;&#039;MQTT2_CLIENT&#039;&#039;, &#039;&#039;MQTT&#039;&#039; oder &#039;&#039;MQTT2_SERVER&#039;&#039;) man konkret wählt.&lt;br /&gt;
Ein externer Broker hat daher vor allem dann Vorteile, wenn die MQTT Daten überwiegend für was anderes (nicht FHEM) verwendet werden, oder MQTT zweckentfremdet wird (wie z.Bsp. für Musikübertragung). Nutzt man das MQTT-Protokoll dagegen vorwiegend innerhalb von FHEM, ist eher der Einsatz von MQTT2_SERVER in Betracht zu ziehen. Dieser soll Anfängern die Anbindung von MQTT Geräten in FHEM einfacher machen. Wer später merkt, dass er doch einen externen Broker benötigt, kann dann immer noch auf MQTT2_CLIENT in Verbindung mit einem anderen Broker wechseln.&lt;br /&gt;
Dagegen ist der Weg von MQTT_DEVICE zu MQTT2_DEVICE mit erheblich mehr Aufwand verbunden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation zu sonstigen FHEM-Geräten über MQTT  ===&lt;br /&gt;
&lt;br /&gt;
Möchte man Daten von einem [[Gerät]] (im FHEM-Sinn), das &#039;&#039;&#039;nicht&#039;&#039;&#039; vom Typ &#039;&#039;MQTT2_DEVICE&#039;&#039; oder &#039;&#039;MQTT_DEVICE&#039;&#039; (je nach IO-Modul) ist, per MQTT-Protokoll versenden (z.B. für eine andere Visualisierungslösung als FHEMWEB, oder als FHEM2FHEM-Ersatzlösung), oder diese sonstigen Geräte über MQTT-Anweisungen von außen steuern können, hat man mehrere Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
==== MQTT_GENERIC_BRIDGE ====&lt;br /&gt;
Das Modul {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=en|Label=MQTT_GENERIC_BRIDGE}} ermöglicht es, sein jeweiliges IO-Modul-Gerät zu nutzen, um diesen Kommunikationsweg für beliebig viele andere FHEM-Geräte bereitzustellen. Dabei erfolgt am MQTT_GENERIC_BRIDGE-Gerät selbst nur eine Basiskonfiguration, im Übrigen durch Attribute an dem jeweiligen Gerät selbst. So kann z.B. ein Aktor des Typs [[CUL_HM]] an- oder ausgeschaltet werden oder auch einfach nur seinen aktuellen Schaltzustand per MQTT-Protokoll publizieren.&lt;br /&gt;
 &lt;br /&gt;
Dieses Modul kann seit November 2018 mit allen drei IO-Modul-Varianten zusammen eingesetzt werden, also sowohl mit &#039;&#039;MQTT2_SERVER&#039;&#039; bzw. &#039;&#039;MQTT2_CLIENT&#039;&#039; oder &#039;&#039;MQTT&#039;&#039; (00_MQTT.pm). &lt;br /&gt;
&lt;br /&gt;
Dabei sollte man jedoch beachten, dass zur Verwendung mit den MQTT2-IO&#039;s unbedingt die autocreate-Funktion des betreffenden IOs ausgeschaltet wird und dies auch bleibt&amp;lt;ref&amp;gt;siehe dazu diesen {{Link2Forum|Topic=95341|LinkText=Thread}} zu den technischen Hintergründen&amp;lt;/ref&amp;gt;! Weiter wird das Perl-Modul &#039;&#039;libmodule-pluggable-perl&#039;&#039; benötigt&amp;lt;ref&amp;gt;Dieses kann über &amp;lt;code&amp;gt;apt-get install libmodule-pluggable-perl&amp;lt;/code&amp;gt; installiert werden&amp;lt;/ref&amp;gt;, damit im Hintergrund auch das Modul [[MQTT (Modul)|MQTT]] geladen werden kann. Damit gelten auch für diesen Modul die Installationsvoraussetzungen für [[MQTT#MQTT_.28Modul.29|MQTT]]!&lt;br /&gt;
&lt;br /&gt;
Anwendungsfälle und -beispiele für das Modul sind diesem {{Link2Forum|Topic=91642|LinkText=Thread}} zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
==== MQTT_BRIDGE ====&lt;br /&gt;
Dieses Modul kann nur zusammen mit einem IO-Gerät des Typs [[MQTT (Modul)|MQTT]] verwendet werden. Dabei wird pro weiterzuleitendem anderen FHEM-Gerät eine eigene Instanz dieses Moduls verwendet. Auf den Einsatz dieser Option sollte in neuen Installationen zugunsten von &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039; verzichtet werden.&lt;br /&gt;
&lt;br /&gt;
==== Per publish-Befehl am IO-Gerät ====&lt;br /&gt;
Alle drei IO-Module kennen direkte &#039;&#039;publish&#039;&#039;-Anweisungen, mit deren Hilfe beliebige &#039;&#039;payloads&#039;&#039; an beliebige &#039;&#039;topics&#039;&#039; gesendet werden können. Dies kann man z.B. in einem [[notify]] oder [[at]] nutzen, um einzelne Events zu publishen oder Werteanfragen abzusetzen.&lt;br /&gt;
&lt;br /&gt;
Hier eine regelmäßige Werteabfrage auf einen [[EBUS-MQTT2|ebus]]:&lt;br /&gt;
 defmod get_ebus_updates at +*00:15:00 set ebusMQTT publish ebusd/430/Hc1HeatCurve/get;&lt;br /&gt;
 set ebusMQTT publish ebusd/430/HwcTempDesired/get;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RAW-Events am IO-Gerät (MQTT2.*) ====&lt;br /&gt;
Bei beiden MQTT2-IO-Modulen (MQTT2_SERVER und MQTT2_CLIENT) kann per [[Regulärer Ausdruck|regulärem Ausdruck]] festgelegt werden, welche Nachrichten ein Event erzeugen sollen, auf das dann wieder z.B. mit einem [[notify]] reagiert werden kann, z.B. um beliebige Schaltaktionen auszulösen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT-Clients (Beispiele) ==&lt;br /&gt;
&lt;br /&gt;
===Arduino-library===&lt;br /&gt;
Zur Kommunikation mit dem Broker von Seiten eines [[Arduino|Arduinos]] mit selbst erstellten Sketches böte sich der PubSubClient an.&lt;br /&gt;
&lt;br /&gt;
===PC-Software===&lt;br /&gt;
Um die Funktionalität des Brokers zu testen kann z.B. ein Analyse-Tool wie MQTT.fx verwendet werden, oder die im Paket &#039;&#039;mosquitto-clients&#039;&#039; enthaltenen Linux-Kommandozeilen-Programme &#039;&#039;mosquitto_sub&#039;&#039; und &#039;&#039;mosquitto_pub&#039;&#039;. Letzterer könnte z.E. auch aus beliebigen &#039;&#039;shell-scripten&#039;&#039; heraus aufgerufen werden. Als Perl-Bibliothek steht alternativ z.B. [https://metacpan.org/pod/distribution/AnyEvent-MQTT/bin/anyevent-mqtt-pub anyevent-mqtt-pub] zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== Tasmota ===&lt;br /&gt;
Eine derzeit oft genutzte Möglichkeit für MQTT bilden die [[Sonoff]]-Geräte und weitere [[ESP8266]]-basierte Hardware, die unter vielen Handelsnamen erhältlich sind. Werden diese mit Tasmota (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) geflasht, so kommunizieren sie über MQTT. Um diese Geräte einzubinden, ist wie folgt vorzugehen. Zuerst ist ein Serverdienst (Broker) bereitzustellen, wie oben beschrieben.&lt;br /&gt;
&lt;br /&gt;
Unter Sonoff sind einige Topics voreingestellt. arendst stellt insbesondere drei Topic-Präfixe bereit, die seiner Meinung jedes Topic einleiten sollen (in den Eingabemasken als &amp;quot;%prefix%&amp;quot; notiert). Das sind einmal Kommandos (abgekürzt als cmnd), die dazu dienen, Befehle auszuführen. Daten werden mit tele und stat übertragen. Ein Topic besteht dann zuerst aus diesem Präfix und danach dem eigentlichen Topic. Wer also beispielsweise einem Sonoff_Switch einen Befehl senden will, sollte als Topic cmnd/Sonoff_Switch wählen. Wenn der Switch ein- und ausgeschaltet werden kann, muss der Topic noch das Wort POWER enthalten (in MQTT werden viele Kennworte komplett groß geschrieben). Der Topic lautet damit vollständig &amp;quot;cmnd/Sonoff_Switch/POWER/set&amp;quot; &lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Dabei ist darauf zu achten, dass für den Parameter &#039;&#039;topic = %topic% (sonoff)&#039;&#039; statt &#039;&#039;sonoff&#039;&#039; ein gerätespezifischer eigener Name eingetragen wird. Hierzu kann man z.B. auch die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; verwenden, indem man die unter &#039;&#039;client (DVES_8BABA9)&#039;&#039; zu findende Angabe kopiert. Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
&lt;br /&gt;
Link zum Forum: {{Link2Forum|Topic=27532|LinkText=MQTT FHEM Einrichtung}} (hier als &#039;&#039;MQTT_DEVICE&#039;&#039;!):&lt;br /&gt;
&lt;br /&gt;
 ### FHEM Device mit MQTT verbinden ###&lt;br /&gt;
 define Sonoff_Switch MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_Switch IODev myBroker&lt;br /&gt;
 attr Sonoff_Switch devStateIcon ON:rc_GREEN:OFF OFF:rc_RED:ON&lt;br /&gt;
 attr Sonoff_Switch icon hue_filled_br30&lt;br /&gt;
 attr Sonoff_Switch publishSet ON OFF cmnd/TestSwitch/POWER&lt;br /&gt;
 attr Sonoff_Switch room MQTT&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Licht stat/Sonoff_Switch/POWER&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Sensor tele/Sonoff_Switch/SENSOR&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Status stat/Sonoff_Switch/STATUS&lt;br /&gt;
 attr Sonoff_Switch webCmd ON:OFF&lt;br /&gt;
&lt;br /&gt;
Der hier dargestellte Beispielcode realisiert die Kommunikation zwischen FHEM und dem sonoff Modul via MQTT Broker. Zu beachten ist hier, dass &#039;&#039;&#039;subscribeReading_Licht&#039;&#039;&#039; und &#039;&#039;&#039;subscribeReading_Status&#039;&#039;&#039; unterschiedliche Syntax des Topic Strings haben!&lt;br /&gt;
&lt;br /&gt;
=== OpenMQTTGateway ===&lt;br /&gt;
&lt;br /&gt;
== Sicherheit ==&lt;br /&gt;
Prinzipiell ist MQTT ebenso sicher wie eine Postkarte. Solange man es nicht extra absichert, kann jeder der, im eigenen LAN ist (und die Adresse vom Broker kennt) alle Topics mitlesen.&lt;br /&gt;
:&amp;lt;code&amp;gt;meinHaus/Flur/Haustuer:open / close&amp;lt;/code&amp;gt;&lt;br /&gt;
bietet unter diesen Umständen reichlich Raum für Verbesserungen! &lt;br /&gt;
&lt;br /&gt;
Abhilfe:&lt;br /&gt;
=== Username / Passwort ===&lt;br /&gt;
Zunächst kann man erst mal einen Username / Passwort vergeben, was alle IO-Device-Module unterstützen. Da ist zwar auch noch lange nicht sicher, aber zumindest steigert es den Aufwand schon mal. Jetzt muss man zumindest schon mal Pakete sniffen und verstehen, um unbefugt zu lesen oder gar zu publishen.&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
Um wirklich sicher zu werden, führt kein Weg an TLS vorbei. &lt;br /&gt;
&lt;br /&gt;
Der MQTT-Client in [[#Tasmota|Tasmota]] (für ESP8266) kann mit TLS betrieben werden, vgl. [https://github.com/arendst/Tasmota/wiki/TLS Beschreibung im Tasmota-Wiki].&lt;br /&gt;
&lt;br /&gt;
Leider kann z.B. ein Arduino das schlicht nicht mehr, da die einfacheren Modelle nicht über ausreichend Speicher und die Rechenleistung verfügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;(Hier fehlt eine Anleitung für allowed usw.)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
=== Anweisung und Ergebnis weichen voneinander ab ===&lt;br /&gt;
In der Regel melden MQTT-fähige Geräte entweder den Erhalt einer Nachricht zurück oder den Status nach Durchführung der in der &#039;&#039;payload&#039;&#039; enthaltenen Anweisung. Dabei findet aber in der Regel beim Empfänger eine Verarbeitung der Nachricht statt, ggf. wird diese auch weitergesendet und nochmals verarbeitet, bevor dann ggf. eine Rückmeldung des neuen Status an den MQTT-Server erfolgt. Handelt es sich um einfache on/off-Befehle, bleibt Anweisung und Ergebnis in der Regel identisch. Bei anderen, namentlich bei Dimmer-Werten, kann es zu Rundungsdifferenzen bei nummerischen Werten kommen. So kann z.B. ein Dimm-Wert von 70% gesetzt werden, zürückgemeldet wird dann aber 72% (oder 67%). &lt;br /&gt;
Dies ist technisch bedingt, vermeiden kann das jedoch in aller Regel nur der Autor der jeweiligen software/firmware auf dem &amp;quot;rechnenden&amp;quot; Gerät.&lt;br /&gt;
&lt;br /&gt;
=== Unbeabsichtigte Schleifen ===&lt;br /&gt;
Durch Fehler in der topic-Struktur können unbeabsichtigte Schleifen entstehen, die FHEM komplett blockieren können. Es ist unbedingt darauf zu achten, dass die jeweiligen Sende- und Empfangs-topics andere sind!&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://mqtt.org Offizielle Homepage von MQTT, englisch]&lt;br /&gt;
* [http://www.hivemq.com/blog/mqtt-essentials-part-1-introducing-mqtt Sehr gute Einführung, englisch, sind 5 lesenswerte Teile]&lt;br /&gt;
* [https://www.heise.de/developer/artikel/MQTT-Protokoll-fuer-das-Internet-der-Dinge-2168152.html Ein Exkurs von Heise mit Beispielen, deutsch, sehr lesenswert]&lt;br /&gt;
* [http://www.mqttfx.org/ MQTT FX - ein sehr praktisches Analysetool]&lt;br /&gt;
* {{Link2Forum|Topic=69230|LinkText=Diskussionsthread im Forum}}&lt;br /&gt;
* {{Link2Forum|Topic=92888|LinkText=Thread, zur Entstehungsgeschichte von MQTT2_CLIENT}}&lt;br /&gt;
* {{Link2Forum|Topic=93255|LinkText=Ankündigungsthread zur MQTT2-Erweiterung der MQTT_GENERIC_BRIDGE}}&lt;br /&gt;
* [[MQTT_Einf%C3%BChrung_Teil_2|Teil 2 der MQTT Einführung]]: Detailaspekte (vorrangig zur Modulfamilie MQTT/MQTT_DEVICE)&lt;br /&gt;
* [[MQTT Einführung Teil 3|Teil 3 der MQTT Einführung]]: Arduino-Client selbst programmieren&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT|Einführung]]&lt;br /&gt;
[[Kategorie:MQTT| ]]&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DbLog&amp;diff=23163</id>
		<title>DbLog</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DbLog&amp;diff=23163"/>
		<updated>2017-11-03T15:33:39Z</updated>

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

		<summary type="html">&lt;p&gt;Rspecht: /* Debug über Konsole (z.B. Putty) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Hinweis|Dieser Artikel ist im Aufbau und soll Einsteigern und Fortgeschrittenen als Referenzquelle für typische Fragen dienen. Alle sind eingeladen hier weitere Möglichkeiten einzubringen. Die beste Referenz für alle Fragen zu MySensors ist und bleibt aber die offizielle Hompage des Projekts!}}&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
[http://www.mysensors.org MySensors] ist ein open-Source-Projekt. Der Schwerpunkt liegt auf selbstgemachten Funk-Sensoren für die Hausautomatisierung und das &amp;quot;Internet der Dinge&amp;quot; in einer Art Baukastensystem. Die Bauanleitungen des Projekts für die einzelnen Musterbausteine sind in der Regel einfach nachzubauen, die Hard- und Softwarebauteile lassen sich dabei auch (fast beliebig) kombinieren. &lt;br /&gt;
&lt;br /&gt;
=== Nodes und Children===&lt;br /&gt;
==== Nodes ====&lt;br /&gt;
Die Kombination von einem Microcontroller und einem Funkchip wird jeweils als &amp;quot;Node&amp;quot; bezeichnet. &lt;br /&gt;
Ein MySensors-Netzwerk besteht also (in der Regel) aus mindestens zwei Nodes, nämlich einer Gateway-Node und einer Sensor-Node. Jede Node ist durch eine sog. NodeID innerhalb des Netzwerks eindeutig identifizierbar, wobei die &amp;quot;0&amp;quot; jeweils für das Gateway reserviert ist.&lt;br /&gt;
Als Microcontroller werden in der Regel Arduinos (Nano oder Micro) verwendet, für das GW häufiger auch [[ESP8266]]. Als Funkchips lassen sich derzeit Module mit nRF24L01+ und RFM69 verwenden, die allerdings jeweils eine eigene Funktechnik verwendet und daher innerhalb eines Netzwerks nicht gemischt werden können. Es kann auch ein kabelgebundenes Netzwerk auf Basis von RS485-Modulen aufgebaut werden; hierfür werden 2 Adern als Datenleitung benötigt.&lt;br /&gt;
==== Children ====&lt;br /&gt;
Als Child wird alles bezeichnet, was jeweils innerhalb einer Node unterschieden werden soll. Beispiel: An einer Node wird ein BME280 angeschlossen. Dies ist ein I2C-Sensor, der drei Werte liefert, nämlich Temperatur, Luftfeuchtigkeit und Luftdruck. Jeder dieser Meßgrößen erhält üblicherweise eine eigene ChildID zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Softwarestand ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Der Verfasser hat in der Vergangenheit festgestellt, dass die bei MySensors beteiligten Entwickler eventuelle Verbesserungen und Fehlerkorrekturen nicht mehr in die &amp;quot;stable&amp;quot;-Version rückportieren. Bei Problemen empfiehlt es sich daher, die jeweilige beta-Version zu testen. Hierzu muß aber in der Regel auch das verwendete Gateway auf diese Version upgedated werden.}}&lt;br /&gt;
Bei Abfassung dieses Artikels war &lt;br /&gt;
*1.8.0 der Stand der verwendeten Arduino-IDE&lt;br /&gt;
*2.1.1 die stable-Version von MySensors. &lt;br /&gt;
*2.2.0-beta der aktuelle Development-Zweig von Mysensors&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile von MySensors ===&lt;br /&gt;
==== Vorteile  ====&lt;br /&gt;
*Preisgünstig&lt;br /&gt;
*Modular, Elemente können (fast) beliebig kombiniert werden&lt;br /&gt;
*Es kann ein sog. ACK verlangt werden. Damit läßt sich sicherstellen, dass eine Node einen Befehl auch tatsächlich erhalten hat (Bidirektionalität).&lt;br /&gt;
*Auf den Microcontrollern kann eine eigene Funktionalität unabhängig von der zentralen FHEM-Instanz vorgesehen werden (z.B. LED-Licht direkt bei Bewegung schalten). Die Nodes können seit 2.0.1-beta dabei auch ohne Verbindung zum Gateway die loop() ausführen, wenn eine entsprechende Option aktiviert ist.&lt;br /&gt;
*MQTT kann unterstützt werden.&lt;br /&gt;
*Es kann auch eine kabelgebundene Infrastruktur aufgebaut werden (RS485, zwei Adern).&lt;br /&gt;
&lt;br /&gt;
==== Nachteile  ====&lt;br /&gt;
*Standardmäßig wird ein nicht verschüsselter Funkstandard verwendet, so dass von der Verwendung in sicherheitsrelevanten Funktionen (Türschließer usw.) abzuraten ist.&lt;br /&gt;
&lt;br /&gt;
==== Zum Start ====&lt;br /&gt;
Für erste Tests sind sinnvoll:&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=1. Für Sensbender-Boards sind spezielle [https://raw.githubusercontent.com/mysensors/ArduinoBoards/master/package_mysensors.org_index.json Board-Definitionen] für die IDE verfügbar. Nach den [https://github.com/mysensors/MySensors/releases Release Notes] sind diese ab der Version 2.0.0 zu empfehlen, die Installation erfolgt über File -&amp;gt; Preferencies -&amp;gt; Additional Boards Manager URLs&lt;br /&gt;
2. Manche neueren Boarddefinitionen aus der IDE führen u.U. zu häufigeren Reboots. Seit 1.6.18 scheint das Problem behoben zu sein, ansonsten ist ein Downgrade der Boarddefinitionen für AVR-Boards bis &amp;lt;=1.6.11 zu empfehlen.}}&lt;br /&gt;
*eine Arduino mit USB-Anschluß (Nano) oder ein ESP8266 &lt;br /&gt;
*ein weiterer Arduino Nano&lt;br /&gt;
*zwei nRF24L01+ (alternativ: zwei RFM69)&lt;br /&gt;
*Die Arduino-IDE &lt;br /&gt;
*die gewünschte Sensorik, also z.B. einen DS18B20+Widerstand, ein Bewegungsmelder-Modul, ... siehe dazu die [https://www.mysensors.org/build Build-Anleitungen bei MySensors.org], wo auch Bezugsquellen zu finden sind.&lt;br /&gt;
&lt;br /&gt;
== MySensors in FHEM ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Die Nutzung von MySensors in FHEM ist (nicht nur für den Anfänger) mit der standardmäßig eingeschalteten [[autocreate|autocreate-Funktion]] einfach umsetzbar. Die Kenntnis der FHEM-Grundlagen und Durcharbeitung der Anfänger-Lektüren wird im Folgenden vorausgesetzt. Insbesondere sind [[Erste Schritte in FHEM]] und [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM] Pflicht! Dort werden wesentliche Punkte für ein Verständnis von FHEM vermittelt, auch wenn manches nicht mehr ganz aktuell ist. So sollte man z.B. ein direktes Editieren der fhem.cfg unterlassen.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden immer wieder Auszüge aus der [[Konfiguration]] dargestellt. Diese dienen zur Erläuterung und Veranschaulichung. Die Bearbeitung der [[Konfiguration]] sollte - zur Verhinderung von Fehlern - nach Möglichkeit immer über das &amp;quot;[[Konfiguration#Befehl-Eingabefeld|Befehl-Eingabefeld]]&amp;quot; und die &amp;quot;[[Konfiguration#Objektdetails|Objektdetails]]&amp;quot; erfolgen.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung: Gateway ===&lt;br /&gt;
Zunächst ist das I/O-Device zu definieren, also das Gateway. Dies ist in [[MYSENSORS]] beschrieben.&lt;br /&gt;
{{Hinweis|Bei Verwendung eines seriellen Gateways ist zu empfehlen, einen Arduino mit orginalem FTDI-Chip zu verwenden und diesen mit der &amp;quot;by-id&amp;quot;-Methode ([[Trick_der_Woche#CUL_.26_CO_.C3.BCber_Serial_ID-einbinden]]) zuzuweisen. Beim Anschluß mehrer Arduinos mit einem CHG340/CHG341 an denselben Computer/Raspberry sind diese nur mit hohem {{Link2Forum|Topic=44926|Message=446809|LinkText=Aufwand}} eindeutig addressierbar.}}&lt;br /&gt;
{{Hinweis|Die Einbindung eines MySensors-Netzwerks kann auch über [http://fhem.de/commandref.html#MQTT MQTT] erfolgen. Dabei übernimmt ein MySensors-MQTT-Gateway die Kommunikation mit dem Broker. Der Autor hat hier jedoch keine eigene Erfahrung, bitte entsprechend nachtragen!}}&lt;br /&gt;
&lt;br /&gt;
Serielles Gateway am Raspberry PI:&lt;br /&gt;
 define MyGateway_0 MYSENSORS /dev/ttyUSB0@115200&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreicher Definition ist das Gateway im Raum &amp;quot;Everything&amp;quot; in der Gruppe &amp;quot;MYSENSORS&amp;quot; zu finden. Wenn unten &amp;quot;initialized&amp;quot; oder &amp;quot;opened&amp;quot; angezeigt wird, ist FHEM in der Lage, mit dem MySensors-Netz zu kommunizieren. Es sollte dann noch auf [[autocreate]] gestellt werden.&lt;br /&gt;
&lt;br /&gt;
=== Das Gateway ist auch ein MySensors-Device  ===&lt;br /&gt;
{{Hinweis|Sobald die ersten Meßwerte übertragen wurden, werden &#039;&#039;&#039;nach einem Browser-Refresh&#039;&#039;&#039; auch die aktuellen Meßwerte angezeigt, dies kann je nach Einstellung im Sketch aber einige Zeit dauern.}}&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Die Readings werden dem Modul MYSENSOR_DEVICE.pm entnommen. Sind diese dort nicht im Bereich &amp;quot;reads&amp;quot; bzw. &amp;quot;sends&amp;quot; enthalten, kann man fehlende Readings auch manuell anlegen. }}&lt;br /&gt;
Da am Gateway gleichzeitig auch bereits Sensoren angeschlossen sein können, legt FHEM direkt auch ein erstes [[MYSENSORS_DEVICE]] mit der NodeID &amp;quot;0&amp;quot; an. Sollten bereits ChildIDs im presentation()-Abschnitt des Gateway-Sketches enthalten gewesen sein, werden auch die zum Typ des präsentierten Sensor-Child-Typs passenden Readings automatisch angelegt. &lt;br /&gt;
&lt;br /&gt;
=== Das erste Funk-MySensors-Device ===&lt;br /&gt;
In der Regel ist aber das erste &amp;quot;echte&amp;quot; MySensors-Device die 2. Node, die neben dem Gateway in Betrieb genommen wird. Hier gilt das Vorgesagte entsprechend: Nach dem ersten Start sind neu erkannte Devices ebenfalls im Raum &amp;quot;Everything&amp;quot; in der Gruppe &amp;quot;MYSENSORS&amp;quot; zu finden, die readings werden automatisch angelegt. Sobald Meßwerte übermittelt werden, werden die Readings damit gefüllt und entsprechend der per Sketch programmierten Vorgaben aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Details der Wechselwirkung zwischen FHEM und MySensors ===&lt;br /&gt;
==== Vergabe der NodeID ====&lt;br /&gt;
Die Vergabe der NodeID kann entweder im einzelnen Sketch erfolgen oder automatisiert. Dabei vergibt FHEM in der Regel fortlaufend Nummern ab 100. Die erste Node mit automatischer Nummernvergabe ist daher in der Regel das Device MYSENSORS_100. &lt;br /&gt;
{{Hinweis|Die NodeID wird - wie einige weitere Informationen - im sog. EEPROM des Arduinos abgespeichert. Ist sie einmal vergeben, ändert sie sich auch bei einem erneuten flashen der Node nicht mehr, es sei denn, man gibt per &amp;quot;define&amp;quot; im Sketch eine andere NodeID vor.}}&lt;br /&gt;
&lt;br /&gt;
==== Fehlende Sensor-Typen und Readings ====&lt;br /&gt;
Für Anfänger ist zu empfehlen, nur Typen und Variablen zu nutzen, die in der 10_MYSENSORS_DEVICE.pm auch hinterlegt sind. Die Angaben dort zu &amp;quot;receives&amp;quot; und &amp;quot;sends&amp;quot; sind aus der Sicht der Node gemeint. Gibt es einzelne Sensor-Typen oder Readings (noch) nicht, gibt es folgende Möglichkeiten:&lt;br /&gt;
*Noch nicht vorhandene Typen kann man umgehen, indem man vergleichbare andere nimmt, also z.B. Wasser- statt Gaszähler (Stand: 11/2015)&lt;br /&gt;
*Fehlende Readings können auch &lt;br /&gt;
**in die 10_MYSENSORS_DEVICE.pm manuell eingepflegt werden, das automatische Anlegen geht dann aber ggf. bei einem Update wieder verloren&lt;br /&gt;
**manuell, z.B. &amp;lt;code&amp;gt;attr MYSENSOR_99 mapReading_ir_send3 3 ir_send&amp;lt;/code&amp;gt;&lt;br /&gt;
Ist das Reading einmal angelegt, wird es auch automatisch befüllt, sobald die Node einen entsprechenden Wert sendet.&lt;br /&gt;
&lt;br /&gt;
==== Austausch von Variablen oder Texten ====&lt;br /&gt;
Es ist möglich, Informationen auch bidirektional zwischen FHEM und den Nodes auszutauschen. Dies ermöglicht z.B. die Ansteuerung von Displays oder die Konfiguration von FHEM aus. Hierzu ist es am einfachsten, ein oder mehrere S_CUSTOM-Child zu präsentieren, die jeweils bis zu 5 Variablen ermöglichen. Die Zuordnung innerhalb der Node zu internen Variablen erfolgt dann über die Auswertung der Messages entsprechend der [https://forum.mysensors.org/topic/1817/weather-and-forecast-display-for-swedish-fhem-users/2 ChildID und der Variablennummer].&lt;br /&gt;
&lt;br /&gt;
==== OTA ====&lt;br /&gt;
MySensors unterstützt für NRF-Chips zwar grundsätzlich OTA-updates, man muß dafür aber vorübergehend einen anderen Controller als FHEM einsetzen (Stand 11/2016). &lt;br /&gt;
Ein Howto ist in diesem {{Link2Forum|Topic=59388.0|LinkText=Forenbeitrag}} zu finden.&lt;br /&gt;
Der dort verwendete Bootloader erwartet OTA-Updates fest auf Channel 76.&lt;br /&gt;
&lt;br /&gt;
== Links, Tricks, Kniffe und Erfahrungen ==&lt;br /&gt;
&lt;br /&gt;
=== Interessante Links ===&lt;br /&gt;
==== Offizielles Debugging-Schema ====&lt;br /&gt;
*[https://forum.mysensors.org/topic/666/debug-faq-and-how-ask-for-help Debug / FAQ bei MySensors.org]&lt;br /&gt;
==== Debug über Konsole (z.B. Putty) ====&lt;br /&gt;
* Über Picocom könnt ihr einfach das Gateway debuggen. Dazu in FHEM entsprechend das Device abschalten und Picocom auf der Konsole aufrufen. Damit alles schön angezeigt wird hilft das imap wie unten gezeigt. Bitte passt das Device /dev/ttyUSB0 auf euer Gateway an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;picocom /dev/ttyUSB0  -b115200 --imap lfcrlf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Vorgehensweise zur Kombination von mehreren Sketchen/Sensoren an einer Node ====&lt;br /&gt;
Mehrere Sensoren (Children) kann man recht einfach an einen einzigen Arduino anschließen und ist dabei nur durch die Größe des Speichers begrenzt. Die Vorgehensweise erläutert dieses [https://forum.mysensors.org/topic/2597/combining-mysensors-examples/2 Beispiel] .&lt;br /&gt;
==== Verschlüsselung und Signierung ====&lt;br /&gt;
*{{Link2Forum|Topic=67248|LinkText=Forumsbeitrag zu MySensors Verschlüsselung und Signierung}}&lt;br /&gt;
*[https://www.mysensors.org/about/signing Darstellung bei MySensors.org]&lt;br /&gt;
&lt;br /&gt;
=== EEPROM ===&lt;br /&gt;
Die Nodes speichern einen Teil ihrer Einstellungen im sog. EEPROM. Dazu gehören z.B. die NodeID, der letzte bekannte &amp;quot;nächste&amp;quot; Punkt im Netzwert (RepeaterID) oder der Zustand von Relais. In der Regel ist nur die NodeID problematisch und kann beim flashen per Sketch auf einen anderen als den bisherigen Wert gestellt werden. Wer dennoch das EEPROM löschen möchte, muß den &#039;&#039;&#039;MySensor-Lösch-Sketch&#039;&#039;&#039; nehmen, der nicht &amp;quot;0000...&amp;quot; ins EEPROM schreibt wie der Arduino-Standard-Lösch-Sketch, sondern &amp;quot;FFFF...&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Funk-Themen (NRF-Chips) ===&lt;br /&gt;
Viele berichtete Probleme bei der Einrichtung von MySensors-Netzwerken haben ihren Ursprung in einer unzureichenden Funkverbindung. {{Hinweis|Ob dies der Fall ist, läßt sich leicht testen, indem man die fragliche Node wieder in die Nähe des Gateways bringt. Funktioniert es dort wie erwartet, liegt eine schlechte Funkverbindung vor.}}&lt;br /&gt;
&lt;br /&gt;
==== Abhilfemaßnahmen ====&lt;br /&gt;
*Einen bzw. mehrere [https://www.mysensors.org/build/connect_radio#connecting_a_decoupling-capacitor Kondensatoren] einlöten. Es sind auch fertige Module erhältlich, die diese Bauteile und einen Spannungsregler bereits enthalten, auf die der NRF mit einem Stecksockel aufgesteckt wird.&lt;br /&gt;
*Einen anderen Kanal wählen; die verwendeten Frequenzen liegen im b/g-WLAN-Bereich, so dass wechselseitige Störungen möglich sind. In Deutschland sind die Kanäle bis 84 erlaubt.&lt;br /&gt;
*NRF tauschen (Fake NRF-Chips sind zwar verwendbar, haben aber eine deutlich reduzierte Funkreichweite)&lt;br /&gt;
*Ein allgemeiner Guide zur Verwendung der nrf24l01+-Module ist [https://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo hier] zu finden.&lt;br /&gt;
*Für das Gateway empfielt es sich, ein Modul mit externer Antenne zu verwenden (NRF24L01+PA+LNA Antenna version).&lt;br /&gt;
*Einstellen des richtigen PA_LEVEL_...s: Insbesondere der Standardsketch für das serielle Gateway definiert diesen als LOW, was korrekt ist, wenn der interne Spannungsregler des Arduino verwendet ist. Besser ist es, die benötigten 3,3V mittels eines seperaten Spannungsreglers zu erzeugen und dann den PA_LEVEL_MAX einzustellen. &lt;br /&gt;
*Funkstrecken lassen sich recht unkompliziert mit Repeatern überbrücken. Dieser muß nicht zwingend eine eigene Node sein. Jede (sinnvollerweise nicht Batterie-gespeiste) Node kann per &amp;lt;code&amp;gt; #define MY_REPEATER_FEATURE &amp;lt;/code&amp;gt; zum Repeater gemacht werden.&lt;br /&gt;
*Sonstige Vorschläge ohne Erfolgsgarantie, aber mit Unterhaltungswert:&lt;br /&gt;
**[http://www.instructables.com/id/Enhanced-NRF24L01/ Eigenbau-Antennenverbesserung]&lt;br /&gt;
**[http://blog.blackoise.de/2016/02/fixing-your-cheap-nrf24l01-palna-module/ Schirmung]&lt;br /&gt;
&lt;br /&gt;
==== Buffer-Management ====&lt;br /&gt;
Die NRF-Chips haben nur einen begrenzten Speicher, um Nachrichten zu puffern. Dieser kann überlaufen, wenn in kurzer Folge Informationen versendet werden, z.B. mehr als 5 Temperaturwerte von 1-Wire-Sensoren. Diese Problematik verschärft sich bei der Verwendung von Message-Signing, weil dort die volle payload-Bandbreite für einzelne Nachrichten genutzt wird. Für Abhilfe sorgen kurze Pausen zwischen den einzelnen Sendungen, z.B. &amp;lt;code&amp;gt;wait(30);&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== RS485 ===&lt;br /&gt;
Seit 2.0.1 ist es möglich, statt der Funkmodule auch ein kabelgebundenes Netzwerk auf Basis von RS485-Modulen aufzubauen; hierfür werden 2 Adern als Datenleitung benötigt, die Zahl der Nodes in einem solchen Netzwerk ist bei Verwendung der Standardmodule auf 32 beschränkt, bei Verwendung anderer Transceiver sind auch mehr Nodes möglich. Hierfür ist ein seperates Gateway erforderlich.&lt;br /&gt;
&lt;br /&gt;
==== Bekannte Probleme bei RS485 ====&lt;br /&gt;
(Stand: 2.1.1) &lt;br /&gt;
&lt;br /&gt;
*Die Vergabe der Node-ID&#039;s muß im Sketch selbst erfolgen, die automatische Zuweisung funktioniert nicht.&lt;br /&gt;
*Die für die Anbindung der Module definierten PINs (8+9) sind tief im Code verankert und sollten nicht geändert werden.&lt;br /&gt;
*Sollte der Speicher knapp werden, empfielt es sich, statt der softserial-Variante HW_SERIAL zu verwenden. Dies benötigt ca. 10% weniger Speicher (ATmega328).&lt;br /&gt;
&lt;br /&gt;
=== Ablauf des Starts einer Node ===&lt;br /&gt;
Beim Start durchlaufen alle Nodes nacheinander bestimmte vordefinierte Programmroutinen in folgender Reihenfolge:&lt;br /&gt;
&lt;br /&gt;
==== Vorversionen ====&lt;br /&gt;
*setup()&lt;br /&gt;
*presentation()&lt;br /&gt;
*loop()&lt;br /&gt;
&lt;br /&gt;
==== seit MySensors 2.1.0 ====&lt;br /&gt;
*preHwInit()&lt;br /&gt;
*before()&lt;br /&gt;
*presentation()&lt;br /&gt;
*setup()&lt;br /&gt;
*loop()&lt;br /&gt;
&lt;br /&gt;
==== Im Detail ====&lt;br /&gt;
Dieser Ablauf ermöglicht, die Arduino-Pins vorzukonfigurieren und angeschlossenes Equipment an der für den Programmablauf richtigen Stelle zu initialisieren. Dies ist u.U. wichtig, da &lt;br /&gt;
*eine Node im Normalfall nicht in loop() geht, solange die presentation() nicht erfolgreich war (also solange der Controller nicht verfügbar ist). Eine Failsafe-Initialisierung von Schnittstellen sollte demnach in preHwInit() oder before() erfolgen. Es kann zusätzlich seit 2.1.1 auch die Option MY_TRANSPORT_WAIT_READY_MS min. auf 1 gesetzt werden, dann startet die loop() auch ohne Verbindung zum Gateway.&lt;br /&gt;
*die Initialisierung anderer SPI-Hardware auf einem gemeinsamen Bus mit den NRF-Modulem vor der presentation() erfolgen muß.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel-Sketche ===&lt;br /&gt;
*[https://forum.mysensors.org/topic/938/multisensor-multiactuator-sketch-testboard-tested-with-fhem-controller Mehrfachsensor], allerdings noch für MySensors Vers. 1.5.4&lt;br /&gt;
*Bidirektionale {{Link2Forum|Topic=26807|msg=449776|LinkText=&amp;quot;Infrarot-Fernbedienung&amp;quot;}} aus FHEM raus iVm. remotecontrol&lt;br /&gt;
*mehrere [https://github.com/rejoe2/MySensors-Dallas-Address-ChildID-Consistency Dallas-Temperatursensoren] auf einem Bus eindeutig erkennen&lt;br /&gt;
*[https://forum.mysensors.org/topic/1817/weather-and-forecast-display-for-swedish-fhem-users/2 Display] ansteuern&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MySensors_Starter_Guide&amp;diff=23161</id>
		<title>MySensors Starter Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MySensors_Starter_Guide&amp;diff=23161"/>
		<updated>2017-11-02T14:05:39Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Debug über Konsole (z.B. Putty) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Hinweis|Dieser Artikel ist im Aufbau und soll Einsteigern und Fortgeschrittenen als Referenzquelle für typische Fragen dienen. Alle sind eingeladen hier weitere Möglichkeiten einzubringen. Die beste Referenz für alle Fragen zu MySensors ist und bleibt aber die offizielle Hompage des Projekts!}}&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
[http://www.mysensors.org MySensors] ist ein open-Source-Projekt. Der Schwerpunkt liegt auf selbstgemachten Funk-Sensoren für die Hausautomatisierung und das &amp;quot;Internet der Dinge&amp;quot; in einer Art Baukastensystem. Die Bauanleitungen des Projekts für die einzelnen Musterbausteine sind in der Regel einfach nachzubauen, die Hard- und Softwarebauteile lassen sich dabei auch (fast beliebig) kombinieren. &lt;br /&gt;
&lt;br /&gt;
=== Nodes und Children===&lt;br /&gt;
==== Nodes ====&lt;br /&gt;
Die Kombination von einem Microcontroller und einem Funkchip wird jeweils als &amp;quot;Node&amp;quot; bezeichnet. &lt;br /&gt;
Ein MySensors-Netzwerk besteht also (in der Regel) aus mindestens zwei Nodes, nämlich einer Gateway-Node und einer Sensor-Node. Jede Node ist durch eine sog. NodeID innerhalb des Netzwerks eindeutig identifizierbar, wobei die &amp;quot;0&amp;quot; jeweils für das Gateway reserviert ist.&lt;br /&gt;
Als Microcontroller werden in der Regel Arduinos (Nano oder Micro) verwendet, für das GW häufiger auch [[ESP8266]]. Als Funkchips lassen sich derzeit Module mit nRF24L01+ und RFM69 verwenden, die allerdings jeweils eine eigene Funktechnik verwendet und daher innerhalb eines Netzwerks nicht gemischt werden können. Es kann auch ein kabelgebundenes Netzwerk auf Basis von RS485-Modulen aufgebaut werden; hierfür werden 2 Adern als Datenleitung benötigt.&lt;br /&gt;
==== Children ====&lt;br /&gt;
Als Child wird alles bezeichnet, was jeweils innerhalb einer Node unterschieden werden soll. Beispiel: An einer Node wird ein BME280 angeschlossen. Dies ist ein I2C-Sensor, der drei Werte liefert, nämlich Temperatur, Luftfeuchtigkeit und Luftdruck. Jeder dieser Meßgrößen erhält üblicherweise eine eigene ChildID zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Softwarestand ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Der Verfasser hat in der Vergangenheit festgestellt, dass die bei MySensors beteiligten Entwickler eventuelle Verbesserungen und Fehlerkorrekturen nicht mehr in die &amp;quot;stable&amp;quot;-Version rückportieren. Bei Problemen empfiehlt es sich daher, die jeweilige beta-Version zu testen. Hierzu muß aber in der Regel auch das verwendete Gateway auf diese Version upgedated werden.}}&lt;br /&gt;
Bei Abfassung dieses Artikels war &lt;br /&gt;
*1.8.0 der Stand der verwendeten Arduino-IDE&lt;br /&gt;
*2.1.1 die stable-Version von MySensors. &lt;br /&gt;
*2.2.0-beta der aktuelle Development-Zweig von Mysensors&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile von MySensors ===&lt;br /&gt;
==== Vorteile  ====&lt;br /&gt;
*Preisgünstig&lt;br /&gt;
*Modular, Elemente können (fast) beliebig kombiniert werden&lt;br /&gt;
*Es kann ein sog. ACK verlangt werden. Damit läßt sich sicherstellen, dass eine Node einen Befehl auch tatsächlich erhalten hat (Bidirektionalität).&lt;br /&gt;
*Auf den Microcontrollern kann eine eigene Funktionalität unabhängig von der zentralen FHEM-Instanz vorgesehen werden (z.B. LED-Licht direkt bei Bewegung schalten). Die Nodes können seit 2.0.1-beta dabei auch ohne Verbindung zum Gateway die loop() ausführen, wenn eine entsprechende Option aktiviert ist.&lt;br /&gt;
*MQTT kann unterstützt werden.&lt;br /&gt;
*Es kann auch eine kabelgebundene Infrastruktur aufgebaut werden (RS485, zwei Adern).&lt;br /&gt;
&lt;br /&gt;
==== Nachteile  ====&lt;br /&gt;
*Standardmäßig wird ein nicht verschüsselter Funkstandard verwendet, so dass von der Verwendung in sicherheitsrelevanten Funktionen (Türschließer usw.) abzuraten ist.&lt;br /&gt;
&lt;br /&gt;
==== Zum Start ====&lt;br /&gt;
Für erste Tests sind sinnvoll:&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=1. Für Sensbender-Boards sind spezielle [https://raw.githubusercontent.com/mysensors/ArduinoBoards/master/package_mysensors.org_index.json Board-Definitionen] für die IDE verfügbar. Nach den [https://github.com/mysensors/MySensors/releases Release Notes] sind diese ab der Version 2.0.0 zu empfehlen, die Installation erfolgt über File -&amp;gt; Preferencies -&amp;gt; Additional Boards Manager URLs&lt;br /&gt;
2. Manche neueren Boarddefinitionen aus der IDE führen u.U. zu häufigeren Reboots. Seit 1.6.18 scheint das Problem behoben zu sein, ansonsten ist ein Downgrade der Boarddefinitionen für AVR-Boards bis &amp;lt;=1.6.11 zu empfehlen.}}&lt;br /&gt;
*eine Arduino mit USB-Anschluß (Nano) oder ein ESP8266 &lt;br /&gt;
*ein weiterer Arduino Nano&lt;br /&gt;
*zwei nRF24L01+ (alternativ: zwei RFM69)&lt;br /&gt;
*Die Arduino-IDE &lt;br /&gt;
*die gewünschte Sensorik, also z.B. einen DS18B20+Widerstand, ein Bewegungsmelder-Modul, ... siehe dazu die [https://www.mysensors.org/build Build-Anleitungen bei MySensors.org], wo auch Bezugsquellen zu finden sind.&lt;br /&gt;
&lt;br /&gt;
== MySensors in FHEM ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Die Nutzung von MySensors in FHEM ist (nicht nur für den Anfänger) mit der standardmäßig eingeschalteten [[autocreate|autocreate-Funktion]] einfach umsetzbar. Die Kenntnis der FHEM-Grundlagen und Durcharbeitung der Anfänger-Lektüren wird im Folgenden vorausgesetzt. Insbesondere sind [[Erste Schritte in FHEM]] und [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM] Pflicht! Dort werden wesentliche Punkte für ein Verständnis von FHEM vermittelt, auch wenn manches nicht mehr ganz aktuell ist. So sollte man z.B. ein direktes Editieren der fhem.cfg unterlassen.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden immer wieder Auszüge aus der [[Konfiguration]] dargestellt. Diese dienen zur Erläuterung und Veranschaulichung. Die Bearbeitung der [[Konfiguration]] sollte - zur Verhinderung von Fehlern - nach Möglichkeit immer über das &amp;quot;[[Konfiguration#Befehl-Eingabefeld|Befehl-Eingabefeld]]&amp;quot; und die &amp;quot;[[Konfiguration#Objektdetails|Objektdetails]]&amp;quot; erfolgen.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung: Gateway ===&lt;br /&gt;
Zunächst ist das I/O-Device zu definieren, also das Gateway. Dies ist in [[MYSENSORS]] beschrieben.&lt;br /&gt;
{{Hinweis|Bei Verwendung eines seriellen Gateways ist zu empfehlen, einen Arduino mit orginalem FTDI-Chip zu verwenden und diesen mit der &amp;quot;by-id&amp;quot;-Methode ([[Trick_der_Woche#CUL_.26_CO_.C3.BCber_Serial_ID-einbinden]]) zuzuweisen. Beim Anschluß mehrer Arduinos mit einem CHG340/CHG341 an denselben Computer/Raspberry sind diese nur mit hohem {{Link2Forum|Topic=44926|Message=446809|LinkText=Aufwand}} eindeutig addressierbar.}}&lt;br /&gt;
{{Hinweis|Die Einbindung eines MySensors-Netzwerks kann auch über [http://fhem.de/commandref.html#MQTT MQTT] erfolgen. Dabei übernimmt ein MySensors-MQTT-Gateway die Kommunikation mit dem Broker. Der Autor hat hier jedoch keine eigene Erfahrung, bitte entsprechend nachtragen!}}&lt;br /&gt;
&lt;br /&gt;
Serielles Gateway am Raspberry PI:&lt;br /&gt;
 define MyGateway_0 MYSENSORS /dev/ttyUSB0@115200&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreicher Definition ist das Gateway im Raum &amp;quot;Everything&amp;quot; in der Gruppe &amp;quot;MYSENSORS&amp;quot; zu finden. Wenn unten &amp;quot;initialized&amp;quot; oder &amp;quot;opened&amp;quot; angezeigt wird, ist FHEM in der Lage, mit dem MySensors-Netz zu kommunizieren. Es sollte dann noch auf [[autocreate]] gestellt werden.&lt;br /&gt;
&lt;br /&gt;
=== Das Gateway ist auch ein MySensors-Device  ===&lt;br /&gt;
{{Hinweis|Sobald die ersten Meßwerte übertragen wurden, werden &#039;&#039;&#039;nach einem Browser-Refresh&#039;&#039;&#039; auch die aktuellen Meßwerte angezeigt, dies kann je nach Einstellung im Sketch aber einige Zeit dauern.}}&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Die Readings werden dem Modul MYSENSOR_DEVICE.pm entnommen. Sind diese dort nicht im Bereich &amp;quot;reads&amp;quot; bzw. &amp;quot;sends&amp;quot; enthalten, kann man fehlende Readings auch manuell anlegen. }}&lt;br /&gt;
Da am Gateway gleichzeitig auch bereits Sensoren angeschlossen sein können, legt FHEM direkt auch ein erstes [[MYSENSORS_DEVICE]] mit der NodeID &amp;quot;0&amp;quot; an. Sollten bereits ChildIDs im presentation()-Abschnitt des Gateway-Sketches enthalten gewesen sein, werden auch die zum Typ des präsentierten Sensor-Child-Typs passenden Readings automatisch angelegt. &lt;br /&gt;
&lt;br /&gt;
=== Das erste Funk-MySensors-Device ===&lt;br /&gt;
In der Regel ist aber das erste &amp;quot;echte&amp;quot; MySensors-Device die 2. Node, die neben dem Gateway in Betrieb genommen wird. Hier gilt das Vorgesagte entsprechend: Nach dem ersten Start sind neu erkannte Devices ebenfalls im Raum &amp;quot;Everything&amp;quot; in der Gruppe &amp;quot;MYSENSORS&amp;quot; zu finden, die readings werden automatisch angelegt. Sobald Meßwerte übermittelt werden, werden die Readings damit gefüllt und entsprechend der per Sketch programmierten Vorgaben aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Details der Wechselwirkung zwischen FHEM und MySensors ===&lt;br /&gt;
==== Vergabe der NodeID ====&lt;br /&gt;
Die Vergabe der NodeID kann entweder im einzelnen Sketch erfolgen oder automatisiert. Dabei vergibt FHEM in der Regel fortlaufend Nummern ab 100. Die erste Node mit automatischer Nummernvergabe ist daher in der Regel das Device MYSENSORS_100. &lt;br /&gt;
{{Hinweis|Die NodeID wird - wie einige weitere Informationen - im sog. EEPROM des Arduinos abgespeichert. Ist sie einmal vergeben, ändert sie sich auch bei einem erneuten flashen der Node nicht mehr, es sei denn, man gibt per &amp;quot;define&amp;quot; im Sketch eine andere NodeID vor.}}&lt;br /&gt;
&lt;br /&gt;
==== Fehlende Sensor-Typen und Readings ====&lt;br /&gt;
Für Anfänger ist zu empfehlen, nur Typen und Variablen zu nutzen, die in der 10_MYSENSORS_DEVICE.pm auch hinterlegt sind. Die Angaben dort zu &amp;quot;receives&amp;quot; und &amp;quot;sends&amp;quot; sind aus der Sicht der Node gemeint. Gibt es einzelne Sensor-Typen oder Readings (noch) nicht, gibt es folgende Möglichkeiten:&lt;br /&gt;
*Noch nicht vorhandene Typen kann man umgehen, indem man vergleichbare andere nimmt, also z.B. Wasser- statt Gaszähler (Stand: 11/2015)&lt;br /&gt;
*Fehlende Readings können auch &lt;br /&gt;
**in die 10_MYSENSORS_DEVICE.pm manuell eingepflegt werden, das automatische Anlegen geht dann aber ggf. bei einem Update wieder verloren&lt;br /&gt;
**manuell, z.B. &amp;lt;code&amp;gt;attr MYSENSOR_99 mapReading_ir_send3 3 ir_send&amp;lt;/code&amp;gt;&lt;br /&gt;
Ist das Reading einmal angelegt, wird es auch automatisch befüllt, sobald die Node einen entsprechenden Wert sendet.&lt;br /&gt;
&lt;br /&gt;
==== Austausch von Variablen oder Texten ====&lt;br /&gt;
Es ist möglich, Informationen auch bidirektional zwischen FHEM und den Nodes auszutauschen. Dies ermöglicht z.B. die Ansteuerung von Displays oder die Konfiguration von FHEM aus. Hierzu ist es am einfachsten, ein oder mehrere S_CUSTOM-Child zu präsentieren, die jeweils bis zu 5 Variablen ermöglichen. Die Zuordnung innerhalb der Node zu internen Variablen erfolgt dann über die Auswertung der Messages entsprechend der [https://forum.mysensors.org/topic/1817/weather-and-forecast-display-for-swedish-fhem-users/2 ChildID und der Variablennummer].&lt;br /&gt;
&lt;br /&gt;
==== OTA ====&lt;br /&gt;
MySensors unterstützt für NRF-Chips zwar grundsätzlich OTA-updates, man muß dafür aber vorübergehend einen anderen Controller als FHEM einsetzen (Stand 11/2016). &lt;br /&gt;
Ein Howto ist in diesem {{Link2Forum|Topic=59388.0|LinkText=Forenbeitrag}} zu finden.&lt;br /&gt;
Der dort verwendete Bootloader erwartet OTA-Updates fest auf Channel 76.&lt;br /&gt;
&lt;br /&gt;
== Links, Tricks, Kniffe und Erfahrungen ==&lt;br /&gt;
&lt;br /&gt;
=== Interessante Links ===&lt;br /&gt;
==== Offizielles Debugging-Schema ====&lt;br /&gt;
*[https://forum.mysensors.org/topic/666/debug-faq-and-how-ask-for-help Debug / FAQ bei MySensors.org]&lt;br /&gt;
==== Debug über Konsole (z.B. Putty) ====&lt;br /&gt;
* Über Picocom könnt ihr einfach das Gateway debuggen. Dazu in FHEM entsprechend das Device abschalten und Picocom wie folgt aufrufen. Dabei bitte /dev/ttyUSB0 entsprechend anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;picocom /dev/ttyUSB0  -b115200 --imap lfcrlf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Vorgehensweise zur Kombination von mehreren Sketchen/Sensoren an einer Node ====&lt;br /&gt;
Mehrere Sensoren (Children) kann man recht einfach an einen einzigen Arduino anschließen und ist dabei nur durch die Größe des Speichers begrenzt. Die Vorgehensweise erläutert dieses [https://forum.mysensors.org/topic/2597/combining-mysensors-examples/2 Beispiel] .&lt;br /&gt;
==== Verschlüsselung und Signierung ====&lt;br /&gt;
*{{Link2Forum|Topic=67248|LinkText=Forumsbeitrag zu MySensors Verschlüsselung und Signierung}}&lt;br /&gt;
*[https://www.mysensors.org/about/signing Darstellung bei MySensors.org]&lt;br /&gt;
&lt;br /&gt;
=== EEPROM ===&lt;br /&gt;
Die Nodes speichern einen Teil ihrer Einstellungen im sog. EEPROM. Dazu gehören z.B. die NodeID, der letzte bekannte &amp;quot;nächste&amp;quot; Punkt im Netzwert (RepeaterID) oder der Zustand von Relais. In der Regel ist nur die NodeID problematisch und kann beim flashen per Sketch auf einen anderen als den bisherigen Wert gestellt werden. Wer dennoch das EEPROM löschen möchte, muß den &#039;&#039;&#039;MySensor-Lösch-Sketch&#039;&#039;&#039; nehmen, der nicht &amp;quot;0000...&amp;quot; ins EEPROM schreibt wie der Arduino-Standard-Lösch-Sketch, sondern &amp;quot;FFFF...&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Funk-Themen (NRF-Chips) ===&lt;br /&gt;
Viele berichtete Probleme bei der Einrichtung von MySensors-Netzwerken haben ihren Ursprung in einer unzureichenden Funkverbindung. {{Hinweis|Ob dies der Fall ist, läßt sich leicht testen, indem man die fragliche Node wieder in die Nähe des Gateways bringt. Funktioniert es dort wie erwartet, liegt eine schlechte Funkverbindung vor.}}&lt;br /&gt;
&lt;br /&gt;
==== Abhilfemaßnahmen ====&lt;br /&gt;
*Einen bzw. mehrere [https://www.mysensors.org/build/connect_radio#connecting_a_decoupling-capacitor Kondensatoren] einlöten. Es sind auch fertige Module erhältlich, die diese Bauteile und einen Spannungsregler bereits enthalten, auf die der NRF mit einem Stecksockel aufgesteckt wird.&lt;br /&gt;
*Einen anderen Kanal wählen; die verwendeten Frequenzen liegen im b/g-WLAN-Bereich, so dass wechselseitige Störungen möglich sind. In Deutschland sind die Kanäle bis 84 erlaubt.&lt;br /&gt;
*NRF tauschen (Fake NRF-Chips sind zwar verwendbar, haben aber eine deutlich reduzierte Funkreichweite)&lt;br /&gt;
*Ein allgemeiner Guide zur Verwendung der nrf24l01+-Module ist [https://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo hier] zu finden.&lt;br /&gt;
*Für das Gateway empfielt es sich, ein Modul mit externer Antenne zu verwenden (NRF24L01+PA+LNA Antenna version).&lt;br /&gt;
*Einstellen des richtigen PA_LEVEL_...s: Insbesondere der Standardsketch für das serielle Gateway definiert diesen als LOW, was korrekt ist, wenn der interne Spannungsregler des Arduino verwendet ist. Besser ist es, die benötigten 3,3V mittels eines seperaten Spannungsreglers zu erzeugen und dann den PA_LEVEL_MAX einzustellen. &lt;br /&gt;
*Funkstrecken lassen sich recht unkompliziert mit Repeatern überbrücken. Dieser muß nicht zwingend eine eigene Node sein. Jede (sinnvollerweise nicht Batterie-gespeiste) Node kann per &amp;lt;code&amp;gt; #define MY_REPEATER_FEATURE &amp;lt;/code&amp;gt; zum Repeater gemacht werden.&lt;br /&gt;
*Sonstige Vorschläge ohne Erfolgsgarantie, aber mit Unterhaltungswert:&lt;br /&gt;
**[http://www.instructables.com/id/Enhanced-NRF24L01/ Eigenbau-Antennenverbesserung]&lt;br /&gt;
**[http://blog.blackoise.de/2016/02/fixing-your-cheap-nrf24l01-palna-module/ Schirmung]&lt;br /&gt;
&lt;br /&gt;
==== Buffer-Management ====&lt;br /&gt;
Die NRF-Chips haben nur einen begrenzten Speicher, um Nachrichten zu puffern. Dieser kann überlaufen, wenn in kurzer Folge Informationen versendet werden, z.B. mehr als 5 Temperaturwerte von 1-Wire-Sensoren. Diese Problematik verschärft sich bei der Verwendung von Message-Signing, weil dort die volle payload-Bandbreite für einzelne Nachrichten genutzt wird. Für Abhilfe sorgen kurze Pausen zwischen den einzelnen Sendungen, z.B. &amp;lt;code&amp;gt;wait(30);&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== RS485 ===&lt;br /&gt;
Seit 2.0.1 ist es möglich, statt der Funkmodule auch ein kabelgebundenes Netzwerk auf Basis von RS485-Modulen aufzubauen; hierfür werden 2 Adern als Datenleitung benötigt, die Zahl der Nodes in einem solchen Netzwerk ist bei Verwendung der Standardmodule auf 32 beschränkt, bei Verwendung anderer Transceiver sind auch mehr Nodes möglich. Hierfür ist ein seperates Gateway erforderlich.&lt;br /&gt;
&lt;br /&gt;
==== Bekannte Probleme bei RS485 ====&lt;br /&gt;
(Stand: 2.1.1) &lt;br /&gt;
&lt;br /&gt;
*Die Vergabe der Node-ID&#039;s muß im Sketch selbst erfolgen, die automatische Zuweisung funktioniert nicht.&lt;br /&gt;
*Die für die Anbindung der Module definierten PINs (8+9) sind tief im Code verankert und sollten nicht geändert werden.&lt;br /&gt;
*Sollte der Speicher knapp werden, empfielt es sich, statt der softserial-Variante HW_SERIAL zu verwenden. Dies benötigt ca. 10% weniger Speicher (ATmega328).&lt;br /&gt;
&lt;br /&gt;
=== Ablauf des Starts einer Node ===&lt;br /&gt;
Beim Start durchlaufen alle Nodes nacheinander bestimmte vordefinierte Programmroutinen in folgender Reihenfolge:&lt;br /&gt;
&lt;br /&gt;
==== Vorversionen ====&lt;br /&gt;
*setup()&lt;br /&gt;
*presentation()&lt;br /&gt;
*loop()&lt;br /&gt;
&lt;br /&gt;
==== seit MySensors 2.1.0 ====&lt;br /&gt;
*preHwInit()&lt;br /&gt;
*before()&lt;br /&gt;
*presentation()&lt;br /&gt;
*setup()&lt;br /&gt;
*loop()&lt;br /&gt;
&lt;br /&gt;
==== Im Detail ====&lt;br /&gt;
Dieser Ablauf ermöglicht, die Arduino-Pins vorzukonfigurieren und angeschlossenes Equipment an der für den Programmablauf richtigen Stelle zu initialisieren. Dies ist u.U. wichtig, da &lt;br /&gt;
*eine Node im Normalfall nicht in loop() geht, solange die presentation() nicht erfolgreich war (also solange der Controller nicht verfügbar ist). Eine Failsafe-Initialisierung von Schnittstellen sollte demnach in preHwInit() oder before() erfolgen. Es kann zusätzlich seit 2.1.1 auch die Option MY_TRANSPORT_WAIT_READY_MS min. auf 1 gesetzt werden, dann startet die loop() auch ohne Verbindung zum Gateway.&lt;br /&gt;
*die Initialisierung anderer SPI-Hardware auf einem gemeinsamen Bus mit den NRF-Modulem vor der presentation() erfolgen muß.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel-Sketche ===&lt;br /&gt;
*[https://forum.mysensors.org/topic/938/multisensor-multiactuator-sketch-testboard-tested-with-fhem-controller Mehrfachsensor], allerdings noch für MySensors Vers. 1.5.4&lt;br /&gt;
*Bidirektionale {{Link2Forum|Topic=26807|msg=449776|LinkText=&amp;quot;Infrarot-Fernbedienung&amp;quot;}} aus FHEM raus iVm. remotecontrol&lt;br /&gt;
*mehrere [https://github.com/rejoe2/MySensors-Dallas-Address-ChildID-Consistency Dallas-Temperatursensoren] auf einem Bus eindeutig erkennen&lt;br /&gt;
*[https://forum.mysensors.org/topic/1817/weather-and-forecast-display-for-swedish-fhem-users/2 Display] ansteuern&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MySensors_Starter_Guide&amp;diff=23160</id>
		<title>MySensors Starter Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MySensors_Starter_Guide&amp;diff=23160"/>
		<updated>2017-11-02T14:05:16Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Debug über Konsole (z.B. Putty) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Hinweis|Dieser Artikel ist im Aufbau und soll Einsteigern und Fortgeschrittenen als Referenzquelle für typische Fragen dienen. Alle sind eingeladen hier weitere Möglichkeiten einzubringen. Die beste Referenz für alle Fragen zu MySensors ist und bleibt aber die offizielle Hompage des Projekts!}}&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
[http://www.mysensors.org MySensors] ist ein open-Source-Projekt. Der Schwerpunkt liegt auf selbstgemachten Funk-Sensoren für die Hausautomatisierung und das &amp;quot;Internet der Dinge&amp;quot; in einer Art Baukastensystem. Die Bauanleitungen des Projekts für die einzelnen Musterbausteine sind in der Regel einfach nachzubauen, die Hard- und Softwarebauteile lassen sich dabei auch (fast beliebig) kombinieren. &lt;br /&gt;
&lt;br /&gt;
=== Nodes und Children===&lt;br /&gt;
==== Nodes ====&lt;br /&gt;
Die Kombination von einem Microcontroller und einem Funkchip wird jeweils als &amp;quot;Node&amp;quot; bezeichnet. &lt;br /&gt;
Ein MySensors-Netzwerk besteht also (in der Regel) aus mindestens zwei Nodes, nämlich einer Gateway-Node und einer Sensor-Node. Jede Node ist durch eine sog. NodeID innerhalb des Netzwerks eindeutig identifizierbar, wobei die &amp;quot;0&amp;quot; jeweils für das Gateway reserviert ist.&lt;br /&gt;
Als Microcontroller werden in der Regel Arduinos (Nano oder Micro) verwendet, für das GW häufiger auch [[ESP8266]]. Als Funkchips lassen sich derzeit Module mit nRF24L01+ und RFM69 verwenden, die allerdings jeweils eine eigene Funktechnik verwendet und daher innerhalb eines Netzwerks nicht gemischt werden können. Es kann auch ein kabelgebundenes Netzwerk auf Basis von RS485-Modulen aufgebaut werden; hierfür werden 2 Adern als Datenleitung benötigt.&lt;br /&gt;
==== Children ====&lt;br /&gt;
Als Child wird alles bezeichnet, was jeweils innerhalb einer Node unterschieden werden soll. Beispiel: An einer Node wird ein BME280 angeschlossen. Dies ist ein I2C-Sensor, der drei Werte liefert, nämlich Temperatur, Luftfeuchtigkeit und Luftdruck. Jeder dieser Meßgrößen erhält üblicherweise eine eigene ChildID zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Softwarestand ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Der Verfasser hat in der Vergangenheit festgestellt, dass die bei MySensors beteiligten Entwickler eventuelle Verbesserungen und Fehlerkorrekturen nicht mehr in die &amp;quot;stable&amp;quot;-Version rückportieren. Bei Problemen empfiehlt es sich daher, die jeweilige beta-Version zu testen. Hierzu muß aber in der Regel auch das verwendete Gateway auf diese Version upgedated werden.}}&lt;br /&gt;
Bei Abfassung dieses Artikels war &lt;br /&gt;
*1.8.0 der Stand der verwendeten Arduino-IDE&lt;br /&gt;
*2.1.1 die stable-Version von MySensors. &lt;br /&gt;
*2.2.0-beta der aktuelle Development-Zweig von Mysensors&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile von MySensors ===&lt;br /&gt;
==== Vorteile  ====&lt;br /&gt;
*Preisgünstig&lt;br /&gt;
*Modular, Elemente können (fast) beliebig kombiniert werden&lt;br /&gt;
*Es kann ein sog. ACK verlangt werden. Damit läßt sich sicherstellen, dass eine Node einen Befehl auch tatsächlich erhalten hat (Bidirektionalität).&lt;br /&gt;
*Auf den Microcontrollern kann eine eigene Funktionalität unabhängig von der zentralen FHEM-Instanz vorgesehen werden (z.B. LED-Licht direkt bei Bewegung schalten). Die Nodes können seit 2.0.1-beta dabei auch ohne Verbindung zum Gateway die loop() ausführen, wenn eine entsprechende Option aktiviert ist.&lt;br /&gt;
*MQTT kann unterstützt werden.&lt;br /&gt;
*Es kann auch eine kabelgebundene Infrastruktur aufgebaut werden (RS485, zwei Adern).&lt;br /&gt;
&lt;br /&gt;
==== Nachteile  ====&lt;br /&gt;
*Standardmäßig wird ein nicht verschüsselter Funkstandard verwendet, so dass von der Verwendung in sicherheitsrelevanten Funktionen (Türschließer usw.) abzuraten ist.&lt;br /&gt;
&lt;br /&gt;
==== Zum Start ====&lt;br /&gt;
Für erste Tests sind sinnvoll:&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=1. Für Sensbender-Boards sind spezielle [https://raw.githubusercontent.com/mysensors/ArduinoBoards/master/package_mysensors.org_index.json Board-Definitionen] für die IDE verfügbar. Nach den [https://github.com/mysensors/MySensors/releases Release Notes] sind diese ab der Version 2.0.0 zu empfehlen, die Installation erfolgt über File -&amp;gt; Preferencies -&amp;gt; Additional Boards Manager URLs&lt;br /&gt;
2. Manche neueren Boarddefinitionen aus der IDE führen u.U. zu häufigeren Reboots. Seit 1.6.18 scheint das Problem behoben zu sein, ansonsten ist ein Downgrade der Boarddefinitionen für AVR-Boards bis &amp;lt;=1.6.11 zu empfehlen.}}&lt;br /&gt;
*eine Arduino mit USB-Anschluß (Nano) oder ein ESP8266 &lt;br /&gt;
*ein weiterer Arduino Nano&lt;br /&gt;
*zwei nRF24L01+ (alternativ: zwei RFM69)&lt;br /&gt;
*Die Arduino-IDE &lt;br /&gt;
*die gewünschte Sensorik, also z.B. einen DS18B20+Widerstand, ein Bewegungsmelder-Modul, ... siehe dazu die [https://www.mysensors.org/build Build-Anleitungen bei MySensors.org], wo auch Bezugsquellen zu finden sind.&lt;br /&gt;
&lt;br /&gt;
== MySensors in FHEM ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Die Nutzung von MySensors in FHEM ist (nicht nur für den Anfänger) mit der standardmäßig eingeschalteten [[autocreate|autocreate-Funktion]] einfach umsetzbar. Die Kenntnis der FHEM-Grundlagen und Durcharbeitung der Anfänger-Lektüren wird im Folgenden vorausgesetzt. Insbesondere sind [[Erste Schritte in FHEM]] und [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM] Pflicht! Dort werden wesentliche Punkte für ein Verständnis von FHEM vermittelt, auch wenn manches nicht mehr ganz aktuell ist. So sollte man z.B. ein direktes Editieren der fhem.cfg unterlassen.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden immer wieder Auszüge aus der [[Konfiguration]] dargestellt. Diese dienen zur Erläuterung und Veranschaulichung. Die Bearbeitung der [[Konfiguration]] sollte - zur Verhinderung von Fehlern - nach Möglichkeit immer über das &amp;quot;[[Konfiguration#Befehl-Eingabefeld|Befehl-Eingabefeld]]&amp;quot; und die &amp;quot;[[Konfiguration#Objektdetails|Objektdetails]]&amp;quot; erfolgen.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung: Gateway ===&lt;br /&gt;
Zunächst ist das I/O-Device zu definieren, also das Gateway. Dies ist in [[MYSENSORS]] beschrieben.&lt;br /&gt;
{{Hinweis|Bei Verwendung eines seriellen Gateways ist zu empfehlen, einen Arduino mit orginalem FTDI-Chip zu verwenden und diesen mit der &amp;quot;by-id&amp;quot;-Methode ([[Trick_der_Woche#CUL_.26_CO_.C3.BCber_Serial_ID-einbinden]]) zuzuweisen. Beim Anschluß mehrer Arduinos mit einem CHG340/CHG341 an denselben Computer/Raspberry sind diese nur mit hohem {{Link2Forum|Topic=44926|Message=446809|LinkText=Aufwand}} eindeutig addressierbar.}}&lt;br /&gt;
{{Hinweis|Die Einbindung eines MySensors-Netzwerks kann auch über [http://fhem.de/commandref.html#MQTT MQTT] erfolgen. Dabei übernimmt ein MySensors-MQTT-Gateway die Kommunikation mit dem Broker. Der Autor hat hier jedoch keine eigene Erfahrung, bitte entsprechend nachtragen!}}&lt;br /&gt;
&lt;br /&gt;
Serielles Gateway am Raspberry PI:&lt;br /&gt;
 define MyGateway_0 MYSENSORS /dev/ttyUSB0@115200&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreicher Definition ist das Gateway im Raum &amp;quot;Everything&amp;quot; in der Gruppe &amp;quot;MYSENSORS&amp;quot; zu finden. Wenn unten &amp;quot;initialized&amp;quot; oder &amp;quot;opened&amp;quot; angezeigt wird, ist FHEM in der Lage, mit dem MySensors-Netz zu kommunizieren. Es sollte dann noch auf [[autocreate]] gestellt werden.&lt;br /&gt;
&lt;br /&gt;
=== Das Gateway ist auch ein MySensors-Device  ===&lt;br /&gt;
{{Hinweis|Sobald die ersten Meßwerte übertragen wurden, werden &#039;&#039;&#039;nach einem Browser-Refresh&#039;&#039;&#039; auch die aktuellen Meßwerte angezeigt, dies kann je nach Einstellung im Sketch aber einige Zeit dauern.}}&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Die Readings werden dem Modul MYSENSOR_DEVICE.pm entnommen. Sind diese dort nicht im Bereich &amp;quot;reads&amp;quot; bzw. &amp;quot;sends&amp;quot; enthalten, kann man fehlende Readings auch manuell anlegen. }}&lt;br /&gt;
Da am Gateway gleichzeitig auch bereits Sensoren angeschlossen sein können, legt FHEM direkt auch ein erstes [[MYSENSORS_DEVICE]] mit der NodeID &amp;quot;0&amp;quot; an. Sollten bereits ChildIDs im presentation()-Abschnitt des Gateway-Sketches enthalten gewesen sein, werden auch die zum Typ des präsentierten Sensor-Child-Typs passenden Readings automatisch angelegt. &lt;br /&gt;
&lt;br /&gt;
=== Das erste Funk-MySensors-Device ===&lt;br /&gt;
In der Regel ist aber das erste &amp;quot;echte&amp;quot; MySensors-Device die 2. Node, die neben dem Gateway in Betrieb genommen wird. Hier gilt das Vorgesagte entsprechend: Nach dem ersten Start sind neu erkannte Devices ebenfalls im Raum &amp;quot;Everything&amp;quot; in der Gruppe &amp;quot;MYSENSORS&amp;quot; zu finden, die readings werden automatisch angelegt. Sobald Meßwerte übermittelt werden, werden die Readings damit gefüllt und entsprechend der per Sketch programmierten Vorgaben aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Details der Wechselwirkung zwischen FHEM und MySensors ===&lt;br /&gt;
==== Vergabe der NodeID ====&lt;br /&gt;
Die Vergabe der NodeID kann entweder im einzelnen Sketch erfolgen oder automatisiert. Dabei vergibt FHEM in der Regel fortlaufend Nummern ab 100. Die erste Node mit automatischer Nummernvergabe ist daher in der Regel das Device MYSENSORS_100. &lt;br /&gt;
{{Hinweis|Die NodeID wird - wie einige weitere Informationen - im sog. EEPROM des Arduinos abgespeichert. Ist sie einmal vergeben, ändert sie sich auch bei einem erneuten flashen der Node nicht mehr, es sei denn, man gibt per &amp;quot;define&amp;quot; im Sketch eine andere NodeID vor.}}&lt;br /&gt;
&lt;br /&gt;
==== Fehlende Sensor-Typen und Readings ====&lt;br /&gt;
Für Anfänger ist zu empfehlen, nur Typen und Variablen zu nutzen, die in der 10_MYSENSORS_DEVICE.pm auch hinterlegt sind. Die Angaben dort zu &amp;quot;receives&amp;quot; und &amp;quot;sends&amp;quot; sind aus der Sicht der Node gemeint. Gibt es einzelne Sensor-Typen oder Readings (noch) nicht, gibt es folgende Möglichkeiten:&lt;br /&gt;
*Noch nicht vorhandene Typen kann man umgehen, indem man vergleichbare andere nimmt, also z.B. Wasser- statt Gaszähler (Stand: 11/2015)&lt;br /&gt;
*Fehlende Readings können auch &lt;br /&gt;
**in die 10_MYSENSORS_DEVICE.pm manuell eingepflegt werden, das automatische Anlegen geht dann aber ggf. bei einem Update wieder verloren&lt;br /&gt;
**manuell, z.B. &amp;lt;code&amp;gt;attr MYSENSOR_99 mapReading_ir_send3 3 ir_send&amp;lt;/code&amp;gt;&lt;br /&gt;
Ist das Reading einmal angelegt, wird es auch automatisch befüllt, sobald die Node einen entsprechenden Wert sendet.&lt;br /&gt;
&lt;br /&gt;
==== Austausch von Variablen oder Texten ====&lt;br /&gt;
Es ist möglich, Informationen auch bidirektional zwischen FHEM und den Nodes auszutauschen. Dies ermöglicht z.B. die Ansteuerung von Displays oder die Konfiguration von FHEM aus. Hierzu ist es am einfachsten, ein oder mehrere S_CUSTOM-Child zu präsentieren, die jeweils bis zu 5 Variablen ermöglichen. Die Zuordnung innerhalb der Node zu internen Variablen erfolgt dann über die Auswertung der Messages entsprechend der [https://forum.mysensors.org/topic/1817/weather-and-forecast-display-for-swedish-fhem-users/2 ChildID und der Variablennummer].&lt;br /&gt;
&lt;br /&gt;
==== OTA ====&lt;br /&gt;
MySensors unterstützt für NRF-Chips zwar grundsätzlich OTA-updates, man muß dafür aber vorübergehend einen anderen Controller als FHEM einsetzen (Stand 11/2016). &lt;br /&gt;
Ein Howto ist in diesem {{Link2Forum|Topic=59388.0|LinkText=Forenbeitrag}} zu finden.&lt;br /&gt;
Der dort verwendete Bootloader erwartet OTA-Updates fest auf Channel 76.&lt;br /&gt;
&lt;br /&gt;
== Links, Tricks, Kniffe und Erfahrungen ==&lt;br /&gt;
&lt;br /&gt;
=== Interessante Links ===&lt;br /&gt;
==== Offizielles Debugging-Schema ====&lt;br /&gt;
*[https://forum.mysensors.org/topic/666/debug-faq-and-how-ask-for-help Debug / FAQ bei MySensors.org]&lt;br /&gt;
==== Debug über Konsole (z.B. Putty) ====&lt;br /&gt;
* Über Picocom könnt ihr einfach das Gateway debuggen. Dazu in FHEM entsprechend das Device abschalten und Picocom wie folgt aufrufen. Dabei bitte /dev/ttyUSB0 entsprechend anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;picocom /dev/ttyUSB0  -b115200 --imap lfcrlf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Vorgehensweise zur Kombination von mehreren Sketchen/Sensoren an einer Node ====&lt;br /&gt;
Mehrere Sensoren (Children) kann man recht einfach an einen einzigen Arduino anschließen und ist dabei nur durch die Größe des Speichers begrenzt. Die Vorgehensweise erläutert dieses [https://forum.mysensors.org/topic/2597/combining-mysensors-examples/2 Beispiel] .&lt;br /&gt;
==== Verschlüsselung und Signierung ====&lt;br /&gt;
*{{Link2Forum|Topic=67248|LinkText=Forumsbeitrag zu MySensors Verschlüsselung und Signierung}}&lt;br /&gt;
*[https://www.mysensors.org/about/signing Darstellung bei MySensors.org]&lt;br /&gt;
&lt;br /&gt;
=== EEPROM ===&lt;br /&gt;
Die Nodes speichern einen Teil ihrer Einstellungen im sog. EEPROM. Dazu gehören z.B. die NodeID, der letzte bekannte &amp;quot;nächste&amp;quot; Punkt im Netzwert (RepeaterID) oder der Zustand von Relais. In der Regel ist nur die NodeID problematisch und kann beim flashen per Sketch auf einen anderen als den bisherigen Wert gestellt werden. Wer dennoch das EEPROM löschen möchte, muß den &#039;&#039;&#039;MySensor-Lösch-Sketch&#039;&#039;&#039; nehmen, der nicht &amp;quot;0000...&amp;quot; ins EEPROM schreibt wie der Arduino-Standard-Lösch-Sketch, sondern &amp;quot;FFFF...&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Funk-Themen (NRF-Chips) ===&lt;br /&gt;
Viele berichtete Probleme bei der Einrichtung von MySensors-Netzwerken haben ihren Ursprung in einer unzureichenden Funkverbindung. {{Hinweis|Ob dies der Fall ist, läßt sich leicht testen, indem man die fragliche Node wieder in die Nähe des Gateways bringt. Funktioniert es dort wie erwartet, liegt eine schlechte Funkverbindung vor.}}&lt;br /&gt;
&lt;br /&gt;
==== Abhilfemaßnahmen ====&lt;br /&gt;
*Einen bzw. mehrere [https://www.mysensors.org/build/connect_radio#connecting_a_decoupling-capacitor Kondensatoren] einlöten. Es sind auch fertige Module erhältlich, die diese Bauteile und einen Spannungsregler bereits enthalten, auf die der NRF mit einem Stecksockel aufgesteckt wird.&lt;br /&gt;
*Einen anderen Kanal wählen; die verwendeten Frequenzen liegen im b/g-WLAN-Bereich, so dass wechselseitige Störungen möglich sind. In Deutschland sind die Kanäle bis 84 erlaubt.&lt;br /&gt;
*NRF tauschen (Fake NRF-Chips sind zwar verwendbar, haben aber eine deutlich reduzierte Funkreichweite)&lt;br /&gt;
*Ein allgemeiner Guide zur Verwendung der nrf24l01+-Module ist [https://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo hier] zu finden.&lt;br /&gt;
*Für das Gateway empfielt es sich, ein Modul mit externer Antenne zu verwenden (NRF24L01+PA+LNA Antenna version).&lt;br /&gt;
*Einstellen des richtigen PA_LEVEL_...s: Insbesondere der Standardsketch für das serielle Gateway definiert diesen als LOW, was korrekt ist, wenn der interne Spannungsregler des Arduino verwendet ist. Besser ist es, die benötigten 3,3V mittels eines seperaten Spannungsreglers zu erzeugen und dann den PA_LEVEL_MAX einzustellen. &lt;br /&gt;
*Funkstrecken lassen sich recht unkompliziert mit Repeatern überbrücken. Dieser muß nicht zwingend eine eigene Node sein. Jede (sinnvollerweise nicht Batterie-gespeiste) Node kann per &amp;lt;code&amp;gt; #define MY_REPEATER_FEATURE &amp;lt;/code&amp;gt; zum Repeater gemacht werden.&lt;br /&gt;
*Sonstige Vorschläge ohne Erfolgsgarantie, aber mit Unterhaltungswert:&lt;br /&gt;
**[http://www.instructables.com/id/Enhanced-NRF24L01/ Eigenbau-Antennenverbesserung]&lt;br /&gt;
**[http://blog.blackoise.de/2016/02/fixing-your-cheap-nrf24l01-palna-module/ Schirmung]&lt;br /&gt;
&lt;br /&gt;
==== Buffer-Management ====&lt;br /&gt;
Die NRF-Chips haben nur einen begrenzten Speicher, um Nachrichten zu puffern. Dieser kann überlaufen, wenn in kurzer Folge Informationen versendet werden, z.B. mehr als 5 Temperaturwerte von 1-Wire-Sensoren. Diese Problematik verschärft sich bei der Verwendung von Message-Signing, weil dort die volle payload-Bandbreite für einzelne Nachrichten genutzt wird. Für Abhilfe sorgen kurze Pausen zwischen den einzelnen Sendungen, z.B. &amp;lt;code&amp;gt;wait(30);&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== RS485 ===&lt;br /&gt;
Seit 2.0.1 ist es möglich, statt der Funkmodule auch ein kabelgebundenes Netzwerk auf Basis von RS485-Modulen aufzubauen; hierfür werden 2 Adern als Datenleitung benötigt, die Zahl der Nodes in einem solchen Netzwerk ist bei Verwendung der Standardmodule auf 32 beschränkt, bei Verwendung anderer Transceiver sind auch mehr Nodes möglich. Hierfür ist ein seperates Gateway erforderlich.&lt;br /&gt;
&lt;br /&gt;
==== Bekannte Probleme bei RS485 ====&lt;br /&gt;
(Stand: 2.1.1) &lt;br /&gt;
&lt;br /&gt;
*Die Vergabe der Node-ID&#039;s muß im Sketch selbst erfolgen, die automatische Zuweisung funktioniert nicht.&lt;br /&gt;
*Die für die Anbindung der Module definierten PINs (8+9) sind tief im Code verankert und sollten nicht geändert werden.&lt;br /&gt;
*Sollte der Speicher knapp werden, empfielt es sich, statt der softserial-Variante HW_SERIAL zu verwenden. Dies benötigt ca. 10% weniger Speicher (ATmega328).&lt;br /&gt;
&lt;br /&gt;
=== Ablauf des Starts einer Node ===&lt;br /&gt;
Beim Start durchlaufen alle Nodes nacheinander bestimmte vordefinierte Programmroutinen in folgender Reihenfolge:&lt;br /&gt;
&lt;br /&gt;
==== Vorversionen ====&lt;br /&gt;
*setup()&lt;br /&gt;
*presentation()&lt;br /&gt;
*loop()&lt;br /&gt;
&lt;br /&gt;
==== seit MySensors 2.1.0 ====&lt;br /&gt;
*preHwInit()&lt;br /&gt;
*before()&lt;br /&gt;
*presentation()&lt;br /&gt;
*setup()&lt;br /&gt;
*loop()&lt;br /&gt;
&lt;br /&gt;
==== Im Detail ====&lt;br /&gt;
Dieser Ablauf ermöglicht, die Arduino-Pins vorzukonfigurieren und angeschlossenes Equipment an der für den Programmablauf richtigen Stelle zu initialisieren. Dies ist u.U. wichtig, da &lt;br /&gt;
*eine Node im Normalfall nicht in loop() geht, solange die presentation() nicht erfolgreich war (also solange der Controller nicht verfügbar ist). Eine Failsafe-Initialisierung von Schnittstellen sollte demnach in preHwInit() oder before() erfolgen. Es kann zusätzlich seit 2.1.1 auch die Option MY_TRANSPORT_WAIT_READY_MS min. auf 1 gesetzt werden, dann startet die loop() auch ohne Verbindung zum Gateway.&lt;br /&gt;
*die Initialisierung anderer SPI-Hardware auf einem gemeinsamen Bus mit den NRF-Modulem vor der presentation() erfolgen muß.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel-Sketche ===&lt;br /&gt;
*[https://forum.mysensors.org/topic/938/multisensor-multiactuator-sketch-testboard-tested-with-fhem-controller Mehrfachsensor], allerdings noch für MySensors Vers. 1.5.4&lt;br /&gt;
*Bidirektionale {{Link2Forum|Topic=26807|msg=449776|LinkText=&amp;quot;Infrarot-Fernbedienung&amp;quot;}} aus FHEM raus iVm. remotecontrol&lt;br /&gt;
*mehrere [https://github.com/rejoe2/MySensors-Dallas-Address-ChildID-Consistency Dallas-Temperatursensoren] auf einem Bus eindeutig erkennen&lt;br /&gt;
*[https://forum.mysensors.org/topic/1817/weather-and-forecast-display-for-swedish-fhem-users/2 Display] ansteuern&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MySensors_Starter_Guide&amp;diff=23159</id>
		<title>MySensors Starter Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MySensors_Starter_Guide&amp;diff=23159"/>
		<updated>2017-11-02T14:04:41Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Offizielles Debugging-Schema */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Hinweis|Dieser Artikel ist im Aufbau und soll Einsteigern und Fortgeschrittenen als Referenzquelle für typische Fragen dienen. Alle sind eingeladen hier weitere Möglichkeiten einzubringen. Die beste Referenz für alle Fragen zu MySensors ist und bleibt aber die offizielle Hompage des Projekts!}}&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
[http://www.mysensors.org MySensors] ist ein open-Source-Projekt. Der Schwerpunkt liegt auf selbstgemachten Funk-Sensoren für die Hausautomatisierung und das &amp;quot;Internet der Dinge&amp;quot; in einer Art Baukastensystem. Die Bauanleitungen des Projekts für die einzelnen Musterbausteine sind in der Regel einfach nachzubauen, die Hard- und Softwarebauteile lassen sich dabei auch (fast beliebig) kombinieren. &lt;br /&gt;
&lt;br /&gt;
=== Nodes und Children===&lt;br /&gt;
==== Nodes ====&lt;br /&gt;
Die Kombination von einem Microcontroller und einem Funkchip wird jeweils als &amp;quot;Node&amp;quot; bezeichnet. &lt;br /&gt;
Ein MySensors-Netzwerk besteht also (in der Regel) aus mindestens zwei Nodes, nämlich einer Gateway-Node und einer Sensor-Node. Jede Node ist durch eine sog. NodeID innerhalb des Netzwerks eindeutig identifizierbar, wobei die &amp;quot;0&amp;quot; jeweils für das Gateway reserviert ist.&lt;br /&gt;
Als Microcontroller werden in der Regel Arduinos (Nano oder Micro) verwendet, für das GW häufiger auch [[ESP8266]]. Als Funkchips lassen sich derzeit Module mit nRF24L01+ und RFM69 verwenden, die allerdings jeweils eine eigene Funktechnik verwendet und daher innerhalb eines Netzwerks nicht gemischt werden können. Es kann auch ein kabelgebundenes Netzwerk auf Basis von RS485-Modulen aufgebaut werden; hierfür werden 2 Adern als Datenleitung benötigt.&lt;br /&gt;
==== Children ====&lt;br /&gt;
Als Child wird alles bezeichnet, was jeweils innerhalb einer Node unterschieden werden soll. Beispiel: An einer Node wird ein BME280 angeschlossen. Dies ist ein I2C-Sensor, der drei Werte liefert, nämlich Temperatur, Luftfeuchtigkeit und Luftdruck. Jeder dieser Meßgrößen erhält üblicherweise eine eigene ChildID zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Softwarestand ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Der Verfasser hat in der Vergangenheit festgestellt, dass die bei MySensors beteiligten Entwickler eventuelle Verbesserungen und Fehlerkorrekturen nicht mehr in die &amp;quot;stable&amp;quot;-Version rückportieren. Bei Problemen empfiehlt es sich daher, die jeweilige beta-Version zu testen. Hierzu muß aber in der Regel auch das verwendete Gateway auf diese Version upgedated werden.}}&lt;br /&gt;
Bei Abfassung dieses Artikels war &lt;br /&gt;
*1.8.0 der Stand der verwendeten Arduino-IDE&lt;br /&gt;
*2.1.1 die stable-Version von MySensors. &lt;br /&gt;
*2.2.0-beta der aktuelle Development-Zweig von Mysensors&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile von MySensors ===&lt;br /&gt;
==== Vorteile  ====&lt;br /&gt;
*Preisgünstig&lt;br /&gt;
*Modular, Elemente können (fast) beliebig kombiniert werden&lt;br /&gt;
*Es kann ein sog. ACK verlangt werden. Damit läßt sich sicherstellen, dass eine Node einen Befehl auch tatsächlich erhalten hat (Bidirektionalität).&lt;br /&gt;
*Auf den Microcontrollern kann eine eigene Funktionalität unabhängig von der zentralen FHEM-Instanz vorgesehen werden (z.B. LED-Licht direkt bei Bewegung schalten). Die Nodes können seit 2.0.1-beta dabei auch ohne Verbindung zum Gateway die loop() ausführen, wenn eine entsprechende Option aktiviert ist.&lt;br /&gt;
*MQTT kann unterstützt werden.&lt;br /&gt;
*Es kann auch eine kabelgebundene Infrastruktur aufgebaut werden (RS485, zwei Adern).&lt;br /&gt;
&lt;br /&gt;
==== Nachteile  ====&lt;br /&gt;
*Standardmäßig wird ein nicht verschüsselter Funkstandard verwendet, so dass von der Verwendung in sicherheitsrelevanten Funktionen (Türschließer usw.) abzuraten ist.&lt;br /&gt;
&lt;br /&gt;
==== Zum Start ====&lt;br /&gt;
Für erste Tests sind sinnvoll:&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=1. Für Sensbender-Boards sind spezielle [https://raw.githubusercontent.com/mysensors/ArduinoBoards/master/package_mysensors.org_index.json Board-Definitionen] für die IDE verfügbar. Nach den [https://github.com/mysensors/MySensors/releases Release Notes] sind diese ab der Version 2.0.0 zu empfehlen, die Installation erfolgt über File -&amp;gt; Preferencies -&amp;gt; Additional Boards Manager URLs&lt;br /&gt;
2. Manche neueren Boarddefinitionen aus der IDE führen u.U. zu häufigeren Reboots. Seit 1.6.18 scheint das Problem behoben zu sein, ansonsten ist ein Downgrade der Boarddefinitionen für AVR-Boards bis &amp;lt;=1.6.11 zu empfehlen.}}&lt;br /&gt;
*eine Arduino mit USB-Anschluß (Nano) oder ein ESP8266 &lt;br /&gt;
*ein weiterer Arduino Nano&lt;br /&gt;
*zwei nRF24L01+ (alternativ: zwei RFM69)&lt;br /&gt;
*Die Arduino-IDE &lt;br /&gt;
*die gewünschte Sensorik, also z.B. einen DS18B20+Widerstand, ein Bewegungsmelder-Modul, ... siehe dazu die [https://www.mysensors.org/build Build-Anleitungen bei MySensors.org], wo auch Bezugsquellen zu finden sind.&lt;br /&gt;
&lt;br /&gt;
== MySensors in FHEM ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Die Nutzung von MySensors in FHEM ist (nicht nur für den Anfänger) mit der standardmäßig eingeschalteten [[autocreate|autocreate-Funktion]] einfach umsetzbar. Die Kenntnis der FHEM-Grundlagen und Durcharbeitung der Anfänger-Lektüren wird im Folgenden vorausgesetzt. Insbesondere sind [[Erste Schritte in FHEM]] und [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM] Pflicht! Dort werden wesentliche Punkte für ein Verständnis von FHEM vermittelt, auch wenn manches nicht mehr ganz aktuell ist. So sollte man z.B. ein direktes Editieren der fhem.cfg unterlassen.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden immer wieder Auszüge aus der [[Konfiguration]] dargestellt. Diese dienen zur Erläuterung und Veranschaulichung. Die Bearbeitung der [[Konfiguration]] sollte - zur Verhinderung von Fehlern - nach Möglichkeit immer über das &amp;quot;[[Konfiguration#Befehl-Eingabefeld|Befehl-Eingabefeld]]&amp;quot; und die &amp;quot;[[Konfiguration#Objektdetails|Objektdetails]]&amp;quot; erfolgen.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung: Gateway ===&lt;br /&gt;
Zunächst ist das I/O-Device zu definieren, also das Gateway. Dies ist in [[MYSENSORS]] beschrieben.&lt;br /&gt;
{{Hinweis|Bei Verwendung eines seriellen Gateways ist zu empfehlen, einen Arduino mit orginalem FTDI-Chip zu verwenden und diesen mit der &amp;quot;by-id&amp;quot;-Methode ([[Trick_der_Woche#CUL_.26_CO_.C3.BCber_Serial_ID-einbinden]]) zuzuweisen. Beim Anschluß mehrer Arduinos mit einem CHG340/CHG341 an denselben Computer/Raspberry sind diese nur mit hohem {{Link2Forum|Topic=44926|Message=446809|LinkText=Aufwand}} eindeutig addressierbar.}}&lt;br /&gt;
{{Hinweis|Die Einbindung eines MySensors-Netzwerks kann auch über [http://fhem.de/commandref.html#MQTT MQTT] erfolgen. Dabei übernimmt ein MySensors-MQTT-Gateway die Kommunikation mit dem Broker. Der Autor hat hier jedoch keine eigene Erfahrung, bitte entsprechend nachtragen!}}&lt;br /&gt;
&lt;br /&gt;
Serielles Gateway am Raspberry PI:&lt;br /&gt;
 define MyGateway_0 MYSENSORS /dev/ttyUSB0@115200&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreicher Definition ist das Gateway im Raum &amp;quot;Everything&amp;quot; in der Gruppe &amp;quot;MYSENSORS&amp;quot; zu finden. Wenn unten &amp;quot;initialized&amp;quot; oder &amp;quot;opened&amp;quot; angezeigt wird, ist FHEM in der Lage, mit dem MySensors-Netz zu kommunizieren. Es sollte dann noch auf [[autocreate]] gestellt werden.&lt;br /&gt;
&lt;br /&gt;
=== Das Gateway ist auch ein MySensors-Device  ===&lt;br /&gt;
{{Hinweis|Sobald die ersten Meßwerte übertragen wurden, werden &#039;&#039;&#039;nach einem Browser-Refresh&#039;&#039;&#039; auch die aktuellen Meßwerte angezeigt, dies kann je nach Einstellung im Sketch aber einige Zeit dauern.}}&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Die Readings werden dem Modul MYSENSOR_DEVICE.pm entnommen. Sind diese dort nicht im Bereich &amp;quot;reads&amp;quot; bzw. &amp;quot;sends&amp;quot; enthalten, kann man fehlende Readings auch manuell anlegen. }}&lt;br /&gt;
Da am Gateway gleichzeitig auch bereits Sensoren angeschlossen sein können, legt FHEM direkt auch ein erstes [[MYSENSORS_DEVICE]] mit der NodeID &amp;quot;0&amp;quot; an. Sollten bereits ChildIDs im presentation()-Abschnitt des Gateway-Sketches enthalten gewesen sein, werden auch die zum Typ des präsentierten Sensor-Child-Typs passenden Readings automatisch angelegt. &lt;br /&gt;
&lt;br /&gt;
=== Das erste Funk-MySensors-Device ===&lt;br /&gt;
In der Regel ist aber das erste &amp;quot;echte&amp;quot; MySensors-Device die 2. Node, die neben dem Gateway in Betrieb genommen wird. Hier gilt das Vorgesagte entsprechend: Nach dem ersten Start sind neu erkannte Devices ebenfalls im Raum &amp;quot;Everything&amp;quot; in der Gruppe &amp;quot;MYSENSORS&amp;quot; zu finden, die readings werden automatisch angelegt. Sobald Meßwerte übermittelt werden, werden die Readings damit gefüllt und entsprechend der per Sketch programmierten Vorgaben aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Details der Wechselwirkung zwischen FHEM und MySensors ===&lt;br /&gt;
==== Vergabe der NodeID ====&lt;br /&gt;
Die Vergabe der NodeID kann entweder im einzelnen Sketch erfolgen oder automatisiert. Dabei vergibt FHEM in der Regel fortlaufend Nummern ab 100. Die erste Node mit automatischer Nummernvergabe ist daher in der Regel das Device MYSENSORS_100. &lt;br /&gt;
{{Hinweis|Die NodeID wird - wie einige weitere Informationen - im sog. EEPROM des Arduinos abgespeichert. Ist sie einmal vergeben, ändert sie sich auch bei einem erneuten flashen der Node nicht mehr, es sei denn, man gibt per &amp;quot;define&amp;quot; im Sketch eine andere NodeID vor.}}&lt;br /&gt;
&lt;br /&gt;
==== Fehlende Sensor-Typen und Readings ====&lt;br /&gt;
Für Anfänger ist zu empfehlen, nur Typen und Variablen zu nutzen, die in der 10_MYSENSORS_DEVICE.pm auch hinterlegt sind. Die Angaben dort zu &amp;quot;receives&amp;quot; und &amp;quot;sends&amp;quot; sind aus der Sicht der Node gemeint. Gibt es einzelne Sensor-Typen oder Readings (noch) nicht, gibt es folgende Möglichkeiten:&lt;br /&gt;
*Noch nicht vorhandene Typen kann man umgehen, indem man vergleichbare andere nimmt, also z.B. Wasser- statt Gaszähler (Stand: 11/2015)&lt;br /&gt;
*Fehlende Readings können auch &lt;br /&gt;
**in die 10_MYSENSORS_DEVICE.pm manuell eingepflegt werden, das automatische Anlegen geht dann aber ggf. bei einem Update wieder verloren&lt;br /&gt;
**manuell, z.B. &amp;lt;code&amp;gt;attr MYSENSOR_99 mapReading_ir_send3 3 ir_send&amp;lt;/code&amp;gt;&lt;br /&gt;
Ist das Reading einmal angelegt, wird es auch automatisch befüllt, sobald die Node einen entsprechenden Wert sendet.&lt;br /&gt;
&lt;br /&gt;
==== Austausch von Variablen oder Texten ====&lt;br /&gt;
Es ist möglich, Informationen auch bidirektional zwischen FHEM und den Nodes auszutauschen. Dies ermöglicht z.B. die Ansteuerung von Displays oder die Konfiguration von FHEM aus. Hierzu ist es am einfachsten, ein oder mehrere S_CUSTOM-Child zu präsentieren, die jeweils bis zu 5 Variablen ermöglichen. Die Zuordnung innerhalb der Node zu internen Variablen erfolgt dann über die Auswertung der Messages entsprechend der [https://forum.mysensors.org/topic/1817/weather-and-forecast-display-for-swedish-fhem-users/2 ChildID und der Variablennummer].&lt;br /&gt;
&lt;br /&gt;
==== OTA ====&lt;br /&gt;
MySensors unterstützt für NRF-Chips zwar grundsätzlich OTA-updates, man muß dafür aber vorübergehend einen anderen Controller als FHEM einsetzen (Stand 11/2016). &lt;br /&gt;
Ein Howto ist in diesem {{Link2Forum|Topic=59388.0|LinkText=Forenbeitrag}} zu finden.&lt;br /&gt;
Der dort verwendete Bootloader erwartet OTA-Updates fest auf Channel 76.&lt;br /&gt;
&lt;br /&gt;
== Links, Tricks, Kniffe und Erfahrungen ==&lt;br /&gt;
&lt;br /&gt;
=== Interessante Links ===&lt;br /&gt;
==== Offizielles Debugging-Schema ====&lt;br /&gt;
*[https://forum.mysensors.org/topic/666/debug-faq-and-how-ask-for-help Debug / FAQ bei MySensors.org]&lt;br /&gt;
==== Debug über Konsole (z.B. Putty) ====&lt;br /&gt;
* Über Picocom könnt ihr einfach das Gateway debuggen. Dazu in FHEM entsprechend das Device abschalten und Picocom wie folgt aufrufen: picocom /dev/ttyUSB0  -b115200 --imap lfcrlf&lt;br /&gt;
/dev/ttyUSB0 bitte entsprechend anpassen.&lt;br /&gt;
&lt;br /&gt;
==== Vorgehensweise zur Kombination von mehreren Sketchen/Sensoren an einer Node ====&lt;br /&gt;
Mehrere Sensoren (Children) kann man recht einfach an einen einzigen Arduino anschließen und ist dabei nur durch die Größe des Speichers begrenzt. Die Vorgehensweise erläutert dieses [https://forum.mysensors.org/topic/2597/combining-mysensors-examples/2 Beispiel] .&lt;br /&gt;
==== Verschlüsselung und Signierung ====&lt;br /&gt;
*{{Link2Forum|Topic=67248|LinkText=Forumsbeitrag zu MySensors Verschlüsselung und Signierung}}&lt;br /&gt;
*[https://www.mysensors.org/about/signing Darstellung bei MySensors.org]&lt;br /&gt;
&lt;br /&gt;
=== EEPROM ===&lt;br /&gt;
Die Nodes speichern einen Teil ihrer Einstellungen im sog. EEPROM. Dazu gehören z.B. die NodeID, der letzte bekannte &amp;quot;nächste&amp;quot; Punkt im Netzwert (RepeaterID) oder der Zustand von Relais. In der Regel ist nur die NodeID problematisch und kann beim flashen per Sketch auf einen anderen als den bisherigen Wert gestellt werden. Wer dennoch das EEPROM löschen möchte, muß den &#039;&#039;&#039;MySensor-Lösch-Sketch&#039;&#039;&#039; nehmen, der nicht &amp;quot;0000...&amp;quot; ins EEPROM schreibt wie der Arduino-Standard-Lösch-Sketch, sondern &amp;quot;FFFF...&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Funk-Themen (NRF-Chips) ===&lt;br /&gt;
Viele berichtete Probleme bei der Einrichtung von MySensors-Netzwerken haben ihren Ursprung in einer unzureichenden Funkverbindung. {{Hinweis|Ob dies der Fall ist, läßt sich leicht testen, indem man die fragliche Node wieder in die Nähe des Gateways bringt. Funktioniert es dort wie erwartet, liegt eine schlechte Funkverbindung vor.}}&lt;br /&gt;
&lt;br /&gt;
==== Abhilfemaßnahmen ====&lt;br /&gt;
*Einen bzw. mehrere [https://www.mysensors.org/build/connect_radio#connecting_a_decoupling-capacitor Kondensatoren] einlöten. Es sind auch fertige Module erhältlich, die diese Bauteile und einen Spannungsregler bereits enthalten, auf die der NRF mit einem Stecksockel aufgesteckt wird.&lt;br /&gt;
*Einen anderen Kanal wählen; die verwendeten Frequenzen liegen im b/g-WLAN-Bereich, so dass wechselseitige Störungen möglich sind. In Deutschland sind die Kanäle bis 84 erlaubt.&lt;br /&gt;
*NRF tauschen (Fake NRF-Chips sind zwar verwendbar, haben aber eine deutlich reduzierte Funkreichweite)&lt;br /&gt;
*Ein allgemeiner Guide zur Verwendung der nrf24l01+-Module ist [https://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo hier] zu finden.&lt;br /&gt;
*Für das Gateway empfielt es sich, ein Modul mit externer Antenne zu verwenden (NRF24L01+PA+LNA Antenna version).&lt;br /&gt;
*Einstellen des richtigen PA_LEVEL_...s: Insbesondere der Standardsketch für das serielle Gateway definiert diesen als LOW, was korrekt ist, wenn der interne Spannungsregler des Arduino verwendet ist. Besser ist es, die benötigten 3,3V mittels eines seperaten Spannungsreglers zu erzeugen und dann den PA_LEVEL_MAX einzustellen. &lt;br /&gt;
*Funkstrecken lassen sich recht unkompliziert mit Repeatern überbrücken. Dieser muß nicht zwingend eine eigene Node sein. Jede (sinnvollerweise nicht Batterie-gespeiste) Node kann per &amp;lt;code&amp;gt; #define MY_REPEATER_FEATURE &amp;lt;/code&amp;gt; zum Repeater gemacht werden.&lt;br /&gt;
*Sonstige Vorschläge ohne Erfolgsgarantie, aber mit Unterhaltungswert:&lt;br /&gt;
**[http://www.instructables.com/id/Enhanced-NRF24L01/ Eigenbau-Antennenverbesserung]&lt;br /&gt;
**[http://blog.blackoise.de/2016/02/fixing-your-cheap-nrf24l01-palna-module/ Schirmung]&lt;br /&gt;
&lt;br /&gt;
==== Buffer-Management ====&lt;br /&gt;
Die NRF-Chips haben nur einen begrenzten Speicher, um Nachrichten zu puffern. Dieser kann überlaufen, wenn in kurzer Folge Informationen versendet werden, z.B. mehr als 5 Temperaturwerte von 1-Wire-Sensoren. Diese Problematik verschärft sich bei der Verwendung von Message-Signing, weil dort die volle payload-Bandbreite für einzelne Nachrichten genutzt wird. Für Abhilfe sorgen kurze Pausen zwischen den einzelnen Sendungen, z.B. &amp;lt;code&amp;gt;wait(30);&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== RS485 ===&lt;br /&gt;
Seit 2.0.1 ist es möglich, statt der Funkmodule auch ein kabelgebundenes Netzwerk auf Basis von RS485-Modulen aufzubauen; hierfür werden 2 Adern als Datenleitung benötigt, die Zahl der Nodes in einem solchen Netzwerk ist bei Verwendung der Standardmodule auf 32 beschränkt, bei Verwendung anderer Transceiver sind auch mehr Nodes möglich. Hierfür ist ein seperates Gateway erforderlich.&lt;br /&gt;
&lt;br /&gt;
==== Bekannte Probleme bei RS485 ====&lt;br /&gt;
(Stand: 2.1.1) &lt;br /&gt;
&lt;br /&gt;
*Die Vergabe der Node-ID&#039;s muß im Sketch selbst erfolgen, die automatische Zuweisung funktioniert nicht.&lt;br /&gt;
*Die für die Anbindung der Module definierten PINs (8+9) sind tief im Code verankert und sollten nicht geändert werden.&lt;br /&gt;
*Sollte der Speicher knapp werden, empfielt es sich, statt der softserial-Variante HW_SERIAL zu verwenden. Dies benötigt ca. 10% weniger Speicher (ATmega328).&lt;br /&gt;
&lt;br /&gt;
=== Ablauf des Starts einer Node ===&lt;br /&gt;
Beim Start durchlaufen alle Nodes nacheinander bestimmte vordefinierte Programmroutinen in folgender Reihenfolge:&lt;br /&gt;
&lt;br /&gt;
==== Vorversionen ====&lt;br /&gt;
*setup()&lt;br /&gt;
*presentation()&lt;br /&gt;
*loop()&lt;br /&gt;
&lt;br /&gt;
==== seit MySensors 2.1.0 ====&lt;br /&gt;
*preHwInit()&lt;br /&gt;
*before()&lt;br /&gt;
*presentation()&lt;br /&gt;
*setup()&lt;br /&gt;
*loop()&lt;br /&gt;
&lt;br /&gt;
==== Im Detail ====&lt;br /&gt;
Dieser Ablauf ermöglicht, die Arduino-Pins vorzukonfigurieren und angeschlossenes Equipment an der für den Programmablauf richtigen Stelle zu initialisieren. Dies ist u.U. wichtig, da &lt;br /&gt;
*eine Node im Normalfall nicht in loop() geht, solange die presentation() nicht erfolgreich war (also solange der Controller nicht verfügbar ist). Eine Failsafe-Initialisierung von Schnittstellen sollte demnach in preHwInit() oder before() erfolgen. Es kann zusätzlich seit 2.1.1 auch die Option MY_TRANSPORT_WAIT_READY_MS min. auf 1 gesetzt werden, dann startet die loop() auch ohne Verbindung zum Gateway.&lt;br /&gt;
*die Initialisierung anderer SPI-Hardware auf einem gemeinsamen Bus mit den NRF-Modulem vor der presentation() erfolgen muß.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel-Sketche ===&lt;br /&gt;
*[https://forum.mysensors.org/topic/938/multisensor-multiactuator-sketch-testboard-tested-with-fhem-controller Mehrfachsensor], allerdings noch für MySensors Vers. 1.5.4&lt;br /&gt;
*Bidirektionale {{Link2Forum|Topic=26807|msg=449776|LinkText=&amp;quot;Infrarot-Fernbedienung&amp;quot;}} aus FHEM raus iVm. remotecontrol&lt;br /&gt;
*mehrere [https://github.com/rejoe2/MySensors-Dallas-Address-ChildID-Consistency Dallas-Temperatursensoren] auf einem Bus eindeutig erkennen&lt;br /&gt;
*[https://forum.mysensors.org/topic/1817/weather-and-forecast-display-for-swedish-fhem-users/2 Display] ansteuern&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Einrichten_knxd_mit_MDT_SCN-IP000.02&amp;diff=21668</id>
		<title>Einrichten knxd mit MDT SCN-IP000.02</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Einrichten_knxd_mit_MDT_SCN-IP000.02&amp;diff=21668"/>
		<updated>2017-06-05T09:59:57Z</updated>

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

		<summary type="html">&lt;p&gt;Rspecht: /* Durchsage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Durchsage ==&lt;br /&gt;
Ausgangslage: Ein FHEM mit funktionierender Sprachausgabe (Text2Speech) über den angeschlossenen Lautsprecher.&lt;br /&gt;
Ziel: Die gleiche Durchsage auch auf allen SNOM 370 Telefonden abspielen.&lt;br /&gt;
&lt;br /&gt;
Da die Snom-Geräte Audiomulticast unterstützen kommt dieses hier zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
Aktiviert wird es in den Einstellungen des Telefons. Hierzu muss am Telefon mit dem Knopf &#039;&#039;&#039;Settings&#039;&#039;&#039; das Einstellungsmenü aufgerufen werden. Hier kann man über den Eintrag &#039;&#039;&#039;Wartung&#039;&#039;&#039; und dann den Eintrag &#039;&#039;&#039;Administratormodus&#039;&#039;&#039; das Webfrontend freischalten.&lt;br /&gt;
Nun geht es vom PC aus mit dem Browser weiter. Dazu die IP des Telefons eingeben und unter &#039;&#039;&#039;Ewetiert&#039;&#039;&#039; den Reiter &#039;&#039;&#039;SIP/RTP&#039;&#039;&#039; anwählen.&lt;br /&gt;
Ganz unten gibt es nun eine Tabelle namens &#039;&#039;&#039;Multicast&#039;&#039;&#039; wo wir die &#039;&#039;&#039;Multicast Unterstützung&#039;&#039;&#039; auf &#039;&#039;&#039;An&#039;&#039;&#039; setzen. Darunter geben wir die Multicast IP Adresse sowie den dazugehörigen Port ein. Als Multicast IP kann man sich irgendwas im Range  224.0.0.0 - 239.255.255.255 aussuchen. Hier gibt es keine Abhängigkeit vom lokalen Subnetz - Wieso, Weshalb und Warum findet ihr in den RFC&#039;s [https://tools.ietf.org/html/rfc5771].&lt;br /&gt;
&lt;br /&gt;
Dann geht es auf dem Raspberry Pi weiter - hier benötigt man FFMPEG. Ihr müsst es selbst kompilieren da in dem raspian Paket keine Filter eingebaut sind. Dazu findet ihr alles unter [http://www.jeffreythompson.org/blog/2014/11/13/installing-ffmpeg-for-raspberry-pi/].&lt;br /&gt;
&lt;br /&gt;
Den ersten Test startet ihr mit folgendem Befehl: Bitte denkt daran die IP, den Port sowie die MP3 Datei (auf eine vorhandene) anzupassen.&lt;br /&gt;
 ffmpeg -re -i &amp;quot;/opt/fhem/cache/d08c473c8d5f7f1b7ac252ce80d0b12a.mp3&amp;quot; -filter_complex &#039;aresample=8000,asetnsamples=n=160,volume=0.25&#039; -acodec pcm_mulaw -ac 1 -vn -f rtp rtp://IP:PORT&lt;br /&gt;
&lt;br /&gt;
Um es in FHEM aufrufen zu dürfen benötigt ihr einen SUDO Eintrag:&lt;br /&gt;
 fhem    ALL=NOPASSWD: /usr/local/bin/ffmpeg *&lt;br /&gt;
&lt;br /&gt;
Unter FHEM ist es z.B. aus einem Notify wie folgt ansprechbar:&lt;br /&gt;
 system(&#039;ffmpeg -re -i /opt/fhem/&amp;quot;&#039; . $value . &#039;&amp;quot; -filter_complex &amp;quot;aresample=8000,asetnsamples=n=160,volume=0.25&amp;quot; -acodec pcm_mulaw -ac 1 -vn -f rtp rtp://IP:PORT&#039;);&lt;br /&gt;
&lt;br /&gt;
Damit das Text2Speech Modul ein passendes Notify abwirft müsst ihr an den Quellcode von dem Modul:&lt;br /&gt;
Dazu öffnet ihr die Datei 98_Text2Speech.pm und springt auf Zeile 619 - Dass ist das Ende der Routine &#039;&#039;sub Text2Speech_BuildMplayerCmdString($$) {&#039;&#039; und fügt vor dem &#039;&#039;&#039;return $cmd;&#039;&#039;&#039; folgende Zeile ein:&lt;br /&gt;
 readingsSingleUpdate($hash, &amp;quot;file&amp;quot;, $file, 1);&lt;br /&gt;
Nun wird bei jedem Zusammenbau des Mplayer Kommandos der Dateiname an FHEM übergeben und kann dort über ein Notify ausgewertet werden.&lt;br /&gt;
&lt;br /&gt;
Nun noch das Notify anlegen:&lt;br /&gt;
&lt;br /&gt;
 MyTTS {&lt;br /&gt;
  my $command = (substr($EVENT, 0, 4));;&lt;br /&gt;
  my $value = (substr($EVENT, 6,(length($EVENT)-1)));;&lt;br /&gt;
  Log 1, &amp;quot;$EVENT&amp;quot;;;&lt;br /&gt;
  if($command eq &amp;quot;file&amp;quot;) {&lt;br /&gt;
    Log 1, &amp;quot;$value&amp;quot;;;&lt;br /&gt;
    system(&#039;ffmpeg -re -i /opt/fhem/&amp;quot;&#039; . $value . &#039;&amp;quot; -filter_complex &amp;quot;aresample=8000,asetnsamples=n=160,volume=0.25&amp;quot; -acodec pcm_mulaw -ac 1 -vn -f rtp rtp://IP:PORT&#039;);&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SNOM&amp;diff=14926</id>
		<title>SNOM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SNOM&amp;diff=14926"/>
		<updated>2016-04-01T12:58:11Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Durchsage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Durchsage ==&lt;br /&gt;
Ausgangslage: Ein FHEM mit funktionierender Sprachausgabe (Text2Speech) über den angeschlossenen Lautsprecher.&lt;br /&gt;
Ziel: Die gleiche Durchsage auch auf allen SNOM 370 Telefonden abspielen.&lt;br /&gt;
&lt;br /&gt;
Da die Snom-Geräte Audiomulticast unterstützen kommt dieses hier zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
Aktiviert wird es in den Einstellungen des Telefons. Hierzu muss am Telefon mit dem Knopf &#039;&#039;&#039;Settings&#039;&#039;&#039; das Einstellungsmenü aufgerufen werden. Hier kann man über den Eintrag &#039;&#039;&#039;Wartung&#039;&#039;&#039; und dann den Eintrag &#039;&#039;&#039;Administratormodus&#039;&#039;&#039; das Webfrontend freischalten.&lt;br /&gt;
Nun geht es vom PC aus mit dem Browser weiter. Dazu die IP des Telefons eingeben und unter &#039;&#039;&#039;Ewetiert&#039;&#039;&#039; den Reiter &#039;&#039;&#039;SIP/RTP&#039;&#039;&#039; anwählen.&lt;br /&gt;
Ganz unten gibt es nun eine Tabelle namens &#039;&#039;&#039;Multicast&#039;&#039;&#039; wo wir die &#039;&#039;&#039;Multicast Unterstützung&#039;&#039;&#039; auf &#039;&#039;&#039;An&#039;&#039;&#039; setzen. Darunter geben wir die Multicast IP Adresse sowie den dazugehörigen Port ein. Als Multicast IP kann man sich irgendwas im Range  224.0.0.0 - 239.255.255.255 aussuchen. Hier gibt es keine Abhängigkeit vom lokalen Subnetz - Wieso, Weshalb und Warum findet ihr in den RFC&#039;s [https://tools.ietf.org/html/rfc5771].&lt;br /&gt;
&lt;br /&gt;
Dann geht es auf dem Raspberry Pi weiter - hier benötigt man FFMPEG. Ihr müsst es selbst kompilieren da in dem raspian Paket keine Filter eingebaut sind. Dazu findet ihr alles unter [http://www.jeffreythompson.org/blog/2014/11/13/installing-ffmpeg-for-raspberry-pi/].&lt;br /&gt;
&lt;br /&gt;
Den ersten Test startet ihr mit folgendem Befehl: Bitte denkt daran die IP, den Port sowie die MP3 Datei (auf eine vorhandene) anzupassen.&lt;br /&gt;
 ffmpeg -re -i &amp;quot;/opt/fhem/cache/d08c473c8d5f7f1b7ac252ce80d0b12a.mp3&amp;quot; -filter_complex &#039;aresample=8000,asetnsamples=n=160,volume=0.25&#039; -acodec pcm_mulaw -ac 1 -vn -f rtp rtp://IP:PORT&lt;br /&gt;
&lt;br /&gt;
Um es in FHEM aufrufen zu dürfen benötigt ihr einen SUDO Eintrag:&lt;br /&gt;
 fhem    ALL=NOPASSWD: /usr/local/bin/ffmpeg *&lt;br /&gt;
&lt;br /&gt;
Unter FHEM ist es z.B. aus einem Notify wie folgt ansprechbar:&lt;br /&gt;
 system(&#039;ffmpeg -re -i /opt/fhem/&amp;quot;&#039; . $value . &#039;&amp;quot; -filter_complex &amp;quot;aresample=8000,asetnsamples=n=160,volume=0.25&amp;quot; -acodec pcm_mulaw -ac 1 -vn -f rtp rtp://IP:PORT&#039;);&lt;br /&gt;
&lt;br /&gt;
Damit das Text2Speech Modul ein passendes Notify abwirft müsst ihr an den Quellcode von dem Modul:&lt;br /&gt;
Dazu öffnet ihr die Datei 98_Text2Speech.pm und springt auf Zeile 619 - Dass ist das Ende der Routine &#039;&#039;sub Text2Speech_BuildMplayerCmdString($$) {&#039;&#039; und fügt vor dem &#039;&#039;&#039;return $cmd;&#039;&#039;&#039; folgende Zeile ein:&lt;br /&gt;
 readingsSingleUpdate($hash, &amp;quot;file&amp;quot;, $file, 1);&lt;br /&gt;
Nun wird bei jedem Zusammenbau des Mplayer Kommandos der Dateiname an FHEM übergeben und kann dort über ein Notify ausgewertet werden.&lt;br /&gt;
&lt;br /&gt;
Nun noch das Notify anlegen:&lt;br /&gt;
&lt;br /&gt;
 MyTTS {&lt;br /&gt;
  my $command = (substr($EVENT, 0, 4));;&lt;br /&gt;
  my $value = (substr($EVENT, 6,(length($EVENT)-1)));;&lt;br /&gt;
  Log 1, &amp;quot;$EVENT&amp;quot;;;&lt;br /&gt;
  if($command eq &amp;quot;file&amp;quot;) {&lt;br /&gt;
    Log 1, &amp;quot;$value&amp;quot;;;&lt;br /&gt;
    system(&#039;ffmpeg -re -i /opt/fhem/&amp;quot;&#039; . $value . &#039;&amp;quot; -filter_complex &amp;quot;aresample=8000,asetnsamples=n=160,volume=0.25&amp;quot; -acodec pcm_mulaw -ac 1 -vn -f rtp rtp://IP:PORT&#039;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SNOM&amp;diff=14923</id>
		<title>SNOM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SNOM&amp;diff=14923"/>
		<updated>2016-04-01T11:12:45Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Durchsage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Durchsage ==&lt;br /&gt;
FFMPEG bauen: &lt;br /&gt;
http://www.jeffreythompson.org/blog/2014/11/13/installing-ffmpeg-for-raspberry-pi/&lt;br /&gt;
&lt;br /&gt;
Snom Freigabe auf seite ...?&lt;br /&gt;
&lt;br /&gt;
erster test: ffmpeg -re -i &amp;quot;/opt/fhem/cache/d08c473c8d5f7f1b7ac252ce80d0b12a.mp3&amp;quot; -filter_complex &#039;aresample=8000,asetnsamples=n=160,volume=0.25&#039; -acodec pcm_mulaw -ac 1 -vn -f rtp rtp://IP:PORT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dann noch sudo freigeben:&lt;br /&gt;
fhem    ALL=NOPASSWD: /usr/local/bin/ffmpeg *&lt;br /&gt;
&lt;br /&gt;
Ein notify mit dateinamen erzeugen lassen:&lt;br /&gt;
&lt;br /&gt;
    readingsSingleUpdate($hash, &amp;quot;file&amp;quot;, $file, 1); in 98_Text2Speech.pm einbauen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;  if(-e $file) { # Datei existiert jetzt&lt;br /&gt;
    readingsSingleUpdate($hash, &amp;quot;file&amp;quot;, $file, 1);&lt;br /&gt;
    $cmd = Text2Speech_BuildMplayerCmdString($hash, $file);&lt;br /&gt;
    Log3 $hash-&amp;gt;{NAME}, 4, &amp;quot;Text2Speech: &amp;quot; .$cmd;&lt;br /&gt;
    system($cmd);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und das Notify anlegen:&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
MyTTS {&lt;br /&gt;
  my $command = (substr($EVENT, 0, 4));;&lt;br /&gt;
  my $value = (substr($EVENT, 6,(length($EVENT)-1)));;&lt;br /&gt;
  Log 1, &amp;quot;$EVENT&amp;quot;;;&lt;br /&gt;
  if($command eq &amp;quot;file&amp;quot;) {&lt;br /&gt;
    Log 1, &amp;quot;$value&amp;quot;;;&lt;br /&gt;
    system(&#039;ffmpeg -re -i /opt/fhem/&amp;quot;&#039; . $value . &#039;&amp;quot; -filter_complex &amp;quot;aresample=8000,asetnsamples=n=160,volume=0.25&amp;quot; -acodec pcm_mulaw -ac 1 -vn -f rtp rtp://IP:PORT&#039;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei mir ist die Podcast IP:PORT 238.255.255.252:5432 im 192.168er Netz...&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SNOM&amp;diff=14921</id>
		<title>SNOM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SNOM&amp;diff=14921"/>
		<updated>2016-04-01T07:40:17Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: Die Seite wurde neu angelegt: „== Durchsage == FFMPEG bauen:  http://www.jeffreythompson.org/blog/2014/11/13/installing-ffmpeg-for-raspberry-pi/  Snom Freigabe auf seite ...?  erster test: f…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Durchsage ==&lt;br /&gt;
FFMPEG bauen: &lt;br /&gt;
http://www.jeffreythompson.org/blog/2014/11/13/installing-ffmpeg-for-raspberry-pi/&lt;br /&gt;
&lt;br /&gt;
Snom Freigabe auf seite ...?&lt;br /&gt;
&lt;br /&gt;
erster test: ffmpeg -re -i &amp;quot;/opt/fhem/cache/d08c473c8d5f7f1b7ac252ce80d0b12a.mp3&amp;quot; -filter_complex &#039;aresample=8000,asetnsamples=n=160,volume=0.25&#039; -acodec pcm_mulaw -ac 1 -vn -f rtp rtp://IP:PORT&lt;br /&gt;
&lt;br /&gt;
fhem    ALL=NOPASSWD: /usr/local/bin/ffmpeg *&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Yowsup&amp;diff=12698</id>
		<title>Yowsup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Yowsup&amp;diff=12698"/>
		<updated>2015-10-28T21:37:14Z</updated>

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

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

		<summary type="html">&lt;p&gt;Rspecht: /* Ausgabestil (hier rechtsbündig) */&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 und deren Steuerung&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=readingsGroup&lt;br /&gt;
|ModForumArea=Frontends&lt;br /&gt;
|ModTechName=33_readingsGroup.pm&lt;br /&gt;
|ModOwner=Andre ([http://forum.fhem.de/index.php?action=profile;u=430 Forum] / [[Benutzer Diskussion:justme|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Fhem-[[:Kategorie:Hilfsmodul|Hilfsmodul]] [[readingsGroup]] bietet eine einfache Möglichkeit, &#039;&#039;Readings&#039;&#039; (kein Präfix vor dem Reading-Namen), &#039;&#039;Internals&#039;&#039; (Präfix &amp;quot;+&amp;quot; vor dem Namen des internen Wertes) und &#039;&#039;Attributes&#039;&#039; (Präfix &amp;quot;?&amp;quot; vor dem Namen des Attributs) von einem oder mehreren &#039;&#039;Devices&#039;&#039; darzustellen und flexibel zu formatieren.&lt;br /&gt;
&lt;br /&gt;
Die Aktualisierung im Browserfenster geschieht per longpoll und überträgt nur die jeweils geänderten Zellen. Wenn eine readingsGroup in keinem Browserfenster angezeigt wird findet keine longpoll aktualisierung statt.&lt;br /&gt;
&lt;br /&gt;
== Definition == &lt;br /&gt;
Siehe [http://fhem.de/commandref.html#readingsGroup commandref].&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
{{Randnotiz|RNText=In allen Mappings die einen Hash verwenden muss der Key (das was jeweils links von =&amp;gt; Operator steht) in Anführungszeichen stehen. Die einzige Ausnahme hiervon sind Keys die aus einem String bestehen der mit einem Buchstaben beginnt und nur Buchstaben und Zahlen enthält.}}&lt;br /&gt;
Weitergehende Erläuterungen zu einzelnen Attributen.&lt;br /&gt;
&lt;br /&gt;
Die komplette Liste der Attribute ist der commandref zu entnehmen.&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;
* &amp;lt;code&amp;gt;list TYPE=readingsGroup&amp;lt;/code&amp;gt;&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;
=== nolinks ===&lt;br /&gt;
Devicenamen und Titel der readingsGroup verlinken nicht mehr zur zugehörigen Detailansicht und sind nicht mehr anklickbar.&lt;br /&gt;
&lt;br /&gt;
=== nostate ===&lt;br /&gt;
Das state-Reading wird bei regex match nicht berücksichtigt und nicht angezeigt.&lt;br /&gt;
&lt;br /&gt;
=== notime ===&lt;br /&gt;
Es werden keine Timestamps für die Readings angezeigt. Nur für einspaltige readingsGroups sinnvoll.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Bitte beachten: die folgenden Beispiele enthalten keine Maskierungen oder Verdoppelungen für ; und Zeilenende, sondern sind so angegeben, wie sie im [[PGM2|Web Interface]] im Befehls-Eingabefeld, nach Klick auf DEF und im Attribut-Eingabefeld 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;
=== Übersicht HomeMatic Geräte ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define HM_Components readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Name&amp;gt;,&amp;lt;Model&amp;gt;,&amp;lt;S/N&amp;gt; TYPE=CUL_HM:+NAME,?model,D-serialNr&amp;lt;/nowiki&amp;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_barometric_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 RSSI Wert aller Devices (am IODev &#039;&#039;cul&#039;&#039;) 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 RSSI Wert mit der zugehörigen Zeit aller Devices (am IODev &#039;&#039;cul&#039;&#039;) 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=2 | [[Datei:rgculRSSI2.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
|attr culRSSI valueStyle {return undef if($READING =~ m/TIME/); ($VALUE &amp;lt;= -85)?&#039;style=&amp;quot;color:red&amp;quot;&#039;:($VALUE &amp;lt;= -80)?&#039;style=&amp;quot;color:yellow&amp;quot;&#039;:undef}&lt;br /&gt;
|Schlechte RSSI Werte sollen abhängig von zwei Schwellwerten gelb oder rot eingefärbt werden (auf dem Screenshot nicht zu sehen).&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|220px]]&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;
&lt;br /&gt;
=== LightScene DropDown-Menü für smallscreen Styles oder Floorplan ===&lt;br /&gt;
&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 lcDropDown meineLightScene:!state&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für die LightScene &#039;&#039;meineLightScene&#039;&#039; soll ein DropDown-Menü zur Auswahl der Szene erstellt werden.&lt;br /&gt;
| rowspan=6 |&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr lcDropDown commands { state =&amp;gt; &#039;scene:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Anzeige des state Readings wird auf das DropDown-Menü für das scene Kommando gemapped.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr lcDropDown nonames 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Keine Readingnamen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr lcDropDown notime 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Kein Timestamp&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-temp,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 {&#039;temperature&#039; =&amp;gt; &amp;quot;%.0f °C&amp;quot;, &#039;desiredTemperature&#039; =&amp;gt; &amp;quot;%.0f °C&amp;quot;, &#039;valveposition&#039; =&amp;gt;&amp;quot;%.0f %%&amp;quot;, &#039;maxValveSetting&#039; =&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;pre&amp;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;
 }&amp;lt;/pre&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;
=== Heizungswerte, Status, Steuerung und Wochenprofil ===&lt;br /&gt;
Dieses Beispiel funktioniert nur mit HomeMatic HM-CC-RT-DN, für andere Thermostate müssen an diversen Stellen Änderungen vorgenommen werden.&lt;br /&gt;
{{Todo|Überarbeiten}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:RgThermostate.png|thumb|750px|links|Status, Steuerung und Wochenprofil]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;pre&amp;gt;set d_label Heizung Heizung &lt;br /&gt;
set d_label Temperatur Temperatur &lt;br /&gt;
set d_label  Status Status &lt;br /&gt;
set d_label Wochenplan Wochenplan &lt;br /&gt;
set d_label Werktag Werktag &lt;br /&gt;
set d_label Samstag Samstag &lt;br /&gt;
set d_label Sonntag Sonntag &lt;br /&gt;
set d_label Zeitraum1 Zeitraum 1 &lt;br /&gt;
set d_label Zeitraum2 Zeitraum 2 &amp;lt;/pre&amp;gt;&lt;br /&gt;
|Erzeugen der Readings im Device [[dummy#d_label|d_label]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt; &lt;br /&gt;
define rg_thermostate readingsGroup &amp;lt;&amp;gt;,Heizung@d_label,&amp;lt;|&amp;gt;,Temperatur@d_label,&amp;lt;|&amp;gt;,Status@d_label,&amp;lt;|&amp;gt;,Wochenplan@d_label,&amp;lt;|&amp;gt;,Werktag@d_label,&amp;lt;|&amp;gt;,Samstag@d_label,&amp;lt;|&amp;gt;,Sonntag@d_label,&amp;lt;|&amp;gt;,&amp;lt;&amp;gt; CUL_HM_HM_CC_RT_DN_......_Clima:&amp;lt;&amp;gt;,?alias,&amp;lt;|&amp;gt;,&amp;lt;Soll&amp;gt;,desired-temp,&amp;lt;Tag&amp;gt;,dayTemp@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},impossible@{$DEVICE},&amp;lt;|&amp;gt;,controlMode,R-globalBtnLock@{rg($DEVICE.&amp;quot;§device&amp;quot;)},&amp;lt;|&amp;gt;,Zeitraum1@d_label,&amp;lt;|&amp;gt;,workday_period_1_start@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},workday_period_1_stop@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},&amp;lt;|&amp;gt;,saturday_period_1_start@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},saturday_period_1_stop@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},&amp;lt;|&amp;gt;,sunday_period_1_start@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},sunday_period_1_stop@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},&amp;lt;|&amp;gt;,impossible@{$DEVICE},&amp;lt;%system_fhem_update&amp;gt;,&amp;lt;nowiki&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/nowiki&amp;gt;,state@{rg($DEVICE.&amp;quot;§device&amp;quot;)},&amp;lt;%getConfig&amp;gt;,&amp;lt;|&amp;gt;,&amp;lt;Ist&amp;gt;,measured-temp,&amp;lt;Nacht&amp;gt;,nightTemp@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},&amp;lt;|&amp;gt;,&amp;lt;Ventil&amp;gt;,ValvePosition,&amp;lt;|&amp;gt;,Zeitraum2@d_label,&amp;lt;|&amp;gt;,workday_period_2_start@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},workday_period_2_stop@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},&amp;lt;|&amp;gt;,saturday_period_2_start@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},saturday_period_2_stop@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},&amp;lt;|&amp;gt;,sunday_period_2_start@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},sunday_period_2_stop@{rg($DEVICE.&amp;quot;§clima&amp;quot;)},&amp;lt;|&amp;gt;,impossible@{$DEVICE},impossible@{rg($DEVICE.&amp;quot;§device&amp;quot;)},&amp;lt;%burstXmit&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse readings aller Devices &amp;lt;b&amp;gt;CUL_HM_HM_CC_RT_DN_......_Clima&amp;lt;/b&amp;gt;, entsprechender [[Makefine#d_climaControl|d_climaControl]] (müssen vorher angelegt werden) und [[dummy#d_label|d_label]]. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_thermostate commands { &#039;desired-temp&#039; =&amp;gt; &#039;desired-temp:&#039;, &#039;dayTemp&#039; =&amp;gt; &#039;dayTemp:&#039;, &#039;controlMode&#039; =&amp;gt; &#039;trigger ntfy_rg $DEVICE controlMode&#039;, &#039;R-globalBtnLock&#039; =&amp;gt; &#039;trigger ntfy_rg $DEVICE globalBtnLock&#039;, &#039;workday_period_1_start&#039; =&amp;gt; &#039;workday_period_1_start:&#039;, &#039;workday_period_1_stop&#039; =&amp;gt; &#039;workday_period_1_stop:&#039;, &#039;saturday_period_1_start&#039; =&amp;gt; &#039;saturday_period_1_start:&#039;, &#039;saturday_period_1_stop&#039; =&amp;gt; &#039;saturday_period_1_stop:&#039;, &#039;sunday_period_1_start&#039; =&amp;gt; &#039;sunday_period_1_start:&#039;, &#039;sunday_period_1_stop&#039; =&amp;gt; &#039;sunday_period_1_stop:&#039;, &#039;rg_thermostate.system_fhem_update&#039; =&amp;gt; &#039;trigger ntfy_rg $DEVICE setTimeTable&#039;, &#039;rg_thermostate.getConfig&#039; =&amp;gt; &#039;set $DEVICE getConfig&#039;, &#039;nightTemp&#039; =&amp;gt; &#039;nightTemp:&#039;, &#039;workday_period_2_start&#039; =&amp;gt; &#039;workday_period_2_start:&#039;, &#039;workday_period_2_stop&#039; =&amp;gt; &#039;workday_period_2_stop:&#039;, &#039;saturday_period_2_start&#039; =&amp;gt; &#039;saturday_period_2_start:&#039;, &#039;saturday_period_2_stop&#039; =&amp;gt; &#039;saturday_period_2_stop:&#039;, &#039;sunday_period_2_start&#039; =&amp;gt; &#039;sunday_period_2_start:&#039;, &#039;sunday_period_2_stop&#039; =&amp;gt; &#039;sunday_period_2_stop:&#039;, &#039;rg_thermostate.burstXmit&#039; =&amp;gt; &#039;set $DEVICE burstXmit&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Temperaturen werden als DropDown Auswahl dargestellt, Icons triggern [[readingsGroup#sub_rg|ntfy_rg]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_thermostate mapping { &#039;desired-temp&#039; =&amp;gt; &#039;&#039;, &#039;dayTemp&#039; =&amp;gt; &#039;&#039;, &#039;workday_period_1_start&#039; =&amp;gt; &#039;&#039;, &#039;workday_period_1_stop&#039; =&amp;gt; &#039;&#039;, &#039;saturday_period_1_start&#039; =&amp;gt; &#039;&#039;, &#039;saturday_period_1_stop&#039; =&amp;gt; &#039;&#039;, &#039;sunday_period_1_start&#039; =&amp;gt; &#039;&#039;, &#039;sunday_period_1_stop&#039; =&amp;gt; &#039;&#039;, &#039;nightTemp&#039; =&amp;gt; &#039;&#039;, &#039;workday_period_2_start&#039; =&amp;gt; &#039;&#039;, &#039;workday_period_2_stop&#039; =&amp;gt; &#039;&#039;, &#039;saturday_period_2_start&#039; =&amp;gt; &#039;&#039;, &#039;saturday_period_2_stop&#039; =&amp;gt; &#039;&#039;, &#039;sunday_period_2_start&#039; =&amp;gt; &#039;&#039;, &#039;sunday_period_2_stop&#039; =&amp;gt; &#039;&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausblenden der Texte vor den DropDowns.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt; &lt;br /&gt;
attr rg_thermostate nameStyle{($READING eq &amp;quot;Soll&amp;quot; ||$READING eq &amp;quot;Tag&amp;quot; ||$READING eq &amp;quot;%getConfig&amp;quot; ||$READING eq &amp;quot;Ist&amp;quot; ||$READING eq &amp;quot;Nacht&amp;quot; ||$READING eq &amp;quot;Ventil&amp;quot; )?&#039;style=&amp;quot;text-align:right&amp;quot;&#039; :($READING eq &amp;quot;%burstXmit&amp;quot; )?&#039;style=&amp;quot;text-align:center&amp;quot;&#039; :&#039;style=&amp;quot;&amp;quot;&#039;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausrichten der Überschriften die keine readings sind.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_thermostate nonames 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausblenden der Device Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_thermostate valueColumns { &#039;Heizung&#039; =&amp;gt; &#039;colspan=&amp;quot;2&amp;quot;&#039;, &#039;Temperatur&#039; =&amp;gt; &#039;colspan=&amp;quot;4&amp;quot;&#039;, &#039;Status&#039; =&amp;gt; &#039;colspan=&amp;quot;2&amp;quot;&#039;, &#039;Werktag&#039; =&amp;gt; &#039;colspan=&amp;quot;2&amp;quot;&#039;, &#039;Samstag&#039; =&amp;gt; &#039;colspan=&amp;quot;2&amp;quot;&#039;, &#039;Sonntag&#039; =&amp;gt; &#039;colspan=&amp;quot;2&amp;quot;&#039;, &#039;alias&#039; =&amp;gt; &#039;colspan=&amp;quot;2&amp;quot;&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Readings sollen über mehrere Spalten dargestellt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_thermostate valueFormat { &#039;measured-temp&#039; =&amp;gt; &amp;quot;%0.1f &amp;amp;deg;C&amp;quot;, &#039;ValvePosition&#039; =&amp;gt; &amp;quot;%0.1f %%&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Formatierung für measured-temp und ValvePosition.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_thermostate valueIcon { &#039;controlMode.auto&#039; =&amp;gt; &#039;sani_heating_automatic@green&#039;, &#039;controlMode.set_auto&#039; =&amp;gt; &#039;sani_heating_automatic@orange&#039;, &#039;controlMode.manual&#039; =&amp;gt; &#039;sani_heating_manual@red&#039;, &#039;controlMode.set_manual&#039; =&amp;gt; &#039;sani_heating_manual@orange&#039;, &#039;R-globalBtnLock.on&#039; =&amp;gt; &#039;secur_locked@green&#039;, &#039;R-globalBtnLock.on &#039; =&amp;gt; &#039;secur_locked@green&#039;, &#039;R-globalBtnLock.set_on &#039; =&amp;gt; &#039;secur_locked@orange&#039;, &#039;R-globalBtnLock.off&#039; =&amp;gt; &#039;secur_open@red&#039;, &#039;R-globalBtnLock.off &#039; =&amp;gt; &#039;secur_open@red&#039;, &#039;R-globalBtnLock.set_off &#039; =&amp;gt; &#039;secur_open@orange&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Zuweisung der Icons.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
attr rg_thermostate valueStyle{($READING eq &amp;quot;Heizung&amp;quot; ||$READING eq &amp;quot;Temperatur&amp;quot; ||$READING eq &amp;quot;Status&amp;quot; ||$READING eq &amp;quot;Wochenplan&amp;quot; ||$READING eq &amp;quot;Werktag&amp;quot; ||$READING eq &amp;quot;Samstag&amp;quot; ||$READING eq &amp;quot;Sonntag&amp;quot; )?&#039;style=&amp;quot;font-size:20px;;color:RoyalBlue;;text-align:center&amp;quot;&#039; :($READING eq &amp;quot;alias&amp;quot; )?&#039;style=&amp;quot;font-size:11px;;font-weight:bold;;text-align:left&amp;quot;&#039; :($READING eq &amp;quot;ValvePosition&amp;quot; &amp;amp;&amp;amp;$VALUE &amp;gt; 40 )?&#039;style=&amp;quot;font-weight:bold;;color:Orange;;text-align:left&amp;quot;&#039; :($READING eq &amp;quot;desired-temp&amp;quot; ||$READING eq &amp;quot;measured-temp&amp;quot; )?&#039;style=&amp;quot;text-align:center&amp;quot;&#039; :($READING eq &amp;quot;state&amp;quot; ||$READING eq &amp;quot;ValvePosition&amp;quot; )?&#039;style=&amp;quot;text-align:left&amp;quot;&#039; :&#039;style=&amp;quot;text-align:right&amp;quot;&#039;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausrichten und Einfärben der Readings.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Heizungsteuerung für HM Wand- und Heizkörperthermostate ===&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel wurde für HM-TC-IT-WM-W-EU / HM-CC-RT-DN Geräte erstellt. Verwendung anderer Thermostate wird ggf. Anpassungen erforderlich machen. Die Geräte werden nicht automatisch ermittelt, sondern sind einzeln angegeben.&lt;br /&gt;
Es werden Soll- und Ist-Temperaturen angezeigt, Luftfeuchte und Ventilpositionen, Modus, Batterie und Global-Tastenlock.&lt;br /&gt;
Steuerungsmöglichkeiten: Solltemperatur, Modus (Manual/Automatik), (globale) Tastenlock.&lt;br /&gt;
Die Abweichung der Isttemperatur, die Ventilpositionen, Batteriestand etc. werden farblich hervorgehoben. &lt;br /&gt;
&lt;br /&gt;
Die Gerätenamen (EG_WZ_WT01_Climate / EG_WZ_WT01, EG_WZ_TT01_Clima / EG_WZ_TT01 / EG_WZ_TT02, OG_BZ_WT01_Climate / OG_BZ_WT01, OG_BZ_TT01_Clima / OG_BZ_TT01, OG_SZ_WT01_Climate / OG_SZ_WT01, OG_SZ_TT01_Clima / OG_SZ_TT01, OG_DZ_WT01_Climate / OG_DZ_WT01, OG_DZ_TT01_Clima / OG_DZ_TT01) müssen natürlich entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:RgHMTh.jpg|thumb|500px|links|Status, Steuerung und Wochenprofil]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;define heatingInfo readingsGroup &amp;lt;%sani_heating&amp;gt;,&amp;lt;Soll&amp;gt;,&amp;lt;Soll neu&amp;gt;,&amp;lt;Ist&amp;gt;,&amp;lt;Ventil / RH&amp;gt;,&amp;lt;Modus&amp;gt;,&amp;lt;Lock&amp;gt;,&amp;lt;Bat&amp;gt;\&amp;lt;br&amp;gt;&lt;br /&gt;
EG_WZ_WT01_Climate:desired-temp,&amp;lt;sollsetz&amp;gt;,measured-temp,humidity,controlMode,R-globalBtnLock@EG_WZ_WT01,batteryLevel@EG_WZ_WT01 \&amp;lt;br&amp;gt;&lt;br /&gt;
EG_WZ_TT01_Clima:desired-temp,&amp;lt;&amp;gt;,measured-temp,ValvePosition,controlMode,R-globalBtnLock@EG_WZ_TT01,batteryLevel@EG_WZ_TT01 \&amp;lt;br&amp;gt;&lt;br /&gt;
EG_WZ_TT02_Clima:desired-temp,&amp;lt;&amp;gt;,measured-temp,ValvePosition,controlMode,R-globalBtnLock@EG_WZ_TT02,batteryLevel@EG_WZ_TT02  \&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt; \&amp;lt;br&amp;gt;&lt;br /&gt;
OG_BZ_WT01_Climate:desired-temp,&amp;lt;sollsetz&amp;gt;,measured-temp,humidity,controlMode,R-globalBtnLock@OG_BZ_WT01,batteryLevel@OG_BZ_WT01  \&amp;lt;br&amp;gt;&lt;br /&gt;
OG_BZ_TT01_Clima:desired-temp,&amp;lt;&amp;gt;,measured-temp,ValvePosition,controlMode,R-globalBtnLock@OG_BZ_TT01,batteryLevel@OG_BZ_TT01  \&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt; \&amp;lt;br&amp;gt;&lt;br /&gt;
OG_SZ_WT01_Climate:desired-temp,&amp;lt;sollsetz&amp;gt;,measured-temp,humidity,controlMode,R-globalBtnLock@OG_SZ_WT01,batteryLevel@OG_SZ_WT01  \&amp;lt;br&amp;gt;&lt;br /&gt;
OG_SZ_TT01_Clima:desired-temp,&amp;lt;&amp;gt;,measured-temp,ValvePosition,controlMode,R-globalBtnLock@OG_SZ_TT01,batteryLevel@OG_SZ_TT01  \&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;gt; \&amp;lt;br&amp;gt;&lt;br /&gt;
OG_DZ_WT01_Climate:desired-temp,&amp;lt;sollsetz&amp;gt;,measured-temp,humidity,controlMode,R-globalBtnLock@OG_DZ_WT01,batteryLevel@OG_DZ_WT01  \&amp;lt;br&amp;gt;&lt;br /&gt;
OG_DZ_TT01_Clima:desired-temp,&amp;lt;&amp;gt;,measured-temp,ValvePosition,controlMode,R-globalBtnLock@OG_DZ_TT01,batteryLevel@OG_DZ_TT01&amp;lt;/code&amp;gt;&lt;br /&gt;
| ReadingsGoup anlegen. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr heatingInfo cellStyle { &amp;quot;r:1&amp;quot;=&amp;gt;&#039;style=&amp;quot;font-weight:bold;;font-size:16px&amp;quot;&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;r:2,c:0&amp;quot;=&amp;gt;&#039;style=&amp;quot;font-weight:bold&amp;quot;&#039;,&amp;quot;r:6,c:0&amp;quot; =&amp;gt;&#039;style=&amp;quot;font-weight:bold&amp;quot;&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;r:9,c:0&amp;quot;=&amp;gt;&#039;style=&amp;quot;font-weight:bold&amp;quot;&#039;,&amp;quot;r:12,c:0&amp;quot;=&amp;gt;&#039;style=&amp;quot;font-weight:bold&amp;quot;&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Schrift fett setzen etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr heatingInfo commands {&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;heatingInfo.sollsetz&#039;=&amp;gt;&#039;desired-temp:5.0,12.0,18.0,19.0,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;controlMode.manual&amp;quot;=&amp;gt;&amp;quot;set %DEVICE controlMode auto&amp;quot;,&amp;quot;controlMode.auto&amp;quot;=&amp;gt;&amp;quot;set %DEVICE controlMode manual&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;R-globalBtnLock.on&amp;quot;=&amp;gt;&amp;quot;set %DEVICE regSet globalBtnLock off&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;R-globalBtnLock.off&amp;quot;=&amp;gt;&amp;quot;set %DEVICE regSet globalBtnLock on&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Heizungssteuerung ermöglichen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
attr heatingInfo mapping {OG_BZ_WT01_Climate=&amp;gt;&amp;quot;Bad&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
OG_BZ_TT01_Clima=&amp;gt;&amp;quot;&amp;amp;amp;nbsp;;&amp;amp;amp;nbsp;;&amp;amp;amp;nbsp;;Regler&amp;quot;,OG_SZ_WT01_Climate=&amp;gt;&amp;quot;Schlafzimmer&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
OG_SZ_TT01_Clima=&amp;gt;&amp;quot;&amp;amp;amp;nbsp;;&amp;amp;amp;nbsp;;&amp;amp;amp;nbsp;;Regler&amp;quot;,OG_DZ_WT01_Climate=&amp;gt;&amp;quot;Duschbad&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
OG_DZ_TT01_Clima=&amp;gt;&amp;quot;&amp;amp;amp;nbsp;;&amp;amp;amp;nbsp;;&amp;amp;amp;nbsp;;Regler&amp;quot;,EG_WZ_WT01_Climate=&amp;gt;&amp;quot;Wohnzimmer&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
EG_WZ_TT01_Clima=&amp;gt;&amp;quot;&amp;amp;amp;nbsp;;&amp;amp;amp;nbsp;;&amp;amp;amp;nbsp;;Regler1&amp;quot;,EG_WZ_TT02_Clima=&amp;gt;&amp;quot;&amp;amp;amp;nbsp;;&amp;amp;amp;nbsp;;&amp;amp;amp;nbsp;;Regler2&amp;quot;,&#039;desired-temp&#039; =&amp;gt; &#039;&#039;}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Gewünschte Namen definieren.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
attr heatingInfo valueFormat {if($READING eq &amp;quot;ValvePosition&amp;quot; &amp;amp;&amp;amp; $VALUE ne &amp;quot;0&amp;quot;){$VALUE = int($VALUE/10)*10}&amp;lt;br&amp;gt;&lt;br /&gt;
elsif($READING eq &amp;quot;batteryLevel&amp;quot;){if($VALUE&amp;gt;=3){$VALUE=100}&amp;lt;br&amp;gt;&lt;br /&gt;
elsif($VALUE&amp;gt;=2.7){$VALUE=75}elsif($VALUE&amp;gt;=2.5){$VALUE=50}elsif($VALUE&amp;gt;=2.2){$VALUE=25}&amp;lt;br&amp;gt;&lt;br /&gt;
else{$VALUE=0}}}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Werte vorformatieren (für die Icon-Zuordnung).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
attr heatingInfo valueIcon {&#039;controlMode.manual&#039; =&amp;gt; &#039;sani_heating_manual@795CFF&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;controlMode.auto&#039; =&amp;gt; &#039;sani_heating_automatic@FFC13A&#039;, &#039;controlMode.boost&#039; =&amp;gt; &#039;sani_heating_boost@FB0C02&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;humidity&#039;=&amp;gt;&#039;humidity@6FD9FB&#039;, &#039;R-globalBtnLock.on&#039;=&amp;gt;&#039;secur_locked@F7301D&#039;, &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;R-globalBtnLock.off&#039;=&amp;gt;&#039;secur_open@0CFB0C&#039;,&#039;ValvePosition.0&#039; =&amp;gt; &#039;sani_heating_level_0@002AE0&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.10&#039; =&amp;gt; &#039;sani_heating_level_10@F8D53D&#039;,&#039;ValvePosition.20&#039; =&amp;gt; &#039;sani_heating_level_20@FF9341&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.30&#039; =&amp;gt; &#039;sani_heating_level_30@F17F3F&#039;,&#039;ValvePosition.40&#039; =&amp;gt; &#039;sani_heating_level_40@E46C3C&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.50&#039; =&amp;gt; &#039;sani_heating_level_50@DE3B3A&#039;,&#039;ValvePosition.60&#039; =&amp;gt; &#039;sani_heating_level_60@A30D2D&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.70&#039; =&amp;gt; &#039;sani_heating_level_70@B40A23&#039;,&#039;ValvePosition.80&#039; =&amp;gt; &#039;sani_heating_level_80@C40619&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.90&#039; =&amp;gt; &#039;sani_heating_level_90@D4030F&#039;,&#039;ValvePosition.100&#039; =&amp;gt; &#039;sani_heating_level_100@E50005&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;batteryLevel.100&#039;=&amp;gt;&#039;measure_battery_100@0CFB0C&#039;,&#039;batteryLevel.75&#039;=&amp;gt;&#039;measure_battery_75@42BC0A&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;batteryLevel.50&#039;=&amp;gt;&#039;measure_battery_50@F5FF10&#039;,&#039;batteryLevel.25&#039;=&amp;gt;&#039;measure_battery_25@FB5909&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;batteryLevel.0&#039;=&amp;gt;&#039;measure_battery_0@E50005&#039;,&#039;controlMode.set_boost&#039; =&amp;gt; &#039;hourglass&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;controlMode.set_auto&#039; =&amp;gt; &#039;hourglass&#039;,&#039;controlMode.set_manual&#039; =&amp;gt; &#039;hourglass&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;R-globalBtnLock.set_on&#039; =&amp;gt; &#039;hourglass&#039;,&#039;R-globalBtnLock.set_off&#039; =&amp;gt; &#039;hourglass&#039;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Icons zuordnen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
attr heatingInfo valueStyle {if($READING eq &amp;quot;measured-temp&amp;quot;)&amp;lt;br&amp;gt;&lt;br /&gt;
{my $t=$VALUE;;my $d=ReadingsVal($DEVICE,&#039;desired-temp&#039;,0);;&amp;lt;br&amp;gt;&lt;br /&gt;
if($t-$d&amp;gt;=1){&#039;style=&amp;quot;color:rgb(251,63,11);;&amp;quot;&#039;}elsif($t-$d&amp;lt;=-1){&#039;style=&amp;quot;color:rgb(79,58,251);;&amp;quot;&#039;}&amp;lt;br&amp;gt;&lt;br /&gt;
else{&#039;style=&amp;quot;color:rgb(12,251,12);;&amp;quot;&#039;}}}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Farben (zu kalt: blau, zu warm: rot, ok: grün).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
attr heatingInfo valueSuffix {&amp;quot;desired-temp&amp;quot;=&amp;gt;&amp;quot; °C&amp;quot;, &amp;quot;measured-temp&amp;quot;=&amp;gt;&amp;quot; °C&amp;quot;, &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;ValvePosition&amp;quot;=&amp;gt;&amp;quot; (&amp;quot;.ReadingsVal($DEVICE,$READING,0).&amp;quot; %)&amp;quot;, &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;humidity&amp;quot;=&amp;gt;&amp;quot; &amp;quot;.ReadingsVal($DEVICE,$READING,0).&amp;quot; % RH&amp;quot;, &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;batteryLevel&amp;quot;=&amp;gt;&amp;quot; (&amp;quot;.ReadingsVal($DEVICE,$READING,0).&amp;quot; V)&amp;quot;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Messeinheiten und Zahlenwerte.&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|750px|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 Attribut &#039;&#039;disable&#039;&#039; zu setzen). 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 &#039;&#039;disable&#039;&#039; 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 Attribut &#039;&#039;disabled&#039;&#039; wird mit weiteren Einstellungen (&#039;&#039;commands&#039;&#039;) 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 Internal &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;pre&amp;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;/pre&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; angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ändern von Attributen: Noch ein WeekdayTimer Beispiel ===&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Dieses Beispiel benutzt Funktionen, die erst ab [[version|Modulversion]] 8761/16.6.2015 verfügbar sind.}}&lt;br /&gt;
Inzwischen ist es auch möglich das commands Mapping auf Attribute anzuwenden. Die Syntax ist die gleiche wie für die set Kommandos. Um das Beispiel übersichtlich zu halten werden hier die Werte und Icons auch für deaktiviert WeekdayTimer angezeigt. &lt;br /&gt;
&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_timer.png|thumb|500px|links|FhemWidget für das &#039;disable&#039; Attribut]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rgTimer readingsGroup &amp;lt;&amp;gt;,&amp;lt;Current&amp;gt;,&amp;lt;Update-Time&amp;gt;,&amp;lt;New&amp;gt;,&amp;lt;disable&amp;gt; TYPE=WeekdayTimer:state,nextUpdate,nextValue,?!disable&amp;lt;/code&amp;gt;&lt;br /&gt;
| Definition der angezeigten Readings. Das Attribut &#039;&#039;disable&#039;&#039; wird mit weiteren Einstellungen (&#039;&#039;commands&#039;&#039;) zum Button. Durch das ! wird das Attribut auch dann angezeigt wenn es noch nicht gesetzt ist.   &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rgTimer valueIcon { state =&amp;gt; &#039;%devStateIcon&#039;, nextValue =&amp;gt; &#039;{(split(&amp;quot;:&amp;quot;,Color::devStateIcon($DEVICE,&amp;quot;dimmer&amp;quot;,undef,&amp;quot;nextValue&amp;quot;)))[1]}&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den aktuellen Zustand wird das devStateIcon angezeigt und für den nächsten Zustand das passende Lampen-Icon.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rgTimer_Wasser valueFormat  &#039;{(split(&amp;quot; &amp;quot;, $VALUE))[1]}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Vom nächsten Schaltpunkt wird nur die Zeit angezeigt. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rgTimer commands  { disable =&amp;gt; &#039;disable:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für das disable attribut wird das normale dropDown mit 0 und 1 angezeigt das auch in der Device Detail Ansicht verwendet wird.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Berechnungen ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Dieses Beispiel benutzt Funktionen, die erst ab [[version|Modulversion]] 8761/16.6.2015 verfügbar sind.}}&lt;br /&gt;
Das Rechnen funktioniert über das Flag &amp;quot;$&amp;quot;, mit dem eine Funktion angegeben werden kann, die auf beliebige Kombinationen von Zeilen, Spalten und einzelnen Zellen angewendet wird. Ähnlich wie in einer Tabellenkalkulation.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;define rg readingsGroup .*:temperature rg:$avg&amp;lt;/code&amp;gt;&lt;br /&gt;
Damit wird eine readingsGroup über alle &#039;&#039;temperature&#039;&#039; Readings definiert. In einer zusätzlichen Zeile am Ende wird mit &#039;&#039;$avg&#039;&#039; der Durchschnittswert aller darüber liegenden Temperaturen angezeigt.&lt;br /&gt;
&lt;br /&gt;
Das genaue Format: &amp;lt;code&amp;gt;$&amp;lt;operator&amp;gt;[(&amp;lt;zellen&amp;gt;)]&amp;lt;/code&amp;gt; mit&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;lt;operator&amp;gt;&amp;lt;/code&amp;gt;: sum, avg, min, max, scalar, count oder der Name einer beliebigen anderen Funktion, die ein Array mit allen Werten übergeben bekommt und ein Ergebnis zurückliefert.&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;lt;zellen&amp;gt;&amp;lt;/code&amp;gt; ist eine durch Semikolon getrennte Liste aus &amp;lt;code&amp;gt;&amp;lt;zeilen&amp;gt;:&amp;lt;spalten&amp;gt;&amp;lt;/code&amp;gt; Paaren. &lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;lt;zeilen&amp;gt;&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;&amp;lt;spalten&amp;gt;&amp;lt;/code&amp;gt; sind jeweils eine Perl Liste, d.h. hier können &lt;br /&gt;
** einzelne Werte,&lt;br /&gt;
** durch Komma getrennte Aufzählungen,&lt;br /&gt;
** mit .. angegebene Wertebereiche&lt;br /&gt;
** sowie &amp;lt;code&amp;gt;$ROW&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;$COLUMN&amp;lt;/code&amp;gt; als Bezeichner für die aktuelle Zelle&lt;br /&gt;
:verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Alle Möglichkeiten sind kombinierbar. Die Zählung der Zeilen und Spalten beginnt bei 1. Eine nicht vorhandene Zeilenangabe wird durch den Bereich von Zeile 1 bis zur aktuellen Zeile ersetzt, eine nicht vorhandene Spalte durch die aktuelle Spalte.&lt;br /&gt;
&lt;br /&gt;
Es ergeben sich somit unter anderem folgende Möglichkeiten:&lt;br /&gt;
*&amp;lt;code&amp;gt;$sum&amp;lt;/code&amp;gt; equivalent zu &amp;lt;code&amp;gt;$sum(1..$ROW), $sum(:$COLUMN)&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;$sum(1..$ROW:$COLUMN)&amp;lt;/code&amp;gt; die Summe der Werte in der Spalte über der aktuellen Zelle.&lt;br /&gt;
*&amp;lt;code&amp;gt;$max($ROW:1..$COLUMN-1)&amp;lt;/code&amp;gt; Maximum aller Werte links von der aktuellen Zelle (in der aktuellen Zeile)&lt;br /&gt;
*&amp;lt;code&amp;gt;$avg(1..$ROW:1)&amp;lt;/code&amp;gt; Durchschnitt aller Werte in Spalte 1 bis zur aktuellen Zeile&lt;br /&gt;
*&amp;lt;code&amp;gt;$scalar(:1)&amp;lt;/code&amp;gt; Anzahl der Werte in Spalte 1&lt;br /&gt;
*&amp;lt;code&amp;gt;$min(1..5:1,2,4)&amp;lt;/code&amp;gt; Minimum der Werte aus den Zeilen 1-5 in den Spalten 1, 2 und 4&lt;br /&gt;
&lt;br /&gt;
Eigene Funktionen lassen sich über 99_myUtils anlegen und z.B. verwenden um Häufigkeiten zu zählen oder mit nichtnumerischen Readings umzugehen.&lt;br /&gt;
&lt;br /&gt;
Die Ergebnisse werden im Weiteren wie normale Readings behandelt. Sie lassen sich von links oben nach rechts unten kaskadieren und lassen sich über valuePrefix, valueSuffix, valueFormat und valueStyle in der Darstellung beeinflussen. Also z.B. einfärben, als Balkendiagramm darstellen, ...&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe der Funktionalität zum auf- und zu-klappen von Teilen einer readingsGroup lassen sich z.B. im zusammengeklappten Zustand Summen, Extremwerte oder andere Ausreißer anzeigen und die Details nur beim Aufklappen zeigen.&lt;br /&gt;
&lt;br /&gt;
Weitere Möglichkeiten:&lt;br /&gt;
* Attribut &amp;lt;code&amp;gt;firstCalcRow&amp;lt;/code&amp;gt;: Hiermit kann der Default für die Nummer der ersten Zeile vorgegeben werden (sofern im Ausdruck nichts genaueres angegeben ist). firstCalcRow sollte z.B. auf 2 gesetzt werden, wenn in der readingsGroup Spaltenüberschriften verwendet werden.&lt;br /&gt;
* special &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;hr&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; um eine horizontale Linie über die volle Breite einzufügen&lt;br /&gt;
* Über ein angehängtes &amp;lt;code&amp;gt;@&amp;lt;alias&amp;gt;&amp;lt;/code&amp;gt; kann einem Rechenergebniss ein Alias-Name gegeben werden. Über diesen kann der Wert dann zur Formatierung mit den value-Attributen angesprochen werden.&lt;br /&gt;
* das &amp;lt;code&amp;gt;alwaysTrigger&amp;lt;/code&amp;gt; Attribut kann jetzt auch den Wert 2 bekommen. Damit werden in der readingsGroup Readings für alle durch die Aggregation gebildeten Werte und entsprechende Events auch dann erzeugt wenn die readingsGroup nicht angezeigt wird. Wenn ein Alias-Name vergeben ist, wird dieser auch für den Reading-Namen verwendet.&lt;br /&gt;
* Über den operator &amp;lt;code&amp;gt;$count(&amp;lt;wert&amp;gt;)(&amp;lt;zellen&amp;gt;)&amp;lt;/code&amp;gt; um das Vorkommen von &amp;lt;code&amp;gt;&amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt; in den angegebenen Zellen zu zählen. &amp;lt;code&amp;gt;&amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt; kann enweder direkt der zu zählende Wert sein (ohne Anführungzeichen) oder eine in / eingeschlossene regex. Mit &amp;lt;code&amp;gt;!&amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt; kann das Nicht-Vorkommen von &amp;lt;code&amp;gt;&amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt; gezählt werden.&lt;br /&gt;
&lt;br /&gt;
=== Ein interaktives Beispiel ===&lt;br /&gt;
[[Datei:rgCalc.png|mini|right|400px|Beispiel-readingsGroup mit Berechnungen]]&lt;br /&gt;
In drei [[dummy]] Objekten lässt sich jeweils ein Reading über einen Slider einstellen. In der darunter liegenden readingsGroup werden diese Readings und diverse daraus abgeleitete Werte dargestellt. Alle Readings und die daraus abgeleiteten Werte werden live per longpoll aktualisiert, wenn die slider bewegt werden.&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  define t1 dummy&lt;br /&gt;
  attr t1 room rg&lt;br /&gt;
  attr t1 setList state:slider,-10,1,30&lt;br /&gt;
  attr t1 webCmd state&lt;br /&gt;
  define t2 dummy&lt;br /&gt;
  attr t2 room rg&lt;br /&gt;
  attr t2 setList state:slider,-10,1,30&lt;br /&gt;
  attr t2 webCmd state&lt;br /&gt;
  define t3 dummy&lt;br /&gt;
  attr t3 room rg&lt;br /&gt;
  attr t3 setList state:slider,-10,1,30&lt;br /&gt;
  attr t3 webCmd state&lt;br /&gt;
&lt;br /&gt;
  define rg readingsGroup &amp;lt;&amp;gt;,&amp;lt;value&amp;gt;,&amp;lt;sum&amp;gt;,&amp;lt;min&amp;gt;,&amp;lt;max&amp;gt;,&amp;lt;avg&amp;gt;\&lt;br /&gt;
  t\d:+NAME,state,$sum(1..$ROW:2),$min(1..$ROW:2),$max(1..$ROW:2),$avg(1..$ROW:2)\&lt;br /&gt;
  &amp;lt;hr&amp;gt;\&lt;br /&gt;
  rg:&amp;lt;&amp;gt;,$scalar,$sum(:2)@SUM,$min(:2)@MIN,$max(:2)@MAX,$avg(:2)@AVG\&lt;br /&gt;
  &amp;lt;hr&amp;gt;\&lt;br /&gt;
  t1:&amp;lt;t1,t2,t3&amp;gt;,state,state@t2,state@t3,$sum($ROW:2..4)@SUM,$count(/\d/)(2..$ROW-4:2)\&lt;br /&gt;
 &lt;br /&gt;
  attr rg nonames 1&lt;br /&gt;
  attr rg room rg&lt;br /&gt;
  attr rg style style=&#039;text-align:center&#039;&lt;br /&gt;
  attr rg valueFormat { &#039;avg&#039; =&amp;gt; &#039;%.2f&#039;, &#039;AVG&#039; =&amp;gt; &#039;%.2f&#039; }&lt;br /&gt;
  attr rg valuePrefix { &#039;rg.scalar&#039; =&amp;gt; &#039;#&#039;, &#039;rg.SUM&#039; =&amp;gt;&#039;&amp;amp;Sigma;; &#039;, &#039;rg.MIN&#039; =&amp;gt;&#039;Min: &#039;, &#039;rg.MAX&#039; =&amp;gt;&#039;Max: &#039;, &#039;rg.AVG&#039; =&amp;gt;&#039;&amp;amp;empty;; &#039;, &#039;rg.count&#039; =&amp;gt; &#039;#(X): &#039; }&lt;br /&gt;
  attr rg valueSuffix { state =&amp;gt; &#039;&amp;amp;deg;;C&#039; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links und Trigger ==&lt;br /&gt;
=== readingsGroup mit Link ===&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;
wenn hierdurch Änderungen an einer readingsGroup erfolgen, die ein Neuladen der Seite erforderlich machen, kann dies so erfolgen:&lt;br /&gt;
:&amp;lt;code&amp;gt;{myUtils_refresh(&amp;quot;WEB&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
mit folgendem code in 99_myUtils.pm:&lt;br /&gt;
&amp;lt;pre&amp;gt;sub                                                                                     &lt;br /&gt;
myUtils_refresh($)                                                                      &lt;br /&gt;
{                                                                                       &lt;br /&gt;
  my ($name) = @_;                                                                      &lt;br /&gt;
                                                                                        &lt;br /&gt;
  FW_directNotify(&amp;quot;#FHEMWEB:$name&amp;quot;, &amp;quot;location.reload(true);&amp;quot;,&amp;quot;&amp;quot; );&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel für &#039;custom links und trigger&#039; findet sich in {{Link2Forum|Topic=14425|Message=109383|LinkText=diesem Forenbeitrag}}: dort wird damit eine readingsGroup dynamisch umgeschaltet, um nur die eingeschalteten, nur die ausgeschalteten oder alle Lampen anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
=== sub rg ===&lt;br /&gt;
Damit beim klicken auf ein Icon oder einen Text in einer readingsGroup etwas passiert ist es möglich dies über das commands Attribut auf ein &amp;lt;code&amp;gt;&#039;trigger ntfy_rg $DEVICE $READING&#039;&amp;lt;/code&amp;gt; oder Ähnliches zu mappen.&lt;br /&gt;
Anlegen des ntfy_rg notify&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define ntfy_rg notify ntfy_rg {rg($EVENT)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Folgender Code muss noch in de [[99_myUtils_anlegen|99_myUtils.pm]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub rg($){&lt;br /&gt;
  my @input    = split(/[§\s]+/,shift);&lt;br /&gt;
  my $device   = $input[0];&lt;br /&gt;
  my $function = $input[1];&lt;br /&gt;
&lt;br /&gt;
if($function eq &amp;quot;clima&amp;quot;){&lt;br /&gt;
  my $room =  AttrVal($device, &#039;room&#039;, &#039;undef&#039;);&lt;br /&gt;
  $room =~ s/\D//g;&lt;br /&gt;
  &lt;br /&gt;
  return((&amp;quot;d_climaControl_&amp;quot;.$room));&lt;br /&gt;
}&lt;br /&gt;
elsif($function eq &amp;quot;device&amp;quot;){&lt;br /&gt;
  return InternalVal($device,&amp;quot;device&amp;quot;,&amp;quot;device error&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
elsif($function eq &amp;quot;controlMode&amp;quot;){&lt;br /&gt;
  my $controlMode = ReadingsVal($device,&amp;quot;controlMode&amp;quot;,&amp;quot;controlMode error&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if($controlMode ~~ /manual/)&lt;br /&gt;
    {fhem(&amp;quot;set $device controlMode auto&amp;quot;)}&lt;br /&gt;
  elsif($controlMode ~~ /auto/)&lt;br /&gt;
    {fhem(&amp;quot;set $device controlMode manual&amp;quot;)};&lt;br /&gt;
}&lt;br /&gt;
elsif($function eq &amp;quot;globalBtnLock&amp;quot;){&lt;br /&gt;
  my $globalBtnLock = ReadingsVal($device,&amp;quot;R-globalBtnLock&amp;quot;,&amp;quot;globalBtnLock error&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if($globalBtnLock ~~ /off/){&lt;br /&gt;
    {fhem(&amp;quot;set $device regSet globalBtnLock on&amp;quot;)}&lt;br /&gt;
    {fhem (&amp;quot;set $device getConfig&amp;quot;)}&lt;br /&gt;
  }&lt;br /&gt;
  elsif($globalBtnLock ~~ /on/){&lt;br /&gt;
    {fhem(&amp;quot;set $device regSet globalBtnLock off&amp;quot;)}&lt;br /&gt;
    {fhem (&amp;quot;set $device getConfig&amp;quot;)}&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
elsif($function eq &amp;quot;state&amp;quot;){&lt;br /&gt;
  my $state = Value($device);&lt;br /&gt;
&lt;br /&gt;
  if($state ~~ /off/){&lt;br /&gt;
    {fhem(&amp;quot;set $device on&amp;quot;)}&lt;br /&gt;
  }&lt;br /&gt;
  elsif($state ~~ /on/){&lt;br /&gt;
    {fhem(&amp;quot;set $device off&amp;quot;)}&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
elsif($function eq &amp;quot;setTimeTable&amp;quot;){&lt;br /&gt;
  my $room         =  AttrVal($device, &#039;room&#039;, &#039;undef&#039;);&lt;br /&gt;
  $room         =~ s/\D//g;&lt;br /&gt;
  my $climaControl = (&amp;quot;d_climaControl_&amp;quot;.$room);&lt;br /&gt;
  my $dayTemp           = ReadingsVal( $climaControl, &amp;quot;dayTemp&amp;quot;          , 21.0    );&lt;br /&gt;
  my $nightTemp         = ReadingsVal( $climaControl, &amp;quot;nightTemp&amp;quot;        , 17.0    );&lt;br /&gt;
  my $workday_period_1_start  = ReadingsVal( $climaControl, &amp;quot;workday_period_1_start&amp;quot;  , &amp;quot;06:30&amp;quot; );&lt;br /&gt;
  my $workday_period_1_stop   = ReadingsVal( $climaControl, &amp;quot;workday_period_1_stop&amp;quot;   , &amp;quot;18:00&amp;quot; );&lt;br /&gt;
  my $workday_period_2_start  = ReadingsVal( $climaControl, &amp;quot;workday_period_2_start&amp;quot;  , &amp;quot;24:00&amp;quot; );&lt;br /&gt;
  my $workday_period_2_stop   = ReadingsVal( $climaControl, &amp;quot;workday_period_2_stop&amp;quot;   , &amp;quot;24:00&amp;quot; );&lt;br /&gt;
  my $saturday_period_1_start = ReadingsVal( $climaControl, &amp;quot;saturday_period_1_start&amp;quot; , &amp;quot;06:30&amp;quot; );&lt;br /&gt;
  my $saturday_period_1_stop  = ReadingsVal( $climaControl, &amp;quot;saturday_period_1_stop&amp;quot;  , &amp;quot;12:00&amp;quot; );&lt;br /&gt;
  my $saturday_period_2_start = ReadingsVal( $climaControl, &amp;quot;saturday_period_2_start&amp;quot; , &amp;quot;24:00&amp;quot; );&lt;br /&gt;
  my $saturday_period_2_stop  = ReadingsVal( $climaControl, &amp;quot;saturday_period_2_stop&amp;quot;  , &amp;quot;24:00&amp;quot; );&lt;br /&gt;
  my $sunday_period_1_start   = ReadingsVal( $climaControl, &amp;quot;sunday_period_1_start&amp;quot;   , &amp;quot;24:00&amp;quot; );&lt;br /&gt;
  my $sunday_period_1_stop    = ReadingsVal( $climaControl, &amp;quot;sunday_period_1_stop&amp;quot;    , &amp;quot;24:00&amp;quot; );&lt;br /&gt;
  my $sunday_period_2_start   = ReadingsVal( $climaControl, &amp;quot;sunday_period_2_start&amp;quot;   , &amp;quot;24:00&amp;quot; );&lt;br /&gt;
  my $sunday_period_2_stop    = ReadingsVal( $climaControl, &amp;quot;sunday_period_2_stop&amp;quot;    , &amp;quot;24:00&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
  {fhem(&amp;quot;set $device tempListMon prep $workday_period_1_start  $nightTemp $workday_period_1_stop  $dayTemp $workday_period_2_start  $nightTemp $workday_period_2_stop  $dayTemp 24:00 $nightTemp&amp;quot;)};&lt;br /&gt;
  {fhem(&amp;quot;set $device tempListTue prep $workday_period_1_start  $nightTemp $workday_period_1_stop  $dayTemp $workday_period_2_start  $nightTemp $workday_period_2_stop  $dayTemp 24:00 $nightTemp&amp;quot;)};&lt;br /&gt;
  {fhem(&amp;quot;set $device tempListWed prep $workday_period_1_start  $nightTemp $workday_period_1_stop  $dayTemp $workday_period_2_start  $nightTemp $workday_period_2_stop  $dayTemp 24:00 $nightTemp&amp;quot;)};&lt;br /&gt;
  {fhem(&amp;quot;set $device tempListThu prep $workday_period_1_start  $nightTemp $workday_period_1_stop  $dayTemp $workday_period_2_start  $nightTemp $workday_period_2_stop  $dayTemp 24:00 $nightTemp&amp;quot;)};&lt;br /&gt;
  {fhem(&amp;quot;set $device tempListFri prep $workday_period_1_start  $nightTemp $workday_period_1_stop  $dayTemp $workday_period_2_start  $nightTemp $workday_period_2_stop  $dayTemp 24:00 $nightTemp&amp;quot;)};&lt;br /&gt;
  {fhem(&amp;quot;set $device tempListSat prep $saturday_period_1_start $nightTemp $saturday_period_1_stop $dayTemp $saturday_period_2_start $nightTemp $saturday_period_2_stop $dayTemp 24:00 $nightTemp&amp;quot;)};&lt;br /&gt;
  {fhem(&amp;quot;set $device tempListSun exec $sunday_period_1_start   $nightTemp $sunday_period_1_stop   $dayTemp $sunday_period_2_start   $nightTemp $sunday_period_2_stop   $dayTemp 24:00 $nightTemp&amp;quot;)};&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier sind die benötigten CodeBlöcke für [[ReadingsGroup#Heizungswerte.2C_Status.2C_Steuerung_und_Wochenprofil|Heizungswerte, Status, Steuerung und Wochenprofil]] enthalten, aber auch um state zu triggern.&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 eigene Routine in (beispielsweise) [[99 myUtils anlegen|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;
* code für unterschiedliche readings kann auch im mapping schon aufgeteilt werden:&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;
* Ifs lassen sich verschachteln und sortieren. So kann die Anzahl der Klammern und Else-Zweige reduziert werden:&lt;br /&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;
 }&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;
=== readingsGroup in einer Gruppe ===&lt;br /&gt;
Wenn der doppelte Rahmen um eine readingsGroup bei Darstellung in einer Gruppe stört, lässt er sich mit dem passenden style entfernen: &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rgName&amp;gt; style style=&amp;quot;border:0px;background:none;box-shadow:none&amp;quot;&amp;lt;/code&amp;gt; &lt;br /&gt;
Für die readingsGroup &#039;&#039;rgName&#039;&#039; wird der Darstellungsstil verändert.&lt;br /&gt;
&lt;br /&gt;
=== Einfache Balkendiagramme ===&lt;br /&gt;
[[Datei:rgBars.png|mini|400px|readingsGroup mit Balken]]&lt;br /&gt;
Readings lassen sich mit einem valueStyle der folgenden Art mit einem &amp;quot;Füllstandsbalken&amp;quot; hinterlegen:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rgName&amp;gt; valueStyle style=&amp;quot;width:200px; text-align:center; border: 1px solid #ccc; background:-webkit-linear-gradient(left, red $VALUE%, rgba(0,0,0,0) $VALUE%)&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Hier ist die gewünschte Breite der Spalte und je nach Wertebereich der Readings auch die Umrechnung des jeweiligen Readingwertes in prozentuale Werte anzupassen.&lt;br /&gt;
&lt;br /&gt;
Die verwendeten Farben lassen sich natürlich auch anpassen, z.B. auch unter Verwendung der [[Color#Skalenfarbe_mit_Color::pahColor|Color::pahColor]] Routine.&lt;br /&gt;
&lt;br /&gt;
Die Balken werden bei Änderungen der Readings automatisch per longpoll aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Je nach verwendetem Browser ist &#039;&#039;-webkit-linear-gradient&#039;&#039; durch &#039;&#039;-moz-linear-gradient&#039;&#039;, &#039;&#039;-ms-linear-gradient&#039;&#039; oder &#039;&#039;linear-gradient&#039;&#039; zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
Die obige valueStyle Definition ist nur beispielhaft zu sehen und sollte mit den [[ReadingsGroup#Lesbar_machen|hier beschriebenen Methoden]] lesbarer gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Möglichkeiten zur Erzeugung von Balkendiagrammen sind in Forenbeiträgen {{Link2Forum|Topic=25313|LinkText=hier}} und {{Link2Forum|Topic=28318|LinkText=hier}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup Styling mit CSS ===&lt;br /&gt;
Jede readingsGroup lässt sich durch CSS individuell stylen. &lt;br /&gt;
&lt;br /&gt;
==== Allgemeines ====&lt;br /&gt;
Damit der eigene CSS Code nach einem [[Update]] der FHEM-Style Dateien vorhanden bleibt, ist es notwenig eine eigene .css Datei (zB ios7ReadingsGroups.css) zu erstellen und ins Verzeichnis &#039;&#039;fhem/www/pgm2/&#039;&#039; zu kopieren. Anschließend muss in der [[FHEMWEB]] Instanz das Attribut &#039;&#039;CssFiles&#039;&#039; auf zB &#039;&#039;pgm2/ios7ReadingsGroups.css&#039;&#039; gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Erweiterte Device Übersicht ====&lt;br /&gt;
Diese ReadingsGroup ist an der [[FHEMWEB]] Device-Übersicht angelehnt. Zusätzlich werden weitere Readings, hier Leistung, Betriebszeit Heute und Jahr, ein Link zu Detail-Seite der ReadingsGroup und Links zu den jeweiligen Device-Detail-Seite, dargestellt.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| [[Datei:RgStylingOhneCss.png|600px|mini|left|Device ReadingsGroup ohne CSS]] [[Datei:RgStylingMitCss.png|600px|mini|left|Device ReadingsGroup mit CSS]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Definition =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define rg_devices readingsGroup &amp;lt;{rgLink($DEVICE,&amp;quot;konfigurieren&amp;quot;,&amp;quot;Details&amp;quot;)}&amp;gt;,&amp;lt;Device&amp;gt;,&amp;lt;Status&amp;gt;,&amp;lt;Leistung&amp;gt;,&amp;lt;Heute&amp;gt;,&amp;lt;Jahr&amp;gt;\&lt;br /&gt;
wzDeckenfluter:&amp;lt;%light_floor_lamp&amp;gt;,&amp;lt;{rgLink(&amp;quot;wzDeckenfluter&amp;quot;,&amp;quot;detail&amp;quot;,&amp;quot;Deckenfluter&amp;quot;)}&amp;gt;,state,&amp;lt;&amp;gt;,dauerHeute,dauerJahr\&lt;br /&gt;
wzMacMini:&amp;lt;%it_nas&amp;gt;,&amp;lt;{rgLink(&amp;quot;wzMacMini&amp;quot;,&amp;quot;detail&amp;quot;,&amp;quot;MacMini&amp;quot;)}&amp;gt;,state,power,consumption,consumptionYear\&lt;br /&gt;
attr rg_devices noheading 1&lt;br /&gt;
attr rg_devices nonames 1&lt;br /&gt;
attr rg_devices notime 1&lt;br /&gt;
attr rg_devices room ReadingsGroup Styling&lt;br /&gt;
attr rg_devices style class=&amp;quot;block wide rgDevices&amp;quot;&lt;br /&gt;
attr rg_devices valueFormat { &#039;power&#039; =&amp;gt; &amp;quot;%.1f W &amp;quot;, consumption =&amp;gt; &amp;quot;%.2f kWh&amp;quot;, &#039;consumptionYear&#039; =&amp;gt; &amp;quot;%.2f kWh&amp;quot;  }&lt;br /&gt;
attr rg_devices valueIcon { state =&amp;gt; &#039;%devStateIcon&#039; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit sich der CSS auf die richtige readingsGroup bezieht, ist es nötigt &lt;br /&gt;
das Attribut &#039;&#039;style&#039;&#039; anzupassen.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;attr &amp;lt;rgName&amp;gt; style class=&amp;quot;block wide rgDevices&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Klassen &#039;&#039;block&#039;&#039; und &#039;&#039;wide&#039;&#039; müssen eingetragen werden. Der Name der Nachfolgenden Klasse, hier &#039;&#039;rgDevices&#039;&#039;, ist frei wählbar.&lt;br /&gt;
|}&lt;br /&gt;
===== Funktion rgLink() =====&lt;br /&gt;
Die Funktion rgLink($name,$action,$label) liefert einen Link mit dem Namen $label zurück. Der Code gehört in die [[99 myUtils anlegen|99_myUtils.pm]].&lt;br /&gt;
* $name - Name des Device das aufgerufen werden soll &lt;br /&gt;
* $action - Aktion die Ausgeführt werden soll. &lt;br /&gt;
**&#039;&#039;konfigurieren&#039;&#039; erzeugt den kleinen &#039;&#039;Details&#039;&#039; Button links oben der einem zur Detail Seite der ReadingsGroup führt - nützlich wenn das ReadingsGroup-Attribut &#039;&#039;noheading&#039;&#039; gesetzt ist&lt;br /&gt;
** &#039;&#039;detail&#039;&#039; erzeugt einen Link zu Device-Detail Seite&lt;br /&gt;
* $label - Link-Name&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub rgLink($$$){&lt;br /&gt;
  my ($name,$action,$label) = @_; &lt;br /&gt;
  my $link = &amp;quot;&amp;quot;;&lt;br /&gt;
  my $fhemLink = &amp;quot;&amp;quot;;&lt;br /&gt;
  my $txt = &amp;quot;&amp;quot;;&lt;br /&gt;
  my $ret = &amp;quot;&amp;quot;;&lt;br /&gt;
  my $divStyle = &amp;quot;&amp;quot;;&lt;br /&gt;
  my $aStyle = &amp;quot;&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  # FHEM Variablen einbinden&lt;br /&gt;
  use vars qw($FW_ME);&lt;br /&gt;
  use vars qw($FW_subdir);&lt;br /&gt;
  use vars qw($FW_ss);&lt;br /&gt;
  use vars qw($FW_tp);&lt;br /&gt;
&lt;br /&gt;
  if( $action eq &amp;quot;konfigurieren&amp;quot; ){&lt;br /&gt;
    $fhemLink  = &amp;quot;detail=$name&amp;quot;;&lt;br /&gt;
    $divStyle = &amp;quot;cursor:pointer;font-size:11px;padding-bottom:2px;padding-left:3px;&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  elsif( $action eq &amp;quot;detail&amp;quot; ){&lt;br /&gt;
    $fhemLink  = &amp;quot;detail=$name&amp;quot;;&lt;br /&gt;
    $divStyle = &amp;quot;cursor:pointer;display:inline;&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  $link = &#039;&amp;lt;a onclick=&amp;quot;location.href=\&#039;&#039; . $FW_ME . $FW_subdir . &#039;?&#039; . $fhemLink . &#039;\&#039;&amp;quot; style=&amp;quot;&#039; . $aStyle . &#039;&amp;quot;&amp;gt;&#039; . $label . &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
  $txt  = &#039;&amp;lt;div style=&amp;quot;&#039; . $divStyle . &#039;&amp;quot;&amp;gt;&#039; . $link . &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  $ret  = &amp;quot;$txt&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  return $ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=Tipp&lt;br /&gt;
Verwende zum Bearbeiten der eigenen .css Dateien entweder den [http://fhem.de/commandref_DE.html#JavaScripts Codemirror Editor] oder einen eigenen Editor mit [http://de.wikipedia.org/wiki/Syntaxhervorhebung Syntax Highlighting] . Das hilft bei der Fehlersuche enorm. }}&lt;br /&gt;
===== Styling =====&lt;br /&gt;
Die eigene .css Datei erscheint in FHEM unter Edit-Files --&amp;gt; styles und kann direkt im FHEM-Editor oder mit eigenen Editor bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
ios7ReadingsGroups.css:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*  Readings Groups Devices */&lt;br /&gt;
table.rgDevices tr td{ text-align: center; }&lt;br /&gt;
table.rgDevices tr:first-child td:nth-child(2){ /* 1. Zeile 2. Spalte */ text-align: center; }&lt;br /&gt;
table.rgDevices tr td:first-child{  /* 1. Spalte */ width: 45px; text-align: center; }&lt;br /&gt;
table.rgDevices tr td:nth-child(2){ /* 2. Spalte */ width: 33%;  text-align: left; }&lt;br /&gt;
table.rgDevices tr td:nth-child(3){ /* 3. Spalte */ width: 15%; }&lt;br /&gt;
table.rgDevices tr td:nth-child(4){ /* 4. Spalte */ width: 15%; }&lt;br /&gt;
table.rgDevices tr td:nth-child(5){ /* 5. Spalte */ width: 15%; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Auf Portrait / Landscape Modus des Smartphone unterscheiden ====&lt;br /&gt;
Dieses Beispiel ist an das obige Beispiel [[#Erweiterte_Device_.C3.9Cbersicht|Erweiterte Device Übersicht]] angelehnt. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |[[Datei:RgStylingSmallscreenPortrait.png|300px|mini|center|Device ReadingsGroup im Portrait Modus]]&lt;br /&gt;
|[[Datei:RgStylingSmallscreenLandscape.png|550px|mini|center|Device ReadingsGroup im Landscape Modus]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Allgemeines =====&lt;br /&gt;
Mit CSS ist man in der Lage auf die aktuelle Bildschirmlage zu reagieren. Alle Anweisungen die in diesen beiden Funktionen zwischen den beiden { } stehen, werden je nach Bildschirmlage aufgerufen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Portrait Modus */&lt;br /&gt;
@media all and (orientation:portrait) { }&lt;br /&gt;
&lt;br /&gt;
/* Landscape Modus */&lt;br /&gt;
@media all and (orientation:landscape) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Styling =====&lt;br /&gt;
{{Randnotiz|RNText=Info&lt;br /&gt;
* &#039;&#039;width: xx%&#039;&#039; ändert die Breite der Spalte&lt;br /&gt;
* &#039;&#039;display: none&#039;&#039; blendet die Spalte aus}}&lt;br /&gt;
In der FHEMWEB_phone Instanz muss wie [[#Allgemeines|hier]] beschrieben eine neue eigene .css Datei eingetragen werden. In diesem Beispiel ios7smallscreenReadingsGroups.css&lt;br /&gt;
&lt;br /&gt;
ios7smallscreenReadingsGroups.css&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* landscape und portrait modus */&lt;br /&gt;
table.rgDevices tr td { /* Zuerst alles centern */ text-align: center; }&lt;br /&gt;
table.rgDevices tr:first-child td:nth-child(1){ /* 1. Zeile 1. Spalte */ text-align: center; }&lt;br /&gt;
table.rgDevices tr td:first-child { /* 1. Spalte */ width: 5%; }&lt;br /&gt;
table.rgDevices tr:first-child td:nth-child(2) { /* 1. Zeile 2. Spalte */ text-align: center; }&lt;br /&gt;
table.block table tr td table.rgDevices tr td { border-bottom: 1px solid #cbcbcb; }&lt;br /&gt;
&lt;br /&gt;
/* Portrait Modus */&lt;br /&gt;
@media all and (orientation:portrait) {&lt;br /&gt;
  table.rgDevices tr td:nth-child(2){ /* 2. Spalte */ width: 50%; text-align: left; }&lt;br /&gt;
  table.rgDevices tr td:nth-child(3){ /* 3. Spalte */ width: auto; text-align: right; display: table-cell; }&lt;br /&gt;
  table.rgDevices tr td:nth-child(4){ /* 4. Spalte */ width: 0; display: none; }&lt;br /&gt;
  table.rgDevices tr td:nth-child(5){ /* 5. Spalte */ width: 0; display: none; }&lt;br /&gt;
  table.rgDevices tr td:nth-child(6){ width: 0; display: none; }	&lt;br /&gt;
  table.rgDevices tr td div a svg{ margin-left: 90px; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Landscape Modus */&lt;br /&gt;
@media all and (orientation:landscape) { &lt;br /&gt;
  table.rgDevices tr td:nth-child(2){ /* 2. Spalte */ width: 35%; text-align: left; }&lt;br /&gt;
  table.rgDevices tr td:nth-child(3){ /* 3. Spalte */ width: 15%; }&lt;br /&gt;
  table.rgDevices tr td:nth-child(4){ /* 4. Spalte */ width: 15%; }&lt;br /&gt;
  table.rgDevices tr td:nth-child(5){ /* 5. Spalte */ width: 15%; }&lt;br /&gt;
  table.rgDevices tr td:nth-child(5){ /* 5. Spalte */ width: 15%; }	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Plots im Portrait Modus des Smartphones ausblenden ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |[[Datei:RgStylingSmallscreenPortraitPlot.png|350px|mini|center|Device ReadingsGroup im Portrait Modus]]&lt;br /&gt;
|[[Datei:RgStylingSmallscreenLandscapePlot.PNG|550px|mini|center|Plot nur im Landscape]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Um die Plot und alle Steuerelemente im Portrait Modus auszublenden fügt man in seine eigene smallscreen.css wie [[#Allgemeines|hier beschrieben]] folgendes ein:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@media all and (orientation:portrait) {&lt;br /&gt;
  .SVGplot, .SVGlabel, .Zoom-in, .Zoom-out, .Prev { width: 0; display: none; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12649</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12649"/>
		<updated>2015-10-25T13:11:46Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; 	{{Baustelle}} &lt;br /&gt;
[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Variante 1: NetIO ===&lt;br /&gt;
Um den Bus im Netzwerk einzubinden benötigt man zusätzlich zu dem AVR Net-IO Board eine Adapterplatine. Diese Adapterplatine kann man recht einfach auf einer Lochrasterkarte aufbauen. Wie man das ganze Aufbaut ist im Link [http://ems-gateway.myds.me/dokuwiki/doku.php?id=wiki:ems:net_io EMS-Adapter/NetIO] sehr gut erklärt.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== Variante 1: NetIO / EMSCollector ===&lt;br /&gt;
Wenn der oben beschriebene NetIO Hardware inkl. der zugehören Software läuft kann man sich um die Server-Software kümmern. Auch dieser Teil ist sehr gut in dem Link beschrieben. Abweichend hierzu kann man auf den MySQL Part verzichten da die Datenbank für FHEM nicht gebraucht wird. Maximal zum kompilieren des Collectors werden die Pakete benötigt, können danach jedoch wieder deinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreichem erstellen des Moduls kann es mit &amp;lt;code&amp;gt;chmod 700 collectord&amp;lt;/code&amp;gt; ausführbar und mit &amp;lt;code&amp;gt;cp collectord /usr/bin/&amp;lt;/code&amp;gt; &#039;&#039;installiert&#039;&#039; werden.&lt;br /&gt;
&lt;br /&gt;
mit &amp;lt;code&amp;gt;collectord --db-path none -d all -C 7777 -D 7778 tcp:IP_NETIO:7950 -f&amp;lt;/code&amp;gt; kann ein erster Test stattfinden.&lt;br /&gt;
&lt;br /&gt;
Die Parameter bedeuten:&lt;br /&gt;
*&amp;lt;code&amp;gt;--db-path none&amp;lt;/code&amp;gt; keine Datenbankanbindung&lt;br /&gt;
*&amp;lt;code&amp;gt;-d all&amp;lt;/code&amp;gt; volle Debugstufe&lt;br /&gt;
*&amp;lt;code&amp;gt;-C 7777&amp;lt;/code&amp;gt; Telnet Steuerport 7777&lt;br /&gt;
*&amp;lt;code&amp;gt;-C 7778&amp;lt;/code&amp;gt; Telnet Steuerport 7778&lt;br /&gt;
*&amp;lt;code&amp;gt;tcp:IP_NETIO:7950&amp;lt;/code&amp;gt; Schnittstelle zum Net-IO (IP Bitte anpassen)&lt;br /&gt;
*&amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; Vordergrund&lt;br /&gt;
&lt;br /&gt;
Wenn nun eine Verbindung besteht und alle Tests durchlaufen sind kann man in &amp;lt;code&amp;gt;/etc/crontab&amp;lt;/code&amp;gt; folgende Zeile am Ende einfügen &amp;lt;code&amp;gt;@reboot collectord_neu --db-path none -C 7777 -D 7778 tcp:192.168.0.248:7950&amp;lt;/code&amp;gt; um den Dämon direkt beim Boot des FHEM-Servers zu starten.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
tbd.&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Rspecht&amp;diff=12648</id>
		<title>Benutzer:Rspecht</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Rspecht&amp;diff=12648"/>
		<updated>2015-10-25T13:10:40Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: Die Seite wurde neu angelegt: „== Kontakt zu FHEM == Im Oktober 2015 installiert und seither täglich am &amp;#039;&amp;#039;basteln&amp;#039;&amp;#039;.  Aktuell Realisiert: *FHEM auf BananaPi *MAX! intigriert *Buderus EMS in…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Kontakt zu FHEM ==&lt;br /&gt;
Im Oktober 2015 installiert und seither täglich am &#039;&#039;basteln&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Aktuell Realisiert:&lt;br /&gt;
*FHEM auf BananaPi&lt;br /&gt;
*MAX! intigriert&lt;br /&gt;
*Buderus EMS intigriert&lt;br /&gt;
&lt;br /&gt;
== zu Mir: ==&lt;br /&gt;
Elektroing. mit Hang zum selbst realisieren.&lt;br /&gt;
Sprich wenn ich ein Ziel sehe greife ich auch gerne zum Lötkolben und Programmieradapter um dieses zu ermöglichen.&lt;br /&gt;
Erfahrungen im Bereich:&lt;br /&gt;
* Atmel AVR Mikrocontroller&lt;br /&gt;
* Analogtechnik&lt;br /&gt;
* Funktechnik&lt;br /&gt;
* EMV Probleme&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12647</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12647"/>
		<updated>2015-10-25T13:05:35Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Variante 1: NetIO ===&lt;br /&gt;
Um den Bus im Netzwerk einzubinden benötigt man zusätzlich zu dem AVR Net-IO Board eine Adapterplatine. Diese Adapterplatine kann man recht einfach auf einer Lochrasterkarte aufbauen. Wie man das ganze Aufbaut ist im Link [http://ems-gateway.myds.me/dokuwiki/doku.php?id=wiki:ems:net_io EMS-Adapter/NetIO] sehr gut erklärt.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== Variante 1: NetIO / EMSCollector ===&lt;br /&gt;
Wenn der oben beschriebene NetIO Hardware inkl. der zugehören Software läuft kann man sich um die Server-Software kümmern. Auch dieser Teil ist sehr gut in dem Link beschrieben. Abweichend hierzu kann man auf den MySQL Part verzichten da die Datenbank für FHEM nicht gebraucht wird. Maximal zum kompilieren des Collectors werden die Pakete benötigt, können danach jedoch wieder deinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreichem erstellen des Moduls kann es mit &amp;lt;code&amp;gt;chmod 700 collectord&amp;lt;/code&amp;gt; ausführbar und mit &amp;lt;code&amp;gt;cp collectord /usr/bin/&amp;lt;/code&amp;gt; &#039;&#039;installiert&#039;&#039; werden.&lt;br /&gt;
&lt;br /&gt;
mit &amp;lt;code&amp;gt;collectord --db-path none -d all -C 7777 -D 7778 tcp:IP_NETIO:7950 -f&amp;lt;/code&amp;gt; kann ein erster Test stattfinden.&lt;br /&gt;
&lt;br /&gt;
Die Parameter bedeuten:&lt;br /&gt;
*&amp;lt;code&amp;gt;--db-path none&amp;lt;/code&amp;gt; keine Datenbankanbindung&lt;br /&gt;
*&amp;lt;code&amp;gt;-d all&amp;lt;/code&amp;gt; volle Debugstufe&lt;br /&gt;
*&amp;lt;code&amp;gt;-C 7777&amp;lt;/code&amp;gt; Telnet Steuerport 7777&lt;br /&gt;
*&amp;lt;code&amp;gt;-C 7778&amp;lt;/code&amp;gt; Telnet Steuerport 7778&lt;br /&gt;
*&amp;lt;code&amp;gt;tcp:IP_NETIO:7950&amp;lt;/code&amp;gt; Schnittstelle zum Net-IO (IP Bitte anpassen)&lt;br /&gt;
*&amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; Vordergrund&lt;br /&gt;
&lt;br /&gt;
Wenn nun eine Verbindung besteht und alle Tests durchlaufen sind kann man in &amp;lt;code&amp;gt;/etc/crontab&amp;lt;/code&amp;gt; folgende Zeile am Ende einfügen &amp;lt;code&amp;gt;@reboot collectord_neu --db-path none -C 7777 -D 7778 tcp:192.168.0.248:7950&amp;lt;/code&amp;gt; um den Dämon direkt beim Boot des FHEM-Servers zu starten.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
tbd.&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Dashboard&amp;diff=12646</id>
		<title>Dashboard</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Dashboard&amp;diff=12646"/>
		<updated>2015-10-25T12:59:39Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Kleines Howto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Todo|Weitere Überarbeitung und Anpassung an Modul-Version 3, siehe {{Link2Forum|Topic=16503|Message=309740|LinkText=Update-Hinweise}}) }}&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Beliebiges Anordnen von Gruppen&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Frontends&lt;br /&gt;
|ModTechName=95_Dashboard.pm&lt;br /&gt;
|ModOwner=svenson08&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 (seit 05.07.2015 entfallen, siehe {{Link2Forum|Topic=16503|Message=309740|LinkText=Update-Hinweise}})&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;
:Festlegen der Höhe der oberen Reihe des Dashboards.&lt;br /&gt;
;dashboard_webfrontendfilter (seit 05.07.2015 entfallen, siehe {{Link2Forum|Topic=16503|Message=309740|LinkText=Update-Hinweise}})&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;
;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;
&lt;br /&gt;
:&amp;lt;code&amp;gt;attr anyViews dashboard_width 80%&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr anyViews dashboard_tab1groups &amp;lt;GRUPPE1&amp;gt;,&amp;lt;GRUPPE2&amp;gt;,&amp;lt;GRUPPE3&amp;gt;&amp;lt;/code&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. Bitte denkt daran auch Komponenten den Gruppen zuzuweisen (über das jeweils zur Kompontente gehörende &amp;quot;groups&amp;quot;-Attribut) da ansonsten das Dasboard leer bleibt.&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;
* (05.07.2015) {{Link2Forum|Topic=16503|Message=309740|LinkText=Änderungsübersicht und Update-Hinweise}}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=16503}} über &#039;&#039;Dashboard&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Frontends]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Dashboard&amp;diff=12645</id>
		<title>Dashboard</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Dashboard&amp;diff=12645"/>
		<updated>2015-10-25T12:59:05Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Kleines Howto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Todo|Weitere Überarbeitung und Anpassung an Modul-Version 3, siehe {{Link2Forum|Topic=16503|Message=309740|LinkText=Update-Hinweise}}) }}&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Beliebiges Anordnen von Gruppen&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Frontends&lt;br /&gt;
|ModTechName=95_Dashboard.pm&lt;br /&gt;
|ModOwner=svenson08&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 (seit 05.07.2015 entfallen, siehe {{Link2Forum|Topic=16503|Message=309740|LinkText=Update-Hinweise}})&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;
:Festlegen der Höhe der oberen Reihe des Dashboards.&lt;br /&gt;
;dashboard_webfrontendfilter (seit 05.07.2015 entfallen, siehe {{Link2Forum|Topic=16503|Message=309740|LinkText=Update-Hinweise}})&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;
;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;
&lt;br /&gt;
:&amp;lt;code&amp;gt;attr anyViews dashboard_width 80%&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr anyViews dashboard_tab1groups &amp;lt;GRUPPE1&amp;gt;,&amp;lt;GRUPPE2&amp;gt;,&amp;lt;GRUPPE3&amp;gt;&amp;lt;/code&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. Bitte denkt daran auch Komponenten den Gruppen zuzuweisen (über das jeweilige groups Attribut) da ansonsten das Dasboard leer bleibt.&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;
* (05.07.2015) {{Link2Forum|Topic=16503|Message=309740|LinkText=Änderungsübersicht und Update-Hinweise}}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=16503}} über &#039;&#039;Dashboard&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Frontends]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12644</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12644"/>
		<updated>2015-10-25T12:55:04Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Variante 1: NetIO ===&lt;br /&gt;
Um den Bus im Netzwerk einzubinden benötigt man zusätzlich zu dem AVR Net-IO Board eine Adapterplatine. Diese Adapterplatine kann man recht einfach auf einer Lochrasterkarte aufbauen. Wie man das ganze Aufbaut ist im Link [http://ems-gateway.myds.me/dokuwiki/doku.php?id=wiki:ems:net_io EMS-Adapter/NetIO] sehr gut erklärt.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== Variante 1: NetIO / EMSCollector ===&lt;br /&gt;
Wenn der oben beschriebene NetIO Hardware inkl. der zugehören Software läuft kann man sich um die Server-Software kümmern. Auch dieser Teil ist sehr gut in dem Link beschrieben. Abweichend hierzu kann man auf den MySQL Part verzichten da die Datenbank für FHEM nicht gebraucht wird. Maximal zum kompilieren des Collectors werden die Pakete benötigt, können danach jedoch wieder deinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreichem erstellen des Moduls kann es mit &amp;lt;code&amp;gt;chmod 700 collectord&amp;lt;/code&amp;gt; ausführbar und mit &amp;lt;code&amp;gt;cp collectord /usr/bin/&amp;lt;/code&amp;gt; &#039;&#039;installiert&#039;&#039; werden.&lt;br /&gt;
&lt;br /&gt;
mit &amp;lt;code&amp;gt;collectord --db-path none -d all -C 7777 -D 7778 tcp:IP_NETIO:7950 -f&amp;lt;/code&amp;gt; kann ein erster Test stattfinden.&lt;br /&gt;
&lt;br /&gt;
Die Parameter bedeuten:&lt;br /&gt;
*&amp;lt;code&amp;gt;--db-path none&amp;lt;/code&amp;gt; keine Datenbankanbindung&lt;br /&gt;
*&amp;lt;code&amp;gt;-d all&amp;lt;/code&amp;gt; volle Debugstufe&lt;br /&gt;
*&amp;lt;code&amp;gt;-C 7777&amp;lt;/code&amp;gt; Telnet Steuerport 7777&lt;br /&gt;
*&amp;lt;code&amp;gt;-C 7778&amp;lt;/code&amp;gt; Telnet Steuerport 7778&lt;br /&gt;
*&amp;lt;code&amp;gt;tcp:IP_NETIO:7950&amp;lt;/code&amp;gt; Schnittstelle zum Net-IO (IP Bitte anpassen)&lt;br /&gt;
*&amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; Vordergrund&lt;br /&gt;
&lt;br /&gt;
Wenn nun eine Verbindung besteht und alle Tests durchlaufen sind kann man in &amp;lt;code&amp;gt;/etc/crontab&amp;lt;/code&amp;gt; folgende Zeile am Ende einfügen &amp;lt;code&amp;gt;@reboot collectord_neu --db-path none -C 7777 -D 7778 tcp:192.168.0.248:7950&amp;lt;/code&amp;gt; um den Dämon direkt beim Boot des FHEM-Servers zu starten.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12643</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12643"/>
		<updated>2015-10-25T12:51:16Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Variante 1: NetIO / EMSCollector */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Variante 1: NetIO ===&lt;br /&gt;
Um den Bus im Netzwerk einzubinden benötigt man zusätzlich zu dem AVR Net-IO Board eine Adapterplatine. Diese Adapterplatine kann man recht einfach auf einer Lochrasterkarte aufbauen. Wie man das ganze Aufbaut ist im Link [http://ems-gateway.myds.me/dokuwiki/doku.php?id=wiki:ems:net_io EMS-Adapter/NetIO] sehr gut erklärt.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== Variante 1: NetIO / EMSCollector ===&lt;br /&gt;
Wenn der oben beschriebene NetIO Hardware inkl. der zugehören Software läuft kann man sich um die Server-Software kümmern. Auch dieser Teil ist sehr gut in dem Link beschrieben. Abweichend hierzu kann man auf den MySQL Part verzichten da die Datenbank für FHEM nicht gebraucht wird. Maximal zum kompilieren des Collectors werden die Pakete benötigt, können danach jedoch wieder deinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreichem erstellen des Moduls kann es mit &amp;lt;code&amp;gt;chmod 700 collectord&amp;lt;/code&amp;gt; ausführbar und mit &amp;lt;code&amp;gt;cp collectord /usr/bin/&amp;lt;/code&amp;gt; &#039;&#039;installiert&#039;&#039; werden.&lt;br /&gt;
&lt;br /&gt;
mit &amp;lt;code&amp;gt;collectord --db-path none -d all -C 7777 -D 7778 tcp:IP_NETIO:7950 -f&amp;lt;/code&amp;gt; kann ein erster Test stattfinden. Die Parameter bedeuten:&lt;br /&gt;
*&amp;lt;code&amp;gt;--db-path none&amp;lt;/code&amp;gt; keine Datenbankanbindung&lt;br /&gt;
*&amp;lt;code&amp;gt;-d all&amp;lt;/code&amp;gt; volle Debugstufe&lt;br /&gt;
*&amp;lt;code&amp;gt;-C 7777&amp;lt;/code&amp;gt; Telnet Steuerport 7777&lt;br /&gt;
*&amp;lt;code&amp;gt;-C 7778&amp;lt;/code&amp;gt; Telnet Steuerport 7778&lt;br /&gt;
*&amp;lt;code&amp;gt;tcp:IP_NETIO:7950&amp;lt;/code&amp;gt; Schnittstelle zum Net-IO&lt;br /&gt;
*&amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; Vordergrund&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12642</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12642"/>
		<updated>2015-10-25T12:47:25Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Variante 1: NetIO / EMSCollector */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Variante 1: NetIO ===&lt;br /&gt;
Um den Bus im Netzwerk einzubinden benötigt man zusätzlich zu dem AVR Net-IO Board eine Adapterplatine. Diese Adapterplatine kann man recht einfach auf einer Lochrasterkarte aufbauen. Wie man das ganze Aufbaut ist im Link [http://ems-gateway.myds.me/dokuwiki/doku.php?id=wiki:ems:net_io EMS-Adapter/NetIO] sehr gut erklärt.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== Variante 1: NetIO / EMSCollector ===&lt;br /&gt;
Wenn der oben beschriebene NetIO Hardware inkl. der zugehören Software läuft kann man sich um die Server-Software kümmern. Auch dieser Teil ist sehr gut in dem Link beschrieben. Abweichend hierzu kann man auf den MySQL Part verzichten da die Datenbank für FHEM nicht gebraucht wird. Maximal zum kompilieren des Collectors werden die Pakete benötigt, können danach jedoch wieder deinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreichem erstellen des Moduls kann es mit &amp;lt;code&amp;gt;chmod 700 collectord&amp;lt;/code&amp;gt; ausführbar und mit &amp;lt;code&amp;gt;cp collectord /usr/bin/&amp;lt;/code&amp;gt; &#039;&#039;installiert&#039;&#039; werden.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12641</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12641"/>
		<updated>2015-10-25T12:44:24Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Variante 1: NetIO ===&lt;br /&gt;
Um den Bus im Netzwerk einzubinden benötigt man zusätzlich zu dem AVR Net-IO Board eine Adapterplatine. Diese Adapterplatine kann man recht einfach auf einer Lochrasterkarte aufbauen. Wie man das ganze Aufbaut ist im Link [http://ems-gateway.myds.me/dokuwiki/doku.php?id=wiki:ems:net_io EMS-Adapter/NetIO] sehr gut erklärt.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== Variante 1: NetIO / EMSCollector ===&lt;br /&gt;
Wenn der oben beschriebene NetIO Hardware inkl. der zugehören Software läuft kann man sich um die Server-Software kümmern. Auch dieser Teil ist sehr gut in dem Link beschrieben. Abweichend hierzu kann man auf den MySQL Part verzichten da die Datenbank für FHEM nicht gebraucht wird.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12640</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12640"/>
		<updated>2015-10-25T12:40:52Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Variante 1: NetIO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Variante 1: NetIO ===&lt;br /&gt;
Um den Bus im Netzwerk einzubinden benötigt man zusätzlich zu dem AVR Net-IO Board eine Adapterplatine. Diese Adapterplatine kann man recht einfach auf einer Lochrasterkarte aufbauen. Wie man das ganze Aufbaut ist im Link [http://ems-gateway.myds.me/dokuwiki/doku.php?id=wiki:ems:net_io EMS-Adapter/NetIO] sehr gut erklärt.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12639</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12639"/>
		<updated>2015-10-25T12:40:06Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Variante 1: NetIO ===&lt;br /&gt;
Um den Bus im Netzwerk einzubinden benötigt man zusätzlich zu dem AVR Net-IO Board eine Adapterplatine. Diese Adapterplatine kann man recht einfach auf einer Lochrasterkarte aufbauen. Wie man das ganze Aufbaut ist im Link xyz sehr gut erklärt.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12638</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12638"/>
		<updated>2015-10-25T12:37:56Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Variante 1: NetIO ===&lt;br /&gt;
Um den Bus im Netzwerk einzubinden benötigt man zusätzlich zu dem AVR Net-IO Board eine Adapterplatine. Diese Adapterplatine kann man recht einfach auf einer Lochrasterkarte aufbauen. Wie man das ganze Aufbaut ist im Link xyz sehr gut erklärt.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://ems-gateway.myds.me/dokuwiki/doku.php?id=wiki:ems:net_io EMS-Adapter/NetIO] zum Thema &#039;&#039;Net-IO Hardware&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12637</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12637"/>
		<updated>2015-10-25T12:37:15Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Variante 1: NetIO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Variante 1: NetIO ===&lt;br /&gt;
Um den Bus im Netzwerk einzubinden benötigt man zusätzlich zu dem AVR Net-IO Board eine Adapterplatine. Diese Adapterplatine kann man recht einfach auf einer Lochrasterkarte aufbauen. Wie man das ganze Aufbaut ist im Link xyz sehr gut erklärt.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://ems-gateway.myds.me/dokuwiki/doku.php?id=wiki:ems:net_io] zum Thema &#039;&#039;Net-IO Hardware&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12636</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12636"/>
		<updated>2015-10-25T12:36:50Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Variante 1: NetIO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Variante 1: NetIO ===&lt;br /&gt;
Um den Bus im Netzwerk einzubinden benötigt man zusätzlich zu dem AVR Net-IO Board eine Adapterplatine. Diese Adapterplatine kann man recht einfach auf einer Lochrasterkarte aufbauen. Wie man das ganze Aufbaut kann im Link 1 einsehen.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://ems-gateway.myds.me/dokuwiki/doku.php?id=wiki:ems:net_io] zum Thema &#039;&#039;Net-IO Hardware&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12635</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12635"/>
		<updated>2015-10-25T12:35:36Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Variante 1: NetIO ===&lt;br /&gt;
Um den Bus im Netzwerk einzubinden benötigt man zusätzlich zu dem AVR Net-IO Board eine Adapterplatine.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://ems-gateway.myds.me/dokuwiki/doku.php?id=wiki:ems:net_io] zum Thema &#039;&#039;Net-IO Hardware&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12634</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12634"/>
		<updated>2015-10-25T12:34:35Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Konfiguration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://ems-gateway.myds.me/dokuwiki/doku.php?id=wiki:ems:net_io] zum Thema &#039;&#039;Net-IO Hardware&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12633</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12633"/>
		<updated>2015-10-25T12:29:19Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12632</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12632"/>
		<updated>2015-10-25T12:29:10Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: /* Voraussetzungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12631</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12631"/>
		<updated>2015-10-25T12:28:18Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Man benötigt ein Inferfacemodul sowie eine Server-Software auf dem FHEM Server.&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12630</id>
		<title>Buderus EMS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Buderus_EMS&amp;diff=12630"/>
		<updated>2015-10-25T12:27:11Z</updated>

		<summary type="html">&lt;p&gt;Rspecht: Die Seite wurde neu angelegt: „Buderus EMS ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermost…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Buderus EMS]] ist das Bussystem zwischen den einzelnen Komponenten der Firma Buderus. In den meisten Fällen verbindet dieser Bus mindestens den Wandthermostat und die Heizung.&lt;/div&gt;</summary>
		<author><name>Rspecht</name></author>
	</entry>
</feed>