<?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=Hexenmeister</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=Hexenmeister"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Hexenmeister"/>
	<updated>2026-05-01T03:36:16Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT_DEVICE&amp;diff=27921</id>
		<title>MQTT DEVICE</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT_DEVICE&amp;diff=27921"/>
		<updated>2018-09-24T20:20:46Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbinden von Geräten, die über MQTT Daten senden und empfangen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=MQTT_DEVICE&lt;br /&gt;
|ModForumArea=MQTT&lt;br /&gt;
|ModTechName=10_MQTT_DEVICE.pm&lt;br /&gt;
|ModOwner=hexenmeister ({{Link2FU|4065|Forum}}) }}&lt;br /&gt;
Das Modul {{Link2CmdRef|Anker=MQTT_DEVICE|Lang=en|Label=MQTT_DEVICE}} ermöglicht es, Geräte einzubinden, die über eine MQTT-Schnittstelle verfügen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Um &#039;&#039;MQTT_DEVICE&#039;&#039; nutzen zu können, muss ein [[MQTT]]-Gerät als [[Interface|Gateway]] zu einem funktionsfähigen Broker definiert sein.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&lt;br /&gt;
Die Syntax für das Anlegen eines MQTT-Devices ist der {{Link2CmdRef|Anker=MQTT_DEVICEdefine|Label=CommandRef}} zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
&lt;br /&gt;
Die eigentlichen Details zur Kommunikation sind - entsprechend der sehr flexiblen Gestaltung des MQTT-Protokolls an sich - nicht direkt im Define festgelegt, sondern werden anschließend über Attribute festgelegt.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung funktioniert bidirektional:&lt;br /&gt;
&lt;br /&gt;
* Mit den Attributen &#039;publishState&#039; und &#039;publishReading_&amp;lt;readingname&amp;gt; man kann Änderungen am State bzw. Readings an den Broker übermitteln, der diese dann an die eigentlichen Geräte weitergibt oder dort vorhält. Der Attribut-Wert ist immer das Topic an das die Message geschickt werden soll. Message-Inhalt ist jeweils der neue Wert des Readings bzw. states.&lt;br /&gt;
* Mit den Attributen &#039;subscribeSet&#039; bzw. &#039;subscribeSet_&amp;lt;setcommand&amp;gt;&#039; kann man MQTT-topics abonnieren, also automatische Benachrichtigungen empfangen, sobald ein Gerät dort Änderungen einträgt. Immer wenn eine Nachricht auf dem abonnierten Topic eintrifft für das betreffende Device &#039;set &amp;lt;devicename&amp;gt; &amp;lt;setcommand&amp;gt; &amp;lt;messageinhalt&amp;gt; ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Legt man ein neues Device an, dessen Topics man noch nicht genau kennt, kann man das Attribut MQTT_DEVICE &#039;autoSubscribeReadings&#039; setzen. Z.B. ein&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;name&amp;gt; autoSubscribeReadings wohnzimmer/+&amp;lt;/code&amp;gt; sorgt dafür, dass für alle empfangenen Messages automatisch das jeweils passende &#039;subscribeReading_xxx&#039;-Attribut erstellt und das zugehörige Reading auch gleich geupdated wird.&lt;br /&gt;
Sind nach einer gewissen Zeit alle Readings angelegt, kann das Attribut wieder gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
== Ergänzende Hinweise ==&lt;br /&gt;
Manche MQTT-Geräte senden JSON-Messages, die einzelne oder mehrere Informationen enthalten können, die in FHEM anschließend als einzelne Readings ausgewertet werden sollen.  Hierfür wird das Modul {{Link2CmdRef|Anker=expandJSON|Lang=en|Label=expandJSON}} benötigt.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
* [[Sonoff#Anbindung FHEM]]&lt;br /&gt;
*[[Sonoff#FHEM Anbindung]]&lt;br /&gt;
* [[Sonoff#Sonoff Th10/16]]&lt;br /&gt;
* {{Link2Forum|Topic=74754|LinkText=Einbindung von Milight-Leuchtmitteln}} über eine Eigenbau-Bridge&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=27532|LinkText=Ankündigung}} der MQTT Module&lt;br /&gt;
* [[MQTT Einführung]]&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT_(Modul)&amp;diff=27753</id>
		<title>MQTT (Modul)</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT_(Modul)&amp;diff=27753"/>
		<updated>2018-08-25T18:37:33Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Stellt als Gateway die Verbindung zu einem MQTT-Broker her&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=MQTT&lt;br /&gt;
|ModTechName=00_MQTT.pm&lt;br /&gt;
|ModOwner=hexenmeister ({{Link2FU|4065|Forum}}) }}&lt;br /&gt;
Das Modul [[MQTT]] fungiert als [[Interface|Verbindung]] zwischen FHEM und einem MQTT Broker und repräsentiert ein  &#039;&#039;&#039;&#039;&#039;MQTT Gateway&#039;&#039;&#039;&#039;&#039;. Die durch die Module [[MQTT_DEVICE]] oder {{Link2CmdRef|Anker=MQTT_BRIDGE|Lang=en|Label=MQTT_BRIDGE}} repräsentierten Client-Geräte sind gesondert anzulegen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Es muss für jedes MQTT-Gateway ein Broker eingerichtet und erreichbar sein.&lt;br /&gt;
Eine Anleitung zur Einrichtung eines Mosquitto-Brokers finden Sie z.B. im Artikel [[MQTT Einführung]].&lt;br /&gt;
&lt;br /&gt;
== Begrifflichkeiten in Kürze ==&lt;br /&gt;
Ein Broker ist ein zentraler Serverdienst (irgendwo im Netz oder auf derselben Maschine, auf der auch FHEM läuft&amp;lt;ref&amp;gt;In den meisten Anwendungsfällen genügt es dabei, &#039;&#039;&#039;einen&#039;&#039;&#039; MQTT-Server zu betreiben, selbst wenn mehrere FHEM-Instanzen darauf zugreifen sollen.&amp;lt;/ref&amp;gt;), an den Geräte ihre Informationen weitergeben (publish), und der dann dafür sorgt, dass diese Information an alle anderen Geräte weitergegeben wird, die sich dafür interessieren (subscribe). [[MQTT]] fungiert dabei als [[Systemübersicht#Interfaces| IO-Modul]] und organisiert die Kommunikation zwischen dem Broker und allen FHEM-Geräten, die MQTT bei diesem Server nutzen wollen.&lt;br /&gt;
&lt;br /&gt;
== Define ==&lt;br /&gt;
Das MQTT Gateway wird angelegt mit&lt;br /&gt;
&amp;lt;code&amp;gt;define &#039;&#039;&#039;meinMQTTGW&#039;&#039;&#039; MQTT &amp;lt;Broker-IP&amp;gt;[:&amp;lt;Broker-Port&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Sofern der Broker mit FEHM über localhost kommunizieren kann, sollte als IP 127.0.0.1 verwendet werden.}}&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
Danach können entsprechende Client-Devices angelegt werden, &lt;br /&gt;
[[MQTT_DEVICE]] wird verwendet, wenn das physikalische Device (Sensor oder Aktor) über mqtt kommuniziert, wie dieses z.B. bei vielen ESP8266-basierten Geräten der Fall ist. &lt;br /&gt;
{{Link2CmdRef|Anker=MQTT_BRIDGE|Lang=en|Label=MQTT_BRIDGE}} ist für den Fall, dass ein FHEM-Device&amp;lt;ref&amp;gt;Dies kann z.B. ein beliebiger HM- oder Z-Wave-Aktor sein, der ein Licht einschaltet.&amp;lt;/ref&amp;gt; existiert und dieses über MQTT sicht- bzw. steuerbar gemacht werden soll.&lt;br /&gt;
&lt;br /&gt;
== Ergänzende Funktionen ==&lt;br /&gt;
Manche MQTT-Geräte senden Informationen im JSON-Format. Um solche Informationen in FHEM verwenden zu können, müssen sie zunächst in ein anderes Format überführt werden. Hierfür wird das Modul {{Link2CmdRef|Anker=expandJSON|Lang=en|Label=expandJSON}} benötigt.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=27532|LinkText=Ankündigung}} der MQTT Module&lt;br /&gt;
* [[MQTT Einführung]]&lt;br /&gt;
* {{Link2Forum|Topic=80416|LinkText=MQTT-Bridge als Brücke zwischen zwei FHEM-Instanzen}}&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT_DEVICE&amp;diff=27752</id>
		<title>MQTT DEVICE</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT_DEVICE&amp;diff=27752"/>
		<updated>2018-08-25T18:36:42Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: Maintainerwechsel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbinden von Geräten, die über MQTT Daten senden und empfangen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=MQTT_DEVICE&lt;br /&gt;
|ModForumArea=MQTT&lt;br /&gt;
|ModTechName=10_MQTT_DEVICE.pm&lt;br /&gt;
|ModOwner=hexenmeister ({{Link2FU|4065|Forum}}) }}&lt;br /&gt;
Das Modul {{Link2CmdRef|Anker=MQTT_DEVICE|Lang=en|Label=MQTT_DEVICE}} ermöglicht es, Geräte einzubinden, die über eine MQTT-Schnittstelle verfügen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Um &#039;&#039;MQTT_DEVICE&#039;&#039; nutzen zu können, muss ein [[MQTT]]-Gerät als [[Interface|Gateway]] zu einem funktionsfähigen Broker definiert sein.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&lt;br /&gt;
Die Syntax für das Anlegen eines MQTT-Devices ist der {{Link2CmdRef|Anker=MQTT_DEVICEdefine|Label=CommandRef}} zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
&lt;br /&gt;
Die eigentlichen Details zur Kommunikation sind - entsprechend der sehr flexiblen Gestaltung des MQTT-Protokolls an sich - nicht direkt im Define festgelegt, sondern werden anschließend über Attribute festgelegt.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung funktioniert bidirektional:&lt;br /&gt;
&lt;br /&gt;
* Mit den Attributen &#039;publishState&#039; und &#039;publishReading_&amp;lt;readingname&amp;gt; man kann Änderungen am State bzw. Readings an den Broker übermitteln, der diese dann an die eigentlichen Geräte weitergibt oder dort vorhält. Der Attribut-Wert ist immer das Topic an das die Message geschickt werden soll. Message-Inhalt ist jeweils der neue Wert des Readings bzw. states.&lt;br /&gt;
* Mit den Attributen &#039;subscribeSet&#039; bzw. &#039;subscribeSet_&amp;lt;setcommand&amp;gt;&#039; kann man MQTT-topics abonnieren, also automatische Benachrichtigungen empfangen, sobald ein Gerät dort Änderungen einträgt. Immer wenn eine Nachricht auf dem abonnierten Topic eintrifft für das betreffende Device &#039;set &amp;lt;devicename&amp;gt; &amp;lt;setcommand&amp;gt; &amp;lt;messageinhalt&amp;gt; ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Legt man ein neues Device an, dessen Topics man noch nicht genau kennt, kann man das Attribut MQTT_DEVICE &#039;autoSubscribeReadings&#039; setzen. Z.B. ein&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;name&amp;gt; autoSubscribeReadings wohnzimmer/+&#039;&amp;lt;/code&amp;gt; sorgt dafür, dass für alle empfangenen Messages automatisch das jeweils passende &#039;subscribeReading_xxx&#039;-Attribut erstellt und das zugehörige Reading auch gleich geupdated wird.&lt;br /&gt;
Sind nach einer gewissen Zeit alle Readings angelegt, kann das Attribut wieder gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
== Ergänzende Hinweise ==&lt;br /&gt;
Manche MQTT-Geräte senden JSON-Messages, die einzelne oder mehrere Informationen enthalten können, die in FHEM anschließend als einzelne Readings ausgewertet werden sollen.  Hierfür wird das Modul {{Link2CmdRef|Anker=expandJSON|Lang=en|Label=expandJSON}} benötigt.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
* [[Sonoff#Anbindung FHEM]]&lt;br /&gt;
*[[Sonoff#FHEM Anbindung]]&lt;br /&gt;
* [[Sonoff#Sonoff Th10/16]]&lt;br /&gt;
* {{Link2Forum|Topic=74754|LinkText=Einbindung von Milight-Leuchtmitteln}} über eine Eigenbau-Bridge&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=27532|LinkText=Ankündigung}} der MQTT Module&lt;br /&gt;
* [[MQTT Einführung]]&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=9717</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=9717"/>
		<updated>2015-01-31T15:24:45Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: Ergänzt: Remote Zugriff&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.&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;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9135</id>
		<title>ReadingsGroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9135"/>
		<updated>2014-12-30T23:11:45Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Heizungsteuerung für HM Wand- und Heizkörperthermostate */&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 commandref.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Weitergehende Erläuterungen zu einzelnen Attributen:&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;
&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;
=== notime ===&lt;br /&gt;
Es werden keine Timestamps für die Readings angezeigt. Nur für einspaltige readingGroups sinnvoll.&lt;br /&gt;
=== nostate ===&lt;br /&gt;
Das state-Reading wird bei regex match nicht berücksichtigt und nicht angezeigt.&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;
== 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_baraometric_pressure&amp;gt;,&amp;lt;Luftdruck&amp;gt;,pressure&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039; und &#039;&#039;&#039;pressure&#039;&#039;&#039; vom Device WetterXXX jeweils mit einem Icon und einem Label davor.&lt;br /&gt;
| rowspan=3 | [[Datei:rgWetter.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueFormat { temperature =&amp;gt; &#039;%1.f &amp;amp;amp;deg;C&#039;, humidity =&amp;gt; &#039;%1.f %%&#039;, pressure =&amp;gt; &#039;%i mbar&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Readingswerte&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueStyle style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Readings sollen rechtsbündig dargestellt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Value ausgeben ===&lt;br /&gt;
Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den 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]]&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;code&amp;gt;&lt;br /&gt;
 #Heizung regeln in readingsGroup&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDown($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$CMD) = @_;&lt;br /&gt;
  &lt;br /&gt;
   my $icon = $CMD;&lt;br /&gt;
   my $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-new&amp;quot;,&amp;quot;20&amp;quot; );&lt;br /&gt;
   $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-temp&amp;quot;,&amp;quot;20&amp;quot; )&lt;br /&gt;
      if( !$VALUE || $VALUE == 0 );&lt;br /&gt;
   my $link;&lt;br /&gt;
  &lt;br /&gt;
   if( $CMD eq &amp;quot;up&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_upward&amp;quot;;&lt;br /&gt;
     $VALUE += 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;lt;= 24 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@red&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   } elsif( $CMD eq &amp;quot;down&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_downward&amp;quot;;&lt;br /&gt;
     $VALUE -= 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;gt;= 18 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@blue&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $notify = &amp;quot;notifyHeizungUpDown&amp;quot;;&lt;br /&gt;
   if( !defined($defs{$notify}) ) {&lt;br /&gt;
     CommandDefine(undef,&lt;br /&gt;
                    &amp;quot;$notify notify .*:desired-new.* &amp;quot;&lt;br /&gt;
                    .&amp;quot;{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }&amp;quot; );&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $ret = &amp;quot;%$icon&amp;quot;;&lt;br /&gt;
   $ret .= &amp;quot;%$link&amp;quot; if( $link );&lt;br /&gt;
  &lt;br /&gt;
   return $ret;&lt;br /&gt;
 }&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDownNotify($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$VALUE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   return if( $VALUE == 0 );&lt;br /&gt;
  &lt;br /&gt;
   my $at = &amp;quot;triggerHeizungUpDown_$DEVICE&amp;quot;;&lt;br /&gt;
   CommandDelete(undef, $at) if( defined($defs{$at}) );&lt;br /&gt;
   CommandDefine(undef,&lt;br /&gt;
                  &amp;quot;$at at +00:00:03 &amp;quot;&lt;br /&gt;
                  .&amp;quot;{my \$v = ReadingsVal(\&amp;quot;$DEVICE\&amp;quot;,\&amp;quot;desired-new\&amp;quot;,undef);&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;set $DEVICE desired-temp \$v\&amp;quot;) if( \$v );&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;setreading $DEVICE desired-new 00\&amp;quot;);}&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
   return undef;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich &amp;gt;=18 und &amp;lt;= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 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;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:RgThermostate.png|thumb|500px|links|Status, Steuerung und Wochenprofil]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;&lt;br /&gt;
set d_label Heizung Heizung &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Temperatur Temperatur &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label  Status Status &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Wochenplan Wochenplan &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Werktag Werktag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Samstag Samstag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Sonntag Sonntag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum1 Zeitraum 1 &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum2 Zeitraum 2 &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|Erzeugen der Readings im device [[Dummy_Hilfen#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; &lt;br /&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_Hilfen#d_label|d_label]]. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate nonames 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausblenden der Device Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate valueIcon &lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| ReadingsGoup anlegen. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Schrift fett setzen etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;Regler1&amp;quot;,EG_WZ_TT02_Clima=&amp;gt;&amp;quot;&amp;amp;nbsp;;&amp;amp;nbsp;;&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|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define myTemp readingsGroup &amp;lt;Raum&amp;gt;,&amp;lt;Tist&amp;gt;,&amp;lt;Tsoll&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Tnight&amp;gt;,&amp;lt;Tday&amp;gt;,&amp;lt;Hum&amp;gt;,&amp;lt;BatTC&amp;gt;,&amp;lt;Vist&amp;gt;,&amp;lt;Vsoll&amp;gt;,&amp;lt;Verr&amp;gt;,&amp;lt;BatVD&amp;gt; Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst &amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilantriebs. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp mapping    { &#039;Broetje&#039; =&amp;gt; &#039;Garten&#039;,&#039;Thermostat.AZ&#039; =&amp;gt; &#039;EG Arbeitszimmer&#039;,&#039;Thermostat.SZ&#039; =&amp;gt; &#039;OG Schlafzimmer&#039;,&#039;Thermostat.WZ&#039;=&amp;gt;&#039;EG Wohnzimmer&#039;,&#039;Thermostat.Kueche&#039; =&amp;gt; &#039;EG Küche&#039;,&#039;Thermostat.GZ&#039; =&amp;gt; &#039;OG Gästezimmer&#039;,&#039;Thermostat.Bad&#039; =&amp;gt; &#039;EG Bad&#039;,&#039;Thermostat.Bad.OG&#039; =&amp;gt; &#039;OG Bad&#039;,&#039;Thermostat.OZ&#039; =&amp;gt; &#039;EG Kaminzimmer&#039;,&#039;desired-temp&#039; =&amp;gt; &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp commands   { &#039;desired-temp&#039; =&amp;gt; &#039;desired-temp:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| desired-temp soll per dropDown einstellbar sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp nameStyle style=&amp;quot;color:yellow&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueFormat { &#039;measured-temp&#039; =&amp;gt; &amp;quot;%0.1f &amp;amp;amp;deg;C&amp;quot;,&#039;ToutIst&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;night-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;day-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;humidity&#039; =&amp;gt; &amp;quot;%.0f &lt;br /&gt;
%%&amp;quot;,&#039;ValvePosition&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;ValveDesired&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;R-valveErrorPos&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #namen des ventil device aus thermostat device ableiten&lt;br /&gt;
 sub valveOfDevice ($) {&lt;br /&gt;
   my ($DEVICE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   if ($DEVICE =~ m/AZ/) {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11).&amp;quot;.Nord&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11);  	&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.&lt;br /&gt;
|}&lt;br /&gt;
Da im {...} Teil des &amp;lt;reading&amp;gt;@&amp;lt;device&amp;gt; Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar &#039;Tricks&#039; lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:&amp;lt;code&amp;gt;...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Inhalte ===&lt;br /&gt;
[[Datei:rgDynamic-1.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 1]]&lt;br /&gt;
[[Datei:rgDynamic-2.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 2]]&lt;br /&gt;
Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich&lt;br /&gt;
einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LXrg dummy&lt;br /&gt;
attr LXrg group -&lt;br /&gt;
attr LXrg setList mode1:on,off mode2:open,closed,tilted&lt;br /&gt;
attr LXrg stateFormat 1=mode1 2=mode2&lt;br /&gt;
attr LXrg webCmd mode1:mode2&lt;br /&gt;
&lt;br /&gt;
define rg readingsGroup Window.*:state Light.*:state&lt;br /&gt;
attr rg group -&lt;br /&gt;
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode1&amp;quot;,&amp;quot;&amp;quot;) || $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode2&amp;quot;,&amp;quot;&amp;quot;) );; return undef;;}&lt;br /&gt;
&lt;br /&gt;
define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,&#039;state&#039;,&#039;&#039;);;;;fhem(&amp;quot;setreading $NAME $value&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable/Disable Button am Beispiel eines WeekdayTimer ===&lt;br /&gt;
Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den WeekdayTimer gibt es hier spezielle Erweiterungen (set Routinen, um das disable Attribut zu setzen, Reading &amp;quot;disabled&amp;quot;). Es gibt aber auch eine allgemeinere Variante (siehe [http://forum.fhem.de/index.php/topic,23655.msg169141.html#msg169141 diesen Forumsbeitrag]) für alle Objekte, die das FHEM Attribut &amp;quot;disable&amp;quot; unterstützen.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rg_scheduling.png|thumb|500px|links|Enable/Disable Button]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextUpdate&amp;quot;)}@disabled&amp;gt;,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextValue&amp;quot;)}@disabled&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Definition der angezeigten Readings. Das Reading disabled wird mit den u.a. Attributen zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine &amp;lt;code&amp;gt;rg_timer_Wasser_show_conditional&amp;lt;/code&amp;gt;, die in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, dass der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueFormat  { if ( $READING =~ m/.*DEF/ ) { my @text = split(&amp;quot; &amp;quot;, $VALUE); shift @text; return join(&amp;quot; &amp;quot;, @text) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Name des Timers wird aus dem interal Reading &amp;quot;+DEF&amp;quot; vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueIcon { &#039;disabled.0&#039; =&amp;gt; &#039;Restart&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;Shutdown&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser commands  { &#039;disabled.0&#039; =&amp;gt; &#039;set $DEVICE disable&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;set $DEVICE enable&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Toggle-Funktion für den Button. Wenn der Timer aktiv (&amp;quot;disabled.0&amp;quot;) sorgt ein Klick auf den Button, dass der Timer deaktiviert wird (&amp;quot;set $DEVICE disable&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&lt;br /&gt;
 sub rg_timer_Wasser_show_conditional($$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING) = @_;&lt;br /&gt;
   return ( ReadingsVal($DEVICE, &amp;quot;disabled&amp;quot;, &amp;quot;1&amp;quot;) eq &amp;quot;0&amp;quot; )? &lt;br /&gt;
      ReadingsVal($DEVICE, $READING, &amp;quot;reading_undef&amp;quot;) : &amp;quot;disabled&amp;quot;;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String &amp;quot;disabled&amp;quot; stattdessen angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links und Trigger ==&lt;br /&gt;
=== 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;
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;
== 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;
 &amp;lt;code&amp;gt;if( $READING eq ... ) {&lt;br /&gt;
   return xxx if( $VALUE &amp;lt; 1 );&lt;br /&gt;
   return yyy if( $VALUE &amp;lt; 1.5 );&lt;br /&gt;
   return zzz;&lt;br /&gt;
 } elsif( $READING eq ... ) {&lt;br /&gt;
   ...&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.&lt;br /&gt;
&lt;br /&gt;
=== 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;
=== 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>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9134</id>
		<title>ReadingsGroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9134"/>
		<updated>2014-12-30T22:16:06Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Heizungsteuerung für HM Wand- und Heizkörperthermostate */&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 commandref.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Weitergehende Erläuterungen zu einzelnen Attributen:&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;
&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;
=== notime ===&lt;br /&gt;
Es werden keine Timestamps für die Readings angezeigt. Nur für einspaltige readingGroups sinnvoll.&lt;br /&gt;
=== nostate ===&lt;br /&gt;
Das state-Reading wird bei regex match nicht berücksichtigt und nicht angezeigt.&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;
== 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_baraometric_pressure&amp;gt;,&amp;lt;Luftdruck&amp;gt;,pressure&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039; und &#039;&#039;&#039;pressure&#039;&#039;&#039; vom Device WetterXXX jeweils mit einem Icon und einem Label davor.&lt;br /&gt;
| rowspan=3 | [[Datei:rgWetter.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueFormat { temperature =&amp;gt; &#039;%1.f &amp;amp;amp;deg;C&#039;, humidity =&amp;gt; &#039;%1.f %%&#039;, pressure =&amp;gt; &#039;%i mbar&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Readingswerte&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueStyle style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Readings sollen rechtsbündig dargestellt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Value ausgeben ===&lt;br /&gt;
Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den 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]]&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;code&amp;gt;&lt;br /&gt;
 #Heizung regeln in readingsGroup&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDown($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$CMD) = @_;&lt;br /&gt;
  &lt;br /&gt;
   my $icon = $CMD;&lt;br /&gt;
   my $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-new&amp;quot;,&amp;quot;20&amp;quot; );&lt;br /&gt;
   $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-temp&amp;quot;,&amp;quot;20&amp;quot; )&lt;br /&gt;
      if( !$VALUE || $VALUE == 0 );&lt;br /&gt;
   my $link;&lt;br /&gt;
  &lt;br /&gt;
   if( $CMD eq &amp;quot;up&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_upward&amp;quot;;&lt;br /&gt;
     $VALUE += 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;lt;= 24 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@red&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   } elsif( $CMD eq &amp;quot;down&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_downward&amp;quot;;&lt;br /&gt;
     $VALUE -= 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;gt;= 18 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@blue&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $notify = &amp;quot;notifyHeizungUpDown&amp;quot;;&lt;br /&gt;
   if( !defined($defs{$notify}) ) {&lt;br /&gt;
     CommandDefine(undef,&lt;br /&gt;
                    &amp;quot;$notify notify .*:desired-new.* &amp;quot;&lt;br /&gt;
                    .&amp;quot;{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }&amp;quot; );&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $ret = &amp;quot;%$icon&amp;quot;;&lt;br /&gt;
   $ret .= &amp;quot;%$link&amp;quot; if( $link );&lt;br /&gt;
  &lt;br /&gt;
   return $ret;&lt;br /&gt;
 }&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDownNotify($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$VALUE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   return if( $VALUE == 0 );&lt;br /&gt;
  &lt;br /&gt;
   my $at = &amp;quot;triggerHeizungUpDown_$DEVICE&amp;quot;;&lt;br /&gt;
   CommandDelete(undef, $at) if( defined($defs{$at}) );&lt;br /&gt;
   CommandDefine(undef,&lt;br /&gt;
                  &amp;quot;$at at +00:00:03 &amp;quot;&lt;br /&gt;
                  .&amp;quot;{my \$v = ReadingsVal(\&amp;quot;$DEVICE\&amp;quot;,\&amp;quot;desired-new\&amp;quot;,undef);&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;set $DEVICE desired-temp \$v\&amp;quot;) if( \$v );&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;setreading $DEVICE desired-new 00\&amp;quot;);}&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
   return undef;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich &amp;gt;=18 und &amp;lt;= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 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;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:RgThermostate.png|thumb|500px|links|Status, Steuerung und Wochenprofil]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;&lt;br /&gt;
set d_label Heizung Heizung &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Temperatur Temperatur &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label  Status Status &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Wochenplan Wochenplan &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Werktag Werktag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Samstag Samstag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Sonntag Sonntag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum1 Zeitraum 1 &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum2 Zeitraum 2 &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|Erzeugen der Readings im device [[Dummy_Hilfen#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; &lt;br /&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_Hilfen#d_label|d_label]]. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate nonames 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausblenden der Device Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate valueIcon &lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| ReadingsGoup anlegen. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Schrift fett setzen etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;Regler1&amp;quot;,EG_WZ_TT02_Clima=&amp;gt;&amp;quot;&amp;amp;nbsp;;&amp;amp;nbsp;;&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;my_sani_heating_boost@FB0C02&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;humidity&#039;=&amp;gt;&#039;my_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;my_sani_heating_level_0@002AE0&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.10&#039; =&amp;gt; &#039;my_sani_heating_level_10@F8D53D&#039;,&#039;ValvePosition.20&#039; =&amp;gt; &#039;my_sani_heating_level_20@FF9341&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.30&#039; =&amp;gt; &#039;my_sani_heating_level_30@F17F3F&#039;,&#039;ValvePosition.40&#039; =&amp;gt; &#039;my_sani_heating_level_40@E46C3C&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.50&#039; =&amp;gt; &#039;my_sani_heating_level_50@DE3B3A&#039;,&#039;ValvePosition.60&#039; =&amp;gt; &#039;my_sani_heating_level_60@A30D2D&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.70&#039; =&amp;gt; &#039;my_sani_heating_level_70@B40A23&#039;,&#039;ValvePosition.80&#039; =&amp;gt; &#039;my_sani_heating_level_80@C40619&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.90&#039; =&amp;gt; &#039;my_sani_heating_level_90@D4030F&#039;,&#039;ValvePosition.100&#039; =&amp;gt; &#039;my_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;my_wait&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;controlMode.set_auto&#039; =&amp;gt; &#039;my_wait&#039;,&#039;controlMode.set_manual&#039; =&amp;gt; &#039;my_wait&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;R-globalBtnLock.set_on&#039; =&amp;gt; &#039;my_wait&#039;,&#039;R-globalBtnLock.set_off&#039; =&amp;gt; &#039;my_wait&#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|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define myTemp readingsGroup &amp;lt;Raum&amp;gt;,&amp;lt;Tist&amp;gt;,&amp;lt;Tsoll&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Tnight&amp;gt;,&amp;lt;Tday&amp;gt;,&amp;lt;Hum&amp;gt;,&amp;lt;BatTC&amp;gt;,&amp;lt;Vist&amp;gt;,&amp;lt;Vsoll&amp;gt;,&amp;lt;Verr&amp;gt;,&amp;lt;BatVD&amp;gt; Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst &amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilantriebs. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp mapping    { &#039;Broetje&#039; =&amp;gt; &#039;Garten&#039;,&#039;Thermostat.AZ&#039; =&amp;gt; &#039;EG Arbeitszimmer&#039;,&#039;Thermostat.SZ&#039; =&amp;gt; &#039;OG Schlafzimmer&#039;,&#039;Thermostat.WZ&#039;=&amp;gt;&#039;EG Wohnzimmer&#039;,&#039;Thermostat.Kueche&#039; =&amp;gt; &#039;EG Küche&#039;,&#039;Thermostat.GZ&#039; =&amp;gt; &#039;OG Gästezimmer&#039;,&#039;Thermostat.Bad&#039; =&amp;gt; &#039;EG Bad&#039;,&#039;Thermostat.Bad.OG&#039; =&amp;gt; &#039;OG Bad&#039;,&#039;Thermostat.OZ&#039; =&amp;gt; &#039;EG Kaminzimmer&#039;,&#039;desired-temp&#039; =&amp;gt; &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp commands   { &#039;desired-temp&#039; =&amp;gt; &#039;desired-temp:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| desired-temp soll per dropDown einstellbar sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp nameStyle style=&amp;quot;color:yellow&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueFormat { &#039;measured-temp&#039; =&amp;gt; &amp;quot;%0.1f &amp;amp;amp;deg;C&amp;quot;,&#039;ToutIst&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;night-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;day-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;humidity&#039; =&amp;gt; &amp;quot;%.0f &lt;br /&gt;
%%&amp;quot;,&#039;ValvePosition&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;ValveDesired&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;R-valveErrorPos&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #namen des ventil device aus thermostat device ableiten&lt;br /&gt;
 sub valveOfDevice ($) {&lt;br /&gt;
   my ($DEVICE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   if ($DEVICE =~ m/AZ/) {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11).&amp;quot;.Nord&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11);  	&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.&lt;br /&gt;
|}&lt;br /&gt;
Da im {...} Teil des &amp;lt;reading&amp;gt;@&amp;lt;device&amp;gt; Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar &#039;Tricks&#039; lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:&amp;lt;code&amp;gt;...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Inhalte ===&lt;br /&gt;
[[Datei:rgDynamic-1.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 1]]&lt;br /&gt;
[[Datei:rgDynamic-2.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 2]]&lt;br /&gt;
Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich&lt;br /&gt;
einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LXrg dummy&lt;br /&gt;
attr LXrg group -&lt;br /&gt;
attr LXrg setList mode1:on,off mode2:open,closed,tilted&lt;br /&gt;
attr LXrg stateFormat 1=mode1 2=mode2&lt;br /&gt;
attr LXrg webCmd mode1:mode2&lt;br /&gt;
&lt;br /&gt;
define rg readingsGroup Window.*:state Light.*:state&lt;br /&gt;
attr rg group -&lt;br /&gt;
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode1&amp;quot;,&amp;quot;&amp;quot;) || $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode2&amp;quot;,&amp;quot;&amp;quot;) );; return undef;;}&lt;br /&gt;
&lt;br /&gt;
define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,&#039;state&#039;,&#039;&#039;);;;;fhem(&amp;quot;setreading $NAME $value&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable/Disable Button am Beispiel eines WeekdayTimer ===&lt;br /&gt;
Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den WeekdayTimer gibt es hier spezielle Erweiterungen (set Routinen, um das disable Attribut zu setzen, Reading &amp;quot;disabled&amp;quot;). Es gibt aber auch eine allgemeinere Variante (siehe [http://forum.fhem.de/index.php/topic,23655.msg169141.html#msg169141 diesen Forumsbeitrag]) für alle Objekte, die das FHEM Attribut &amp;quot;disable&amp;quot; unterstützen.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rg_scheduling.png|thumb|500px|links|Enable/Disable Button]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextUpdate&amp;quot;)}@disabled&amp;gt;,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextValue&amp;quot;)}@disabled&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Definition der angezeigten Readings. Das Reading disabled wird mit den u.a. Attributen zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine &amp;lt;code&amp;gt;rg_timer_Wasser_show_conditional&amp;lt;/code&amp;gt;, die in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, dass der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueFormat  { if ( $READING =~ m/.*DEF/ ) { my @text = split(&amp;quot; &amp;quot;, $VALUE); shift @text; return join(&amp;quot; &amp;quot;, @text) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Name des Timers wird aus dem interal Reading &amp;quot;+DEF&amp;quot; vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueIcon { &#039;disabled.0&#039; =&amp;gt; &#039;Restart&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;Shutdown&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser commands  { &#039;disabled.0&#039; =&amp;gt; &#039;set $DEVICE disable&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;set $DEVICE enable&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Toggle-Funktion für den Button. Wenn der Timer aktiv (&amp;quot;disabled.0&amp;quot;) sorgt ein Klick auf den Button, dass der Timer deaktiviert wird (&amp;quot;set $DEVICE disable&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&lt;br /&gt;
 sub rg_timer_Wasser_show_conditional($$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING) = @_;&lt;br /&gt;
   return ( ReadingsVal($DEVICE, &amp;quot;disabled&amp;quot;, &amp;quot;1&amp;quot;) eq &amp;quot;0&amp;quot; )? &lt;br /&gt;
      ReadingsVal($DEVICE, $READING, &amp;quot;reading_undef&amp;quot;) : &amp;quot;disabled&amp;quot;;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String &amp;quot;disabled&amp;quot; stattdessen angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links und Trigger ==&lt;br /&gt;
=== 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;
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;
== 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;
 &amp;lt;code&amp;gt;if( $READING eq ... ) {&lt;br /&gt;
   return xxx if( $VALUE &amp;lt; 1 );&lt;br /&gt;
   return yyy if( $VALUE &amp;lt; 1.5 );&lt;br /&gt;
   return zzz;&lt;br /&gt;
 } elsif( $READING eq ... ) {&lt;br /&gt;
   ...&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.&lt;br /&gt;
&lt;br /&gt;
=== 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;
=== 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>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9133</id>
		<title>ReadingsGroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9133"/>
		<updated>2014-12-30T22:10:00Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Heizungsteuerung für HM Wand- und Heizkörperthermostate */&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 commandref.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Weitergehende Erläuterungen zu einzelnen Attributen:&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;
&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;
=== notime ===&lt;br /&gt;
Es werden keine Timestamps für die Readings angezeigt. Nur für einspaltige readingGroups sinnvoll.&lt;br /&gt;
=== nostate ===&lt;br /&gt;
Das state-Reading wird bei regex match nicht berücksichtigt und nicht angezeigt.&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;
== 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_baraometric_pressure&amp;gt;,&amp;lt;Luftdruck&amp;gt;,pressure&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039; und &#039;&#039;&#039;pressure&#039;&#039;&#039; vom Device WetterXXX jeweils mit einem Icon und einem Label davor.&lt;br /&gt;
| rowspan=3 | [[Datei:rgWetter.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueFormat { temperature =&amp;gt; &#039;%1.f &amp;amp;amp;deg;C&#039;, humidity =&amp;gt; &#039;%1.f %%&#039;, pressure =&amp;gt; &#039;%i mbar&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Readingswerte&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueStyle style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Readings sollen rechtsbündig dargestellt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Value ausgeben ===&lt;br /&gt;
Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den 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]]&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;code&amp;gt;&lt;br /&gt;
 #Heizung regeln in readingsGroup&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDown($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$CMD) = @_;&lt;br /&gt;
  &lt;br /&gt;
   my $icon = $CMD;&lt;br /&gt;
   my $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-new&amp;quot;,&amp;quot;20&amp;quot; );&lt;br /&gt;
   $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-temp&amp;quot;,&amp;quot;20&amp;quot; )&lt;br /&gt;
      if( !$VALUE || $VALUE == 0 );&lt;br /&gt;
   my $link;&lt;br /&gt;
  &lt;br /&gt;
   if( $CMD eq &amp;quot;up&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_upward&amp;quot;;&lt;br /&gt;
     $VALUE += 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;lt;= 24 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@red&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   } elsif( $CMD eq &amp;quot;down&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_downward&amp;quot;;&lt;br /&gt;
     $VALUE -= 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;gt;= 18 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@blue&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $notify = &amp;quot;notifyHeizungUpDown&amp;quot;;&lt;br /&gt;
   if( !defined($defs{$notify}) ) {&lt;br /&gt;
     CommandDefine(undef,&lt;br /&gt;
                    &amp;quot;$notify notify .*:desired-new.* &amp;quot;&lt;br /&gt;
                    .&amp;quot;{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }&amp;quot; );&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $ret = &amp;quot;%$icon&amp;quot;;&lt;br /&gt;
   $ret .= &amp;quot;%$link&amp;quot; if( $link );&lt;br /&gt;
  &lt;br /&gt;
   return $ret;&lt;br /&gt;
 }&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDownNotify($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$VALUE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   return if( $VALUE == 0 );&lt;br /&gt;
  &lt;br /&gt;
   my $at = &amp;quot;triggerHeizungUpDown_$DEVICE&amp;quot;;&lt;br /&gt;
   CommandDelete(undef, $at) if( defined($defs{$at}) );&lt;br /&gt;
   CommandDefine(undef,&lt;br /&gt;
                  &amp;quot;$at at +00:00:03 &amp;quot;&lt;br /&gt;
                  .&amp;quot;{my \$v = ReadingsVal(\&amp;quot;$DEVICE\&amp;quot;,\&amp;quot;desired-new\&amp;quot;,undef);&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;set $DEVICE desired-temp \$v\&amp;quot;) if( \$v );&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;setreading $DEVICE desired-new 00\&amp;quot;);}&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
   return undef;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich &amp;gt;=18 und &amp;lt;= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 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;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:RgThermostate.png|thumb|500px|links|Status, Steuerung und Wochenprofil]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;&lt;br /&gt;
set d_label Heizung Heizung &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Temperatur Temperatur &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label  Status Status &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Wochenplan Wochenplan &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Werktag Werktag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Samstag Samstag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Sonntag Sonntag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum1 Zeitraum 1 &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum2 Zeitraum 2 &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|Erzeugen der Readings im device [[Dummy_Hilfen#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; &lt;br /&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_Hilfen#d_label|d_label]]. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate nonames 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausblenden der Device Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate valueIcon &lt;br /&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;}&lt;br /&gt;
&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;
{| 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;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| ReadingsGoup anlegen. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Schrift fett setzen etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;Regler1&amp;quot;,EG_WZ_TT02_Clima=&amp;gt;&amp;quot;&amp;amp;nbsp;;&amp;amp;nbsp;;&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;my_sani_heating_boost@FB0C02&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;humidity&#039;=&amp;gt;&#039;my_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;my_sani_heating_level_0@002AE0&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.10&#039; =&amp;gt; &#039;my_sani_heating_level_10@F8D53D&#039;,&#039;ValvePosition.20&#039; =&amp;gt; &#039;my_sani_heating_level_20@FF9341&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.30&#039; =&amp;gt; &#039;my_sani_heating_level_30@F17F3F&#039;,&#039;ValvePosition.40&#039; =&amp;gt; &#039;my_sani_heating_level_40@E46C3C&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.50&#039; =&amp;gt; &#039;my_sani_heating_level_50@DE3B3A&#039;,&#039;ValvePosition.60&#039; =&amp;gt; &#039;my_sani_heating_level_60@A30D2D&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.70&#039; =&amp;gt; &#039;my_sani_heating_level_70@B40A23&#039;,&#039;ValvePosition.80&#039; =&amp;gt; &#039;my_sani_heating_level_80@C40619&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.90&#039; =&amp;gt; &#039;my_sani_heating_level_90@D4030F&#039;,&#039;ValvePosition.100&#039; =&amp;gt; &#039;my_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;my_wait&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;controlMode.set_auto&#039; =&amp;gt; &#039;my_wait&#039;,&#039;controlMode.set_manual&#039; =&amp;gt; &#039;my_wait&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;R-globalBtnLock.set_on&#039; =&amp;gt; &#039;my_wait&#039;,&#039;R-globalBtnLock.set_off&#039; =&amp;gt; &#039;my_wait&#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|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define myTemp readingsGroup &amp;lt;Raum&amp;gt;,&amp;lt;Tist&amp;gt;,&amp;lt;Tsoll&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Tnight&amp;gt;,&amp;lt;Tday&amp;gt;,&amp;lt;Hum&amp;gt;,&amp;lt;BatTC&amp;gt;,&amp;lt;Vist&amp;gt;,&amp;lt;Vsoll&amp;gt;,&amp;lt;Verr&amp;gt;,&amp;lt;BatVD&amp;gt; Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst &amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilantriebs. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp mapping    { &#039;Broetje&#039; =&amp;gt; &#039;Garten&#039;,&#039;Thermostat.AZ&#039; =&amp;gt; &#039;EG Arbeitszimmer&#039;,&#039;Thermostat.SZ&#039; =&amp;gt; &#039;OG Schlafzimmer&#039;,&#039;Thermostat.WZ&#039;=&amp;gt;&#039;EG Wohnzimmer&#039;,&#039;Thermostat.Kueche&#039; =&amp;gt; &#039;EG Küche&#039;,&#039;Thermostat.GZ&#039; =&amp;gt; &#039;OG Gästezimmer&#039;,&#039;Thermostat.Bad&#039; =&amp;gt; &#039;EG Bad&#039;,&#039;Thermostat.Bad.OG&#039; =&amp;gt; &#039;OG Bad&#039;,&#039;Thermostat.OZ&#039; =&amp;gt; &#039;EG Kaminzimmer&#039;,&#039;desired-temp&#039; =&amp;gt; &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp commands   { &#039;desired-temp&#039; =&amp;gt; &#039;desired-temp:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| desired-temp soll per dropDown einstellbar sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp nameStyle style=&amp;quot;color:yellow&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueFormat { &#039;measured-temp&#039; =&amp;gt; &amp;quot;%0.1f &amp;amp;amp;deg;C&amp;quot;,&#039;ToutIst&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;night-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;day-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;humidity&#039; =&amp;gt; &amp;quot;%.0f &lt;br /&gt;
%%&amp;quot;,&#039;ValvePosition&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;ValveDesired&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;R-valveErrorPos&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #namen des ventil device aus thermostat device ableiten&lt;br /&gt;
 sub valveOfDevice ($) {&lt;br /&gt;
   my ($DEVICE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   if ($DEVICE =~ m/AZ/) {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11).&amp;quot;.Nord&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11);  	&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.&lt;br /&gt;
|}&lt;br /&gt;
Da im {...} Teil des &amp;lt;reading&amp;gt;@&amp;lt;device&amp;gt; Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar &#039;Tricks&#039; lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:&amp;lt;code&amp;gt;...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Inhalte ===&lt;br /&gt;
[[Datei:rgDynamic-1.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 1]]&lt;br /&gt;
[[Datei:rgDynamic-2.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 2]]&lt;br /&gt;
Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich&lt;br /&gt;
einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LXrg dummy&lt;br /&gt;
attr LXrg group -&lt;br /&gt;
attr LXrg setList mode1:on,off mode2:open,closed,tilted&lt;br /&gt;
attr LXrg stateFormat 1=mode1 2=mode2&lt;br /&gt;
attr LXrg webCmd mode1:mode2&lt;br /&gt;
&lt;br /&gt;
define rg readingsGroup Window.*:state Light.*:state&lt;br /&gt;
attr rg group -&lt;br /&gt;
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode1&amp;quot;,&amp;quot;&amp;quot;) || $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode2&amp;quot;,&amp;quot;&amp;quot;) );; return undef;;}&lt;br /&gt;
&lt;br /&gt;
define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,&#039;state&#039;,&#039;&#039;);;;;fhem(&amp;quot;setreading $NAME $value&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable/Disable Button am Beispiel eines WeekdayTimer ===&lt;br /&gt;
Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den WeekdayTimer gibt es hier spezielle Erweiterungen (set Routinen, um das disable Attribut zu setzen, Reading &amp;quot;disabled&amp;quot;). Es gibt aber auch eine allgemeinere Variante (siehe [http://forum.fhem.de/index.php/topic,23655.msg169141.html#msg169141 diesen Forumsbeitrag]) für alle Objekte, die das FHEM Attribut &amp;quot;disable&amp;quot; unterstützen.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rg_scheduling.png|thumb|500px|links|Enable/Disable Button]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextUpdate&amp;quot;)}@disabled&amp;gt;,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextValue&amp;quot;)}@disabled&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Definition der angezeigten Readings. Das Reading disabled wird mit den u.a. Attributen zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine &amp;lt;code&amp;gt;rg_timer_Wasser_show_conditional&amp;lt;/code&amp;gt;, die in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, dass der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueFormat  { if ( $READING =~ m/.*DEF/ ) { my @text = split(&amp;quot; &amp;quot;, $VALUE); shift @text; return join(&amp;quot; &amp;quot;, @text) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Name des Timers wird aus dem interal Reading &amp;quot;+DEF&amp;quot; vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueIcon { &#039;disabled.0&#039; =&amp;gt; &#039;Restart&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;Shutdown&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser commands  { &#039;disabled.0&#039; =&amp;gt; &#039;set $DEVICE disable&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;set $DEVICE enable&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Toggle-Funktion für den Button. Wenn der Timer aktiv (&amp;quot;disabled.0&amp;quot;) sorgt ein Klick auf den Button, dass der Timer deaktiviert wird (&amp;quot;set $DEVICE disable&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&lt;br /&gt;
 sub rg_timer_Wasser_show_conditional($$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING) = @_;&lt;br /&gt;
   return ( ReadingsVal($DEVICE, &amp;quot;disabled&amp;quot;, &amp;quot;1&amp;quot;) eq &amp;quot;0&amp;quot; )? &lt;br /&gt;
      ReadingsVal($DEVICE, $READING, &amp;quot;reading_undef&amp;quot;) : &amp;quot;disabled&amp;quot;;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String &amp;quot;disabled&amp;quot; stattdessen angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links und Trigger ==&lt;br /&gt;
=== 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;
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;
== 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;
 &amp;lt;code&amp;gt;if( $READING eq ... ) {&lt;br /&gt;
   return xxx if( $VALUE &amp;lt; 1 );&lt;br /&gt;
   return yyy if( $VALUE &amp;lt; 1.5 );&lt;br /&gt;
   return zzz;&lt;br /&gt;
 } elsif( $READING eq ... ) {&lt;br /&gt;
   ...&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.&lt;br /&gt;
&lt;br /&gt;
=== 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;
=== 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>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9132</id>
		<title>ReadingsGroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9132"/>
		<updated>2014-12-30T22:08:53Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Heizungsteuerung für HM Wand- und Heizkörperthermostate */&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 commandref.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Weitergehende Erläuterungen zu einzelnen Attributen:&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;
&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;
=== notime ===&lt;br /&gt;
Es werden keine Timestamps für die Readings angezeigt. Nur für einspaltige readingGroups sinnvoll.&lt;br /&gt;
=== nostate ===&lt;br /&gt;
Das state-Reading wird bei regex match nicht berücksichtigt und nicht angezeigt.&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;
== 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_baraometric_pressure&amp;gt;,&amp;lt;Luftdruck&amp;gt;,pressure&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039; und &#039;&#039;&#039;pressure&#039;&#039;&#039; vom Device WetterXXX jeweils mit einem Icon und einem Label davor.&lt;br /&gt;
| rowspan=3 | [[Datei:rgWetter.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueFormat { temperature =&amp;gt; &#039;%1.f &amp;amp;amp;deg;C&#039;, humidity =&amp;gt; &#039;%1.f %%&#039;, pressure =&amp;gt; &#039;%i mbar&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Readingswerte&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueStyle style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Readings sollen rechtsbündig dargestellt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Value ausgeben ===&lt;br /&gt;
Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den 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]]&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;code&amp;gt;&lt;br /&gt;
 #Heizung regeln in readingsGroup&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDown($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$CMD) = @_;&lt;br /&gt;
  &lt;br /&gt;
   my $icon = $CMD;&lt;br /&gt;
   my $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-new&amp;quot;,&amp;quot;20&amp;quot; );&lt;br /&gt;
   $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-temp&amp;quot;,&amp;quot;20&amp;quot; )&lt;br /&gt;
      if( !$VALUE || $VALUE == 0 );&lt;br /&gt;
   my $link;&lt;br /&gt;
  &lt;br /&gt;
   if( $CMD eq &amp;quot;up&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_upward&amp;quot;;&lt;br /&gt;
     $VALUE += 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;lt;= 24 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@red&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   } elsif( $CMD eq &amp;quot;down&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_downward&amp;quot;;&lt;br /&gt;
     $VALUE -= 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;gt;= 18 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@blue&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $notify = &amp;quot;notifyHeizungUpDown&amp;quot;;&lt;br /&gt;
   if( !defined($defs{$notify}) ) {&lt;br /&gt;
     CommandDefine(undef,&lt;br /&gt;
                    &amp;quot;$notify notify .*:desired-new.* &amp;quot;&lt;br /&gt;
                    .&amp;quot;{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }&amp;quot; );&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $ret = &amp;quot;%$icon&amp;quot;;&lt;br /&gt;
   $ret .= &amp;quot;%$link&amp;quot; if( $link );&lt;br /&gt;
  &lt;br /&gt;
   return $ret;&lt;br /&gt;
 }&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDownNotify($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$VALUE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   return if( $VALUE == 0 );&lt;br /&gt;
  &lt;br /&gt;
   my $at = &amp;quot;triggerHeizungUpDown_$DEVICE&amp;quot;;&lt;br /&gt;
   CommandDelete(undef, $at) if( defined($defs{$at}) );&lt;br /&gt;
   CommandDefine(undef,&lt;br /&gt;
                  &amp;quot;$at at +00:00:03 &amp;quot;&lt;br /&gt;
                  .&amp;quot;{my \$v = ReadingsVal(\&amp;quot;$DEVICE\&amp;quot;,\&amp;quot;desired-new\&amp;quot;,undef);&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;set $DEVICE desired-temp \$v\&amp;quot;) if( \$v );&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;setreading $DEVICE desired-new 00\&amp;quot;);}&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
   return undef;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich &amp;gt;=18 und &amp;lt;= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 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;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:RgThermostate.png|thumb|500px|links|Status, Steuerung und Wochenprofil]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;&lt;br /&gt;
set d_label Heizung Heizung &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Temperatur Temperatur &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label  Status Status &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Wochenplan Wochenplan &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Werktag Werktag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Samstag Samstag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Sonntag Sonntag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum1 Zeitraum 1 &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum2 Zeitraum 2 &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|Erzeugen der Readings im device [[Dummy_Hilfen#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; &lt;br /&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_Hilfen#d_label|d_label]]. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate nonames 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausblenden der Device Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate valueIcon &lt;br /&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;}&lt;br /&gt;
&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;
{| 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;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| ReadingsGoup anlegen. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Schrift fett setzen etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;quot;R-globalBtnLock.off&amp;quot;=&amp;gt;&amp;quot;set %DEVICE regSet globalBtnLock on&amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;Regler1&amp;quot;,EG_WZ_TT02_Clima=&amp;gt;&amp;quot;&amp;amp;nbsp;;&amp;amp;nbsp;;&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;my_sani_heating_boost@FB0C02&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
 &#039;humidity&#039;=&amp;gt;&#039;my_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;my_sani_heating_level_0@002AE0&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.10&#039; =&amp;gt; &#039;my_sani_heating_level_10@F8D53D&#039;,&#039;ValvePosition.20&#039; =&amp;gt; &#039;my_sani_heating_level_20@FF9341&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.30&#039; =&amp;gt; &#039;my_sani_heating_level_30@F17F3F&#039;,&#039;ValvePosition.40&#039; =&amp;gt; &#039;my_sani_heating_level_40@E46C3C&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.50&#039; =&amp;gt; &#039;my_sani_heating_level_50@DE3B3A&#039;,&#039;ValvePosition.60&#039; =&amp;gt; &#039;my_sani_heating_level_60@A30D2D&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.70&#039; =&amp;gt; &#039;my_sani_heating_level_70@B40A23&#039;,&#039;ValvePosition.80&#039; =&amp;gt; &#039;my_sani_heating_level_80@C40619&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.90&#039; =&amp;gt; &#039;my_sani_heating_level_90@D4030F&#039;,&#039;ValvePosition.100&#039; =&amp;gt; &#039;my_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;my_wait&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;controlMode.set_auto&#039; =&amp;gt; &#039;my_wait&#039;,&#039;controlMode.set_manual&#039; =&amp;gt; &#039;my_wait&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;R-globalBtnLock.set_on&#039; =&amp;gt; &#039;my_wait&#039;,&#039;R-globalBtnLock.set_off&#039; =&amp;gt; &#039;my_wait&#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|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define myTemp readingsGroup &amp;lt;Raum&amp;gt;,&amp;lt;Tist&amp;gt;,&amp;lt;Tsoll&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Tnight&amp;gt;,&amp;lt;Tday&amp;gt;,&amp;lt;Hum&amp;gt;,&amp;lt;BatTC&amp;gt;,&amp;lt;Vist&amp;gt;,&amp;lt;Vsoll&amp;gt;,&amp;lt;Verr&amp;gt;,&amp;lt;BatVD&amp;gt; Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst &amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilantriebs. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp mapping    { &#039;Broetje&#039; =&amp;gt; &#039;Garten&#039;,&#039;Thermostat.AZ&#039; =&amp;gt; &#039;EG Arbeitszimmer&#039;,&#039;Thermostat.SZ&#039; =&amp;gt; &#039;OG Schlafzimmer&#039;,&#039;Thermostat.WZ&#039;=&amp;gt;&#039;EG Wohnzimmer&#039;,&#039;Thermostat.Kueche&#039; =&amp;gt; &#039;EG Küche&#039;,&#039;Thermostat.GZ&#039; =&amp;gt; &#039;OG Gästezimmer&#039;,&#039;Thermostat.Bad&#039; =&amp;gt; &#039;EG Bad&#039;,&#039;Thermostat.Bad.OG&#039; =&amp;gt; &#039;OG Bad&#039;,&#039;Thermostat.OZ&#039; =&amp;gt; &#039;EG Kaminzimmer&#039;,&#039;desired-temp&#039; =&amp;gt; &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp commands   { &#039;desired-temp&#039; =&amp;gt; &#039;desired-temp:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| desired-temp soll per dropDown einstellbar sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp nameStyle style=&amp;quot;color:yellow&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueFormat { &#039;measured-temp&#039; =&amp;gt; &amp;quot;%0.1f &amp;amp;amp;deg;C&amp;quot;,&#039;ToutIst&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;night-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;day-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;humidity&#039; =&amp;gt; &amp;quot;%.0f &lt;br /&gt;
%%&amp;quot;,&#039;ValvePosition&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;ValveDesired&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;R-valveErrorPos&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #namen des ventil device aus thermostat device ableiten&lt;br /&gt;
 sub valveOfDevice ($) {&lt;br /&gt;
   my ($DEVICE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   if ($DEVICE =~ m/AZ/) {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11).&amp;quot;.Nord&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11);  	&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.&lt;br /&gt;
|}&lt;br /&gt;
Da im {...} Teil des &amp;lt;reading&amp;gt;@&amp;lt;device&amp;gt; Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar &#039;Tricks&#039; lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:&amp;lt;code&amp;gt;...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Inhalte ===&lt;br /&gt;
[[Datei:rgDynamic-1.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 1]]&lt;br /&gt;
[[Datei:rgDynamic-2.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 2]]&lt;br /&gt;
Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich&lt;br /&gt;
einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LXrg dummy&lt;br /&gt;
attr LXrg group -&lt;br /&gt;
attr LXrg setList mode1:on,off mode2:open,closed,tilted&lt;br /&gt;
attr LXrg stateFormat 1=mode1 2=mode2&lt;br /&gt;
attr LXrg webCmd mode1:mode2&lt;br /&gt;
&lt;br /&gt;
define rg readingsGroup Window.*:state Light.*:state&lt;br /&gt;
attr rg group -&lt;br /&gt;
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode1&amp;quot;,&amp;quot;&amp;quot;) || $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode2&amp;quot;,&amp;quot;&amp;quot;) );; return undef;;}&lt;br /&gt;
&lt;br /&gt;
define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,&#039;state&#039;,&#039;&#039;);;;;fhem(&amp;quot;setreading $NAME $value&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable/Disable Button am Beispiel eines WeekdayTimer ===&lt;br /&gt;
Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den WeekdayTimer gibt es hier spezielle Erweiterungen (set Routinen, um das disable Attribut zu setzen, Reading &amp;quot;disabled&amp;quot;). Es gibt aber auch eine allgemeinere Variante (siehe [http://forum.fhem.de/index.php/topic,23655.msg169141.html#msg169141 diesen Forumsbeitrag]) für alle Objekte, die das FHEM Attribut &amp;quot;disable&amp;quot; unterstützen.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rg_scheduling.png|thumb|500px|links|Enable/Disable Button]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextUpdate&amp;quot;)}@disabled&amp;gt;,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextValue&amp;quot;)}@disabled&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Definition der angezeigten Readings. Das Reading disabled wird mit den u.a. Attributen zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine &amp;lt;code&amp;gt;rg_timer_Wasser_show_conditional&amp;lt;/code&amp;gt;, die in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, dass der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueFormat  { if ( $READING =~ m/.*DEF/ ) { my @text = split(&amp;quot; &amp;quot;, $VALUE); shift @text; return join(&amp;quot; &amp;quot;, @text) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Name des Timers wird aus dem interal Reading &amp;quot;+DEF&amp;quot; vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueIcon { &#039;disabled.0&#039; =&amp;gt; &#039;Restart&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;Shutdown&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser commands  { &#039;disabled.0&#039; =&amp;gt; &#039;set $DEVICE disable&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;set $DEVICE enable&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Toggle-Funktion für den Button. Wenn der Timer aktiv (&amp;quot;disabled.0&amp;quot;) sorgt ein Klick auf den Button, dass der Timer deaktiviert wird (&amp;quot;set $DEVICE disable&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&lt;br /&gt;
 sub rg_timer_Wasser_show_conditional($$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING) = @_;&lt;br /&gt;
   return ( ReadingsVal($DEVICE, &amp;quot;disabled&amp;quot;, &amp;quot;1&amp;quot;) eq &amp;quot;0&amp;quot; )? &lt;br /&gt;
      ReadingsVal($DEVICE, $READING, &amp;quot;reading_undef&amp;quot;) : &amp;quot;disabled&amp;quot;;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String &amp;quot;disabled&amp;quot; stattdessen angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links und Trigger ==&lt;br /&gt;
=== 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;
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;
== 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;
 &amp;lt;code&amp;gt;if( $READING eq ... ) {&lt;br /&gt;
   return xxx if( $VALUE &amp;lt; 1 );&lt;br /&gt;
   return yyy if( $VALUE &amp;lt; 1.5 );&lt;br /&gt;
   return zzz;&lt;br /&gt;
 } elsif( $READING eq ... ) {&lt;br /&gt;
   ...&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.&lt;br /&gt;
&lt;br /&gt;
=== 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;
=== 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>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9131</id>
		<title>ReadingsGroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9131"/>
		<updated>2014-12-30T22:08:11Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Heizungsteuerung für HM Wand- und Heizkörperthermostate */&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 commandref.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Weitergehende Erläuterungen zu einzelnen Attributen:&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;
&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;
=== notime ===&lt;br /&gt;
Es werden keine Timestamps für die Readings angezeigt. Nur für einspaltige readingGroups sinnvoll.&lt;br /&gt;
=== nostate ===&lt;br /&gt;
Das state-Reading wird bei regex match nicht berücksichtigt und nicht angezeigt.&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;
== 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_baraometric_pressure&amp;gt;,&amp;lt;Luftdruck&amp;gt;,pressure&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039; und &#039;&#039;&#039;pressure&#039;&#039;&#039; vom Device WetterXXX jeweils mit einem Icon und einem Label davor.&lt;br /&gt;
| rowspan=3 | [[Datei:rgWetter.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueFormat { temperature =&amp;gt; &#039;%1.f &amp;amp;amp;deg;C&#039;, humidity =&amp;gt; &#039;%1.f %%&#039;, pressure =&amp;gt; &#039;%i mbar&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Readingswerte&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueStyle style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Readings sollen rechtsbündig dargestellt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Value ausgeben ===&lt;br /&gt;
Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den 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]]&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;code&amp;gt;&lt;br /&gt;
 #Heizung regeln in readingsGroup&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDown($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$CMD) = @_;&lt;br /&gt;
  &lt;br /&gt;
   my $icon = $CMD;&lt;br /&gt;
   my $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-new&amp;quot;,&amp;quot;20&amp;quot; );&lt;br /&gt;
   $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-temp&amp;quot;,&amp;quot;20&amp;quot; )&lt;br /&gt;
      if( !$VALUE || $VALUE == 0 );&lt;br /&gt;
   my $link;&lt;br /&gt;
  &lt;br /&gt;
   if( $CMD eq &amp;quot;up&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_upward&amp;quot;;&lt;br /&gt;
     $VALUE += 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;lt;= 24 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@red&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   } elsif( $CMD eq &amp;quot;down&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_downward&amp;quot;;&lt;br /&gt;
     $VALUE -= 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;gt;= 18 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@blue&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $notify = &amp;quot;notifyHeizungUpDown&amp;quot;;&lt;br /&gt;
   if( !defined($defs{$notify}) ) {&lt;br /&gt;
     CommandDefine(undef,&lt;br /&gt;
                    &amp;quot;$notify notify .*:desired-new.* &amp;quot;&lt;br /&gt;
                    .&amp;quot;{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }&amp;quot; );&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $ret = &amp;quot;%$icon&amp;quot;;&lt;br /&gt;
   $ret .= &amp;quot;%$link&amp;quot; if( $link );&lt;br /&gt;
  &lt;br /&gt;
   return $ret;&lt;br /&gt;
 }&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDownNotify($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$VALUE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   return if( $VALUE == 0 );&lt;br /&gt;
  &lt;br /&gt;
   my $at = &amp;quot;triggerHeizungUpDown_$DEVICE&amp;quot;;&lt;br /&gt;
   CommandDelete(undef, $at) if( defined($defs{$at}) );&lt;br /&gt;
   CommandDefine(undef,&lt;br /&gt;
                  &amp;quot;$at at +00:00:03 &amp;quot;&lt;br /&gt;
                  .&amp;quot;{my \$v = ReadingsVal(\&amp;quot;$DEVICE\&amp;quot;,\&amp;quot;desired-new\&amp;quot;,undef);&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;set $DEVICE desired-temp \$v\&amp;quot;) if( \$v );&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;setreading $DEVICE desired-new 00\&amp;quot;);}&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
   return undef;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich &amp;gt;=18 und &amp;lt;= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 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;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:RgThermostate.png|thumb|500px|links|Status, Steuerung und Wochenprofil]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;&lt;br /&gt;
set d_label Heizung Heizung &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Temperatur Temperatur &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label  Status Status &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Wochenplan Wochenplan &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Werktag Werktag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Samstag Samstag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Sonntag Sonntag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum1 Zeitraum 1 &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum2 Zeitraum 2 &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|Erzeugen der Readings im device [[Dummy_Hilfen#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; &lt;br /&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_Hilfen#d_label|d_label]]. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate nonames 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausblenden der Device Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate valueIcon &lt;br /&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;}&lt;br /&gt;
&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;
{| 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;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| ReadingsGoup anlegen. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Schrift fett setzen etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
attr heatingInfo commands {&#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;quot;R-globalBtnLock.off&amp;quot;=&amp;gt;&amp;quot;set %DEVICE regSet globalBtnLock on&amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;Regler1&amp;quot;,EG_WZ_TT02_Clima=&amp;gt;&amp;quot;&amp;amp;nbsp;;&amp;amp;nbsp;;&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;my_sani_heating_boost@FB0C02&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
 &#039;humidity&#039;=&amp;gt;&#039;my_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;my_sani_heating_level_0@002AE0&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.10&#039; =&amp;gt; &#039;my_sani_heating_level_10@F8D53D&#039;,&#039;ValvePosition.20&#039; =&amp;gt; &#039;my_sani_heating_level_20@FF9341&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.30&#039; =&amp;gt; &#039;my_sani_heating_level_30@F17F3F&#039;,&#039;ValvePosition.40&#039; =&amp;gt; &#039;my_sani_heating_level_40@E46C3C&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.50&#039; =&amp;gt; &#039;my_sani_heating_level_50@DE3B3A&#039;,&#039;ValvePosition.60&#039; =&amp;gt; &#039;my_sani_heating_level_60@A30D2D&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.70&#039; =&amp;gt; &#039;my_sani_heating_level_70@B40A23&#039;,&#039;ValvePosition.80&#039; =&amp;gt; &#039;my_sani_heating_level_80@C40619&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.90&#039; =&amp;gt; &#039;my_sani_heating_level_90@D4030F&#039;,&#039;ValvePosition.100&#039; =&amp;gt; &#039;my_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;my_wait&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;controlMode.set_auto&#039; =&amp;gt; &#039;my_wait&#039;,&#039;controlMode.set_manual&#039; =&amp;gt; &#039;my_wait&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;R-globalBtnLock.set_on&#039; =&amp;gt; &#039;my_wait&#039;,&#039;R-globalBtnLock.set_off&#039; =&amp;gt; &#039;my_wait&#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|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define myTemp readingsGroup &amp;lt;Raum&amp;gt;,&amp;lt;Tist&amp;gt;,&amp;lt;Tsoll&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Tnight&amp;gt;,&amp;lt;Tday&amp;gt;,&amp;lt;Hum&amp;gt;,&amp;lt;BatTC&amp;gt;,&amp;lt;Vist&amp;gt;,&amp;lt;Vsoll&amp;gt;,&amp;lt;Verr&amp;gt;,&amp;lt;BatVD&amp;gt; Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst &amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilantriebs. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp mapping    { &#039;Broetje&#039; =&amp;gt; &#039;Garten&#039;,&#039;Thermostat.AZ&#039; =&amp;gt; &#039;EG Arbeitszimmer&#039;,&#039;Thermostat.SZ&#039; =&amp;gt; &#039;OG Schlafzimmer&#039;,&#039;Thermostat.WZ&#039;=&amp;gt;&#039;EG Wohnzimmer&#039;,&#039;Thermostat.Kueche&#039; =&amp;gt; &#039;EG Küche&#039;,&#039;Thermostat.GZ&#039; =&amp;gt; &#039;OG Gästezimmer&#039;,&#039;Thermostat.Bad&#039; =&amp;gt; &#039;EG Bad&#039;,&#039;Thermostat.Bad.OG&#039; =&amp;gt; &#039;OG Bad&#039;,&#039;Thermostat.OZ&#039; =&amp;gt; &#039;EG Kaminzimmer&#039;,&#039;desired-temp&#039; =&amp;gt; &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp commands   { &#039;desired-temp&#039; =&amp;gt; &#039;desired-temp:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| desired-temp soll per dropDown einstellbar sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp nameStyle style=&amp;quot;color:yellow&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueFormat { &#039;measured-temp&#039; =&amp;gt; &amp;quot;%0.1f &amp;amp;amp;deg;C&amp;quot;,&#039;ToutIst&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;night-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;day-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;humidity&#039; =&amp;gt; &amp;quot;%.0f &lt;br /&gt;
%%&amp;quot;,&#039;ValvePosition&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;ValveDesired&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;R-valveErrorPos&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #namen des ventil device aus thermostat device ableiten&lt;br /&gt;
 sub valveOfDevice ($) {&lt;br /&gt;
   my ($DEVICE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   if ($DEVICE =~ m/AZ/) {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11).&amp;quot;.Nord&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11);  	&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.&lt;br /&gt;
|}&lt;br /&gt;
Da im {...} Teil des &amp;lt;reading&amp;gt;@&amp;lt;device&amp;gt; Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar &#039;Tricks&#039; lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:&amp;lt;code&amp;gt;...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Inhalte ===&lt;br /&gt;
[[Datei:rgDynamic-1.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 1]]&lt;br /&gt;
[[Datei:rgDynamic-2.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 2]]&lt;br /&gt;
Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich&lt;br /&gt;
einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LXrg dummy&lt;br /&gt;
attr LXrg group -&lt;br /&gt;
attr LXrg setList mode1:on,off mode2:open,closed,tilted&lt;br /&gt;
attr LXrg stateFormat 1=mode1 2=mode2&lt;br /&gt;
attr LXrg webCmd mode1:mode2&lt;br /&gt;
&lt;br /&gt;
define rg readingsGroup Window.*:state Light.*:state&lt;br /&gt;
attr rg group -&lt;br /&gt;
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode1&amp;quot;,&amp;quot;&amp;quot;) || $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode2&amp;quot;,&amp;quot;&amp;quot;) );; return undef;;}&lt;br /&gt;
&lt;br /&gt;
define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,&#039;state&#039;,&#039;&#039;);;;;fhem(&amp;quot;setreading $NAME $value&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable/Disable Button am Beispiel eines WeekdayTimer ===&lt;br /&gt;
Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den WeekdayTimer gibt es hier spezielle Erweiterungen (set Routinen, um das disable Attribut zu setzen, Reading &amp;quot;disabled&amp;quot;). Es gibt aber auch eine allgemeinere Variante (siehe [http://forum.fhem.de/index.php/topic,23655.msg169141.html#msg169141 diesen Forumsbeitrag]) für alle Objekte, die das FHEM Attribut &amp;quot;disable&amp;quot; unterstützen.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rg_scheduling.png|thumb|500px|links|Enable/Disable Button]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextUpdate&amp;quot;)}@disabled&amp;gt;,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextValue&amp;quot;)}@disabled&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Definition der angezeigten Readings. Das Reading disabled wird mit den u.a. Attributen zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine &amp;lt;code&amp;gt;rg_timer_Wasser_show_conditional&amp;lt;/code&amp;gt;, die in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, dass der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueFormat  { if ( $READING =~ m/.*DEF/ ) { my @text = split(&amp;quot; &amp;quot;, $VALUE); shift @text; return join(&amp;quot; &amp;quot;, @text) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Name des Timers wird aus dem interal Reading &amp;quot;+DEF&amp;quot; vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueIcon { &#039;disabled.0&#039; =&amp;gt; &#039;Restart&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;Shutdown&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser commands  { &#039;disabled.0&#039; =&amp;gt; &#039;set $DEVICE disable&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;set $DEVICE enable&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Toggle-Funktion für den Button. Wenn der Timer aktiv (&amp;quot;disabled.0&amp;quot;) sorgt ein Klick auf den Button, dass der Timer deaktiviert wird (&amp;quot;set $DEVICE disable&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&lt;br /&gt;
 sub rg_timer_Wasser_show_conditional($$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING) = @_;&lt;br /&gt;
   return ( ReadingsVal($DEVICE, &amp;quot;disabled&amp;quot;, &amp;quot;1&amp;quot;) eq &amp;quot;0&amp;quot; )? &lt;br /&gt;
      ReadingsVal($DEVICE, $READING, &amp;quot;reading_undef&amp;quot;) : &amp;quot;disabled&amp;quot;;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String &amp;quot;disabled&amp;quot; stattdessen angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links und Trigger ==&lt;br /&gt;
=== 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;
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;
== 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;
 &amp;lt;code&amp;gt;if( $READING eq ... ) {&lt;br /&gt;
   return xxx if( $VALUE &amp;lt; 1 );&lt;br /&gt;
   return yyy if( $VALUE &amp;lt; 1.5 );&lt;br /&gt;
   return zzz;&lt;br /&gt;
 } elsif( $READING eq ... ) {&lt;br /&gt;
   ...&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.&lt;br /&gt;
&lt;br /&gt;
=== 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;
=== 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>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9130</id>
		<title>ReadingsGroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9130"/>
		<updated>2014-12-30T22:06:34Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Heizungsteuerung für HM Wand- und Heizkörperthermostate */&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 commandref.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Weitergehende Erläuterungen zu einzelnen Attributen:&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;
&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;
=== notime ===&lt;br /&gt;
Es werden keine Timestamps für die Readings angezeigt. Nur für einspaltige readingGroups sinnvoll.&lt;br /&gt;
=== nostate ===&lt;br /&gt;
Das state-Reading wird bei regex match nicht berücksichtigt und nicht angezeigt.&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;
== 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_baraometric_pressure&amp;gt;,&amp;lt;Luftdruck&amp;gt;,pressure&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039; und &#039;&#039;&#039;pressure&#039;&#039;&#039; vom Device WetterXXX jeweils mit einem Icon und einem Label davor.&lt;br /&gt;
| rowspan=3 | [[Datei:rgWetter.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueFormat { temperature =&amp;gt; &#039;%1.f &amp;amp;amp;deg;C&#039;, humidity =&amp;gt; &#039;%1.f %%&#039;, pressure =&amp;gt; &#039;%i mbar&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Readingswerte&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueStyle style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Readings sollen rechtsbündig dargestellt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Value ausgeben ===&lt;br /&gt;
Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den 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]]&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;code&amp;gt;&lt;br /&gt;
 #Heizung regeln in readingsGroup&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDown($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$CMD) = @_;&lt;br /&gt;
  &lt;br /&gt;
   my $icon = $CMD;&lt;br /&gt;
   my $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-new&amp;quot;,&amp;quot;20&amp;quot; );&lt;br /&gt;
   $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-temp&amp;quot;,&amp;quot;20&amp;quot; )&lt;br /&gt;
      if( !$VALUE || $VALUE == 0 );&lt;br /&gt;
   my $link;&lt;br /&gt;
  &lt;br /&gt;
   if( $CMD eq &amp;quot;up&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_upward&amp;quot;;&lt;br /&gt;
     $VALUE += 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;lt;= 24 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@red&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   } elsif( $CMD eq &amp;quot;down&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_downward&amp;quot;;&lt;br /&gt;
     $VALUE -= 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;gt;= 18 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@blue&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $notify = &amp;quot;notifyHeizungUpDown&amp;quot;;&lt;br /&gt;
   if( !defined($defs{$notify}) ) {&lt;br /&gt;
     CommandDefine(undef,&lt;br /&gt;
                    &amp;quot;$notify notify .*:desired-new.* &amp;quot;&lt;br /&gt;
                    .&amp;quot;{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }&amp;quot; );&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $ret = &amp;quot;%$icon&amp;quot;;&lt;br /&gt;
   $ret .= &amp;quot;%$link&amp;quot; if( $link );&lt;br /&gt;
  &lt;br /&gt;
   return $ret;&lt;br /&gt;
 }&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDownNotify($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$VALUE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   return if( $VALUE == 0 );&lt;br /&gt;
  &lt;br /&gt;
   my $at = &amp;quot;triggerHeizungUpDown_$DEVICE&amp;quot;;&lt;br /&gt;
   CommandDelete(undef, $at) if( defined($defs{$at}) );&lt;br /&gt;
   CommandDefine(undef,&lt;br /&gt;
                  &amp;quot;$at at +00:00:03 &amp;quot;&lt;br /&gt;
                  .&amp;quot;{my \$v = ReadingsVal(\&amp;quot;$DEVICE\&amp;quot;,\&amp;quot;desired-new\&amp;quot;,undef);&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;set $DEVICE desired-temp \$v\&amp;quot;) if( \$v );&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;setreading $DEVICE desired-new 00\&amp;quot;);}&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
   return undef;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich &amp;gt;=18 und &amp;lt;= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 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;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:RgThermostate.png|thumb|500px|links|Status, Steuerung und Wochenprofil]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;&lt;br /&gt;
set d_label Heizung Heizung &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Temperatur Temperatur &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label  Status Status &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Wochenplan Wochenplan &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Werktag Werktag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Samstag Samstag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Sonntag Sonntag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum1 Zeitraum 1 &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum2 Zeitraum 2 &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|Erzeugen der Readings im device [[Dummy_Hilfen#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; &lt;br /&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_Hilfen#d_label|d_label]]. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate nonames 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausblenden der Device Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate valueIcon &lt;br /&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;}&lt;br /&gt;
&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;
{| 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;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| ReadingsGoup anlegen. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Schrift fett setzen etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
attr heatingInfo commands {&#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;quot;R-globalBtnLock.off&amp;quot;=&amp;gt;&amp;quot;set %DEVICE regSet globalBtnLock on&amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;Regler1&amp;quot;,EG_WZ_TT02_Clima=&amp;gt;&amp;quot;&amp;amp;nbsp;;&amp;amp;nbsp;;&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;my_sani_heating_boost@FB0C02&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
 &#039;humidity&#039;=&amp;gt;&#039;my_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;my_sani_heating_level_0@002AE0&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.10&#039; =&amp;gt; &#039;my_sani_heating_level_10@F8D53D&#039;,&#039;ValvePosition.20&#039; =&amp;gt; &#039;my_sani_heating_level_20@FF9341&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.30&#039; =&amp;gt; &#039;my_sani_heating_level_30@F17F3F&#039;,&#039;ValvePosition.40&#039; =&amp;gt; &#039;my_sani_heating_level_40@E46C3C&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.50&#039; =&amp;gt; &#039;my_sani_heating_level_50@DE3B3A&#039;,&#039;ValvePosition.60&#039; =&amp;gt; &#039;my_sani_heating_level_60@A30D2D&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.70&#039; =&amp;gt; &#039;my_sani_heating_level_70@B40A23&#039;,&#039;ValvePosition.80&#039; =&amp;gt; &#039;my_sani_heating_level_80@C40619&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.90&#039; =&amp;gt; &#039;my_sani_heating_level_90@D4030F&#039;,&#039;ValvePosition.100&#039; =&amp;gt; &#039;my_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;my_wait&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;controlMode.set_auto&#039; =&amp;gt; &#039;my_wait&#039;,&#039;controlMode.set_manual&#039; =&amp;gt; &#039;my_wait&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;R-globalBtnLock.set_on&#039; =&amp;gt; &#039;my_wait&#039;,&#039;R-globalBtnLock.set_off&#039; =&amp;gt; &#039;my_wait&#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|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define myTemp readingsGroup &amp;lt;Raum&amp;gt;,&amp;lt;Tist&amp;gt;,&amp;lt;Tsoll&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Tnight&amp;gt;,&amp;lt;Tday&amp;gt;,&amp;lt;Hum&amp;gt;,&amp;lt;BatTC&amp;gt;,&amp;lt;Vist&amp;gt;,&amp;lt;Vsoll&amp;gt;,&amp;lt;Verr&amp;gt;,&amp;lt;BatVD&amp;gt; Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst &amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilantriebs. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp mapping    { &#039;Broetje&#039; =&amp;gt; &#039;Garten&#039;,&#039;Thermostat.AZ&#039; =&amp;gt; &#039;EG Arbeitszimmer&#039;,&#039;Thermostat.SZ&#039; =&amp;gt; &#039;OG Schlafzimmer&#039;,&#039;Thermostat.WZ&#039;=&amp;gt;&#039;EG Wohnzimmer&#039;,&#039;Thermostat.Kueche&#039; =&amp;gt; &#039;EG Küche&#039;,&#039;Thermostat.GZ&#039; =&amp;gt; &#039;OG Gästezimmer&#039;,&#039;Thermostat.Bad&#039; =&amp;gt; &#039;EG Bad&#039;,&#039;Thermostat.Bad.OG&#039; =&amp;gt; &#039;OG Bad&#039;,&#039;Thermostat.OZ&#039; =&amp;gt; &#039;EG Kaminzimmer&#039;,&#039;desired-temp&#039; =&amp;gt; &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp commands   { &#039;desired-temp&#039; =&amp;gt; &#039;desired-temp:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| desired-temp soll per dropDown einstellbar sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp nameStyle style=&amp;quot;color:yellow&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueFormat { &#039;measured-temp&#039; =&amp;gt; &amp;quot;%0.1f &amp;amp;amp;deg;C&amp;quot;,&#039;ToutIst&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;night-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;day-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;humidity&#039; =&amp;gt; &amp;quot;%.0f &lt;br /&gt;
%%&amp;quot;,&#039;ValvePosition&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;ValveDesired&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;R-valveErrorPos&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #namen des ventil device aus thermostat device ableiten&lt;br /&gt;
 sub valveOfDevice ($) {&lt;br /&gt;
   my ($DEVICE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   if ($DEVICE =~ m/AZ/) {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11).&amp;quot;.Nord&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11);  	&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.&lt;br /&gt;
|}&lt;br /&gt;
Da im {...} Teil des &amp;lt;reading&amp;gt;@&amp;lt;device&amp;gt; Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar &#039;Tricks&#039; lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:&amp;lt;code&amp;gt;...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Inhalte ===&lt;br /&gt;
[[Datei:rgDynamic-1.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 1]]&lt;br /&gt;
[[Datei:rgDynamic-2.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 2]]&lt;br /&gt;
Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich&lt;br /&gt;
einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LXrg dummy&lt;br /&gt;
attr LXrg group -&lt;br /&gt;
attr LXrg setList mode1:on,off mode2:open,closed,tilted&lt;br /&gt;
attr LXrg stateFormat 1=mode1 2=mode2&lt;br /&gt;
attr LXrg webCmd mode1:mode2&lt;br /&gt;
&lt;br /&gt;
define rg readingsGroup Window.*:state Light.*:state&lt;br /&gt;
attr rg group -&lt;br /&gt;
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode1&amp;quot;,&amp;quot;&amp;quot;) || $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode2&amp;quot;,&amp;quot;&amp;quot;) );; return undef;;}&lt;br /&gt;
&lt;br /&gt;
define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,&#039;state&#039;,&#039;&#039;);;;;fhem(&amp;quot;setreading $NAME $value&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable/Disable Button am Beispiel eines WeekdayTimer ===&lt;br /&gt;
Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den WeekdayTimer gibt es hier spezielle Erweiterungen (set Routinen, um das disable Attribut zu setzen, Reading &amp;quot;disabled&amp;quot;). Es gibt aber auch eine allgemeinere Variante (siehe [http://forum.fhem.de/index.php/topic,23655.msg169141.html#msg169141 diesen Forumsbeitrag]) für alle Objekte, die das FHEM Attribut &amp;quot;disable&amp;quot; unterstützen.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rg_scheduling.png|thumb|500px|links|Enable/Disable Button]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextUpdate&amp;quot;)}@disabled&amp;gt;,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextValue&amp;quot;)}@disabled&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Definition der angezeigten Readings. Das Reading disabled wird mit den u.a. Attributen zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine &amp;lt;code&amp;gt;rg_timer_Wasser_show_conditional&amp;lt;/code&amp;gt;, die in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, dass der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueFormat  { if ( $READING =~ m/.*DEF/ ) { my @text = split(&amp;quot; &amp;quot;, $VALUE); shift @text; return join(&amp;quot; &amp;quot;, @text) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Name des Timers wird aus dem interal Reading &amp;quot;+DEF&amp;quot; vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueIcon { &#039;disabled.0&#039; =&amp;gt; &#039;Restart&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;Shutdown&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser commands  { &#039;disabled.0&#039; =&amp;gt; &#039;set $DEVICE disable&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;set $DEVICE enable&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Toggle-Funktion für den Button. Wenn der Timer aktiv (&amp;quot;disabled.0&amp;quot;) sorgt ein Klick auf den Button, dass der Timer deaktiviert wird (&amp;quot;set $DEVICE disable&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&lt;br /&gt;
 sub rg_timer_Wasser_show_conditional($$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING) = @_;&lt;br /&gt;
   return ( ReadingsVal($DEVICE, &amp;quot;disabled&amp;quot;, &amp;quot;1&amp;quot;) eq &amp;quot;0&amp;quot; )? &lt;br /&gt;
      ReadingsVal($DEVICE, $READING, &amp;quot;reading_undef&amp;quot;) : &amp;quot;disabled&amp;quot;;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String &amp;quot;disabled&amp;quot; stattdessen angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links und Trigger ==&lt;br /&gt;
=== 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;
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;
== 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;
 &amp;lt;code&amp;gt;if( $READING eq ... ) {&lt;br /&gt;
   return xxx if( $VALUE &amp;lt; 1 );&lt;br /&gt;
   return yyy if( $VALUE &amp;lt; 1.5 );&lt;br /&gt;
   return zzz;&lt;br /&gt;
 } elsif( $READING eq ... ) {&lt;br /&gt;
   ...&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.&lt;br /&gt;
&lt;br /&gt;
=== 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;
=== 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>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9129</id>
		<title>ReadingsGroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9129"/>
		<updated>2014-12-30T21:59:51Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Heizungsteuerung für HM Wand- und Heizkörperthermostate */&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 commandref.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Weitergehende Erläuterungen zu einzelnen Attributen:&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;
&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;
=== notime ===&lt;br /&gt;
Es werden keine Timestamps für die Readings angezeigt. Nur für einspaltige readingGroups sinnvoll.&lt;br /&gt;
=== nostate ===&lt;br /&gt;
Das state-Reading wird bei regex match nicht berücksichtigt und nicht angezeigt.&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;
== 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_baraometric_pressure&amp;gt;,&amp;lt;Luftdruck&amp;gt;,pressure&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039; und &#039;&#039;&#039;pressure&#039;&#039;&#039; vom Device WetterXXX jeweils mit einem Icon und einem Label davor.&lt;br /&gt;
| rowspan=3 | [[Datei:rgWetter.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueFormat { temperature =&amp;gt; &#039;%1.f &amp;amp;amp;deg;C&#039;, humidity =&amp;gt; &#039;%1.f %%&#039;, pressure =&amp;gt; &#039;%i mbar&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Readingswerte&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueStyle style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Readings sollen rechtsbündig dargestellt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Value ausgeben ===&lt;br /&gt;
Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den 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]]&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;code&amp;gt;&lt;br /&gt;
 #Heizung regeln in readingsGroup&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDown($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$CMD) = @_;&lt;br /&gt;
  &lt;br /&gt;
   my $icon = $CMD;&lt;br /&gt;
   my $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-new&amp;quot;,&amp;quot;20&amp;quot; );&lt;br /&gt;
   $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-temp&amp;quot;,&amp;quot;20&amp;quot; )&lt;br /&gt;
      if( !$VALUE || $VALUE == 0 );&lt;br /&gt;
   my $link;&lt;br /&gt;
  &lt;br /&gt;
   if( $CMD eq &amp;quot;up&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_upward&amp;quot;;&lt;br /&gt;
     $VALUE += 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;lt;= 24 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@red&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   } elsif( $CMD eq &amp;quot;down&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_downward&amp;quot;;&lt;br /&gt;
     $VALUE -= 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;gt;= 18 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@blue&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $notify = &amp;quot;notifyHeizungUpDown&amp;quot;;&lt;br /&gt;
   if( !defined($defs{$notify}) ) {&lt;br /&gt;
     CommandDefine(undef,&lt;br /&gt;
                    &amp;quot;$notify notify .*:desired-new.* &amp;quot;&lt;br /&gt;
                    .&amp;quot;{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }&amp;quot; );&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $ret = &amp;quot;%$icon&amp;quot;;&lt;br /&gt;
   $ret .= &amp;quot;%$link&amp;quot; if( $link );&lt;br /&gt;
  &lt;br /&gt;
   return $ret;&lt;br /&gt;
 }&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDownNotify($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$VALUE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   return if( $VALUE == 0 );&lt;br /&gt;
  &lt;br /&gt;
   my $at = &amp;quot;triggerHeizungUpDown_$DEVICE&amp;quot;;&lt;br /&gt;
   CommandDelete(undef, $at) if( defined($defs{$at}) );&lt;br /&gt;
   CommandDefine(undef,&lt;br /&gt;
                  &amp;quot;$at at +00:00:03 &amp;quot;&lt;br /&gt;
                  .&amp;quot;{my \$v = ReadingsVal(\&amp;quot;$DEVICE\&amp;quot;,\&amp;quot;desired-new\&amp;quot;,undef);&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;set $DEVICE desired-temp \$v\&amp;quot;) if( \$v );&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;setreading $DEVICE desired-new 00\&amp;quot;);}&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
   return undef;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich &amp;gt;=18 und &amp;lt;= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 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;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:RgThermostate.png|thumb|500px|links|Status, Steuerung und Wochenprofil]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;&lt;br /&gt;
set d_label Heizung Heizung &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Temperatur Temperatur &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label  Status Status &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Wochenplan Wochenplan &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Werktag Werktag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Samstag Samstag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Sonntag Sonntag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum1 Zeitraum 1 &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum2 Zeitraum 2 &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|Erzeugen der Readings im device [[Dummy_Hilfen#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; &lt;br /&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_Hilfen#d_label|d_label]]. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate nonames 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausblenden der Device Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate valueIcon &lt;br /&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;}&lt;br /&gt;
&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;
=== Heizungsteuerung für HM Wand- und Heizkörperthermostate ===&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;
{| 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;&lt;br /&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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| ReadingsGoup anlegen. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
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;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Schrift fett setzen etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
attr heatingInfo commands {&#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;quot;R-globalBtnLock.off&amp;quot;=&amp;gt;&amp;quot;set %DEVICE regSet globalBtnLock on&amp;quot;}&amp;lt;br&amp;gt;&lt;br /&gt;
&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&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;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;Regler1&amp;quot;,EG_WZ_TT02_Clima=&amp;gt;&amp;quot;&amp;amp;nbsp;;&amp;amp;nbsp;;&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;my_sani_heating_boost@FB0C02&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
 &#039;humidity&#039;=&amp;gt;&#039;my_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;my_sani_heating_level_0@002AE0&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.10&#039; =&amp;gt; &#039;my_sani_heating_level_10@F8D53D&#039;,&#039;ValvePosition.20&#039; =&amp;gt; &#039;my_sani_heating_level_20@FF9341&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.30&#039; =&amp;gt; &#039;my_sani_heating_level_30@F17F3F&#039;,&#039;ValvePosition.40&#039; =&amp;gt; &#039;my_sani_heating_level_40@E46C3C&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.50&#039; =&amp;gt; &#039;my_sani_heating_level_50@DE3B3A&#039;,&#039;ValvePosition.60&#039; =&amp;gt; &#039;my_sani_heating_level_60@A30D2D&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.70&#039; =&amp;gt; &#039;my_sani_heating_level_70@B40A23&#039;,&#039;ValvePosition.80&#039; =&amp;gt; &#039;my_sani_heating_level_80@C40619&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;ValvePosition.90&#039; =&amp;gt; &#039;my_sani_heating_level_90@D4030F&#039;,&#039;ValvePosition.100&#039; =&amp;gt; &#039;my_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;my_wait&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;controlMode.set_auto&#039; =&amp;gt; &#039;my_wait&#039;,&#039;controlMode.set_manual&#039; =&amp;gt; &#039;my_wait&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;R-globalBtnLock.set_on&#039; =&amp;gt; &#039;my_wait&#039;,&#039;R-globalBtnLock.set_off&#039; =&amp;gt; &#039;my_wait&#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|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define myTemp readingsGroup &amp;lt;Raum&amp;gt;,&amp;lt;Tist&amp;gt;,&amp;lt;Tsoll&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Tnight&amp;gt;,&amp;lt;Tday&amp;gt;,&amp;lt;Hum&amp;gt;,&amp;lt;BatTC&amp;gt;,&amp;lt;Vist&amp;gt;,&amp;lt;Vsoll&amp;gt;,&amp;lt;Verr&amp;gt;,&amp;lt;BatVD&amp;gt; Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst &amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilantriebs. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp mapping    { &#039;Broetje&#039; =&amp;gt; &#039;Garten&#039;,&#039;Thermostat.AZ&#039; =&amp;gt; &#039;EG Arbeitszimmer&#039;,&#039;Thermostat.SZ&#039; =&amp;gt; &#039;OG Schlafzimmer&#039;,&#039;Thermostat.WZ&#039;=&amp;gt;&#039;EG Wohnzimmer&#039;,&#039;Thermostat.Kueche&#039; =&amp;gt; &#039;EG Küche&#039;,&#039;Thermostat.GZ&#039; =&amp;gt; &#039;OG Gästezimmer&#039;,&#039;Thermostat.Bad&#039; =&amp;gt; &#039;EG Bad&#039;,&#039;Thermostat.Bad.OG&#039; =&amp;gt; &#039;OG Bad&#039;,&#039;Thermostat.OZ&#039; =&amp;gt; &#039;EG Kaminzimmer&#039;,&#039;desired-temp&#039; =&amp;gt; &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp commands   { &#039;desired-temp&#039; =&amp;gt; &#039;desired-temp:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| desired-temp soll per dropDown einstellbar sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp nameStyle style=&amp;quot;color:yellow&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueFormat { &#039;measured-temp&#039; =&amp;gt; &amp;quot;%0.1f &amp;amp;amp;deg;C&amp;quot;,&#039;ToutIst&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;night-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;day-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;humidity&#039; =&amp;gt; &amp;quot;%.0f &lt;br /&gt;
%%&amp;quot;,&#039;ValvePosition&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;ValveDesired&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;R-valveErrorPos&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #namen des ventil device aus thermostat device ableiten&lt;br /&gt;
 sub valveOfDevice ($) {&lt;br /&gt;
   my ($DEVICE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   if ($DEVICE =~ m/AZ/) {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11).&amp;quot;.Nord&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11);  	&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.&lt;br /&gt;
|}&lt;br /&gt;
Da im {...} Teil des &amp;lt;reading&amp;gt;@&amp;lt;device&amp;gt; Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar &#039;Tricks&#039; lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:&amp;lt;code&amp;gt;...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Inhalte ===&lt;br /&gt;
[[Datei:rgDynamic-1.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 1]]&lt;br /&gt;
[[Datei:rgDynamic-2.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 2]]&lt;br /&gt;
Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich&lt;br /&gt;
einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LXrg dummy&lt;br /&gt;
attr LXrg group -&lt;br /&gt;
attr LXrg setList mode1:on,off mode2:open,closed,tilted&lt;br /&gt;
attr LXrg stateFormat 1=mode1 2=mode2&lt;br /&gt;
attr LXrg webCmd mode1:mode2&lt;br /&gt;
&lt;br /&gt;
define rg readingsGroup Window.*:state Light.*:state&lt;br /&gt;
attr rg group -&lt;br /&gt;
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode1&amp;quot;,&amp;quot;&amp;quot;) || $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode2&amp;quot;,&amp;quot;&amp;quot;) );; return undef;;}&lt;br /&gt;
&lt;br /&gt;
define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,&#039;state&#039;,&#039;&#039;);;;;fhem(&amp;quot;setreading $NAME $value&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable/Disable Button am Beispiel eines WeekdayTimer ===&lt;br /&gt;
Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den WeekdayTimer gibt es hier spezielle Erweiterungen (set Routinen, um das disable Attribut zu setzen, Reading &amp;quot;disabled&amp;quot;). Es gibt aber auch eine allgemeinere Variante (siehe [http://forum.fhem.de/index.php/topic,23655.msg169141.html#msg169141 diesen Forumsbeitrag]) für alle Objekte, die das FHEM Attribut &amp;quot;disable&amp;quot; unterstützen.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rg_scheduling.png|thumb|500px|links|Enable/Disable Button]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextUpdate&amp;quot;)}@disabled&amp;gt;,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextValue&amp;quot;)}@disabled&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Definition der angezeigten Readings. Das Reading disabled wird mit den u.a. Attributen zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine &amp;lt;code&amp;gt;rg_timer_Wasser_show_conditional&amp;lt;/code&amp;gt;, die in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, dass der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueFormat  { if ( $READING =~ m/.*DEF/ ) { my @text = split(&amp;quot; &amp;quot;, $VALUE); shift @text; return join(&amp;quot; &amp;quot;, @text) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Name des Timers wird aus dem interal Reading &amp;quot;+DEF&amp;quot; vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueIcon { &#039;disabled.0&#039; =&amp;gt; &#039;Restart&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;Shutdown&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser commands  { &#039;disabled.0&#039; =&amp;gt; &#039;set $DEVICE disable&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;set $DEVICE enable&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Toggle-Funktion für den Button. Wenn der Timer aktiv (&amp;quot;disabled.0&amp;quot;) sorgt ein Klick auf den Button, dass der Timer deaktiviert wird (&amp;quot;set $DEVICE disable&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&lt;br /&gt;
 sub rg_timer_Wasser_show_conditional($$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING) = @_;&lt;br /&gt;
   return ( ReadingsVal($DEVICE, &amp;quot;disabled&amp;quot;, &amp;quot;1&amp;quot;) eq &amp;quot;0&amp;quot; )? &lt;br /&gt;
      ReadingsVal($DEVICE, $READING, &amp;quot;reading_undef&amp;quot;) : &amp;quot;disabled&amp;quot;;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String &amp;quot;disabled&amp;quot; stattdessen angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links und Trigger ==&lt;br /&gt;
=== 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;
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;
== 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;
 &amp;lt;code&amp;gt;if( $READING eq ... ) {&lt;br /&gt;
   return xxx if( $VALUE &amp;lt; 1 );&lt;br /&gt;
   return yyy if( $VALUE &amp;lt; 1.5 );&lt;br /&gt;
   return zzz;&lt;br /&gt;
 } elsif( $READING eq ... ) {&lt;br /&gt;
   ...&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.&lt;br /&gt;
&lt;br /&gt;
=== 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;
=== 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>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9128</id>
		<title>ReadingsGroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9128"/>
		<updated>2014-12-30T21:52:56Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Heizungsteuerung für HM Wand- und Heizkörperthermostate */&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 commandref.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Weitergehende Erläuterungen zu einzelnen Attributen:&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;
&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;
=== notime ===&lt;br /&gt;
Es werden keine Timestamps für die Readings angezeigt. Nur für einspaltige readingGroups sinnvoll.&lt;br /&gt;
=== nostate ===&lt;br /&gt;
Das state-Reading wird bei regex match nicht berücksichtigt und nicht angezeigt.&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;
== 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_baraometric_pressure&amp;gt;,&amp;lt;Luftdruck&amp;gt;,pressure&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039; und &#039;&#039;&#039;pressure&#039;&#039;&#039; vom Device WetterXXX jeweils mit einem Icon und einem Label davor.&lt;br /&gt;
| rowspan=3 | [[Datei:rgWetter.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueFormat { temperature =&amp;gt; &#039;%1.f &amp;amp;amp;deg;C&#039;, humidity =&amp;gt; &#039;%1.f %%&#039;, pressure =&amp;gt; &#039;%i mbar&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Readingswerte&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueStyle style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Readings sollen rechtsbündig dargestellt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Value ausgeben ===&lt;br /&gt;
Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den 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]]&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;code&amp;gt;&lt;br /&gt;
 #Heizung regeln in readingsGroup&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDown($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$CMD) = @_;&lt;br /&gt;
  &lt;br /&gt;
   my $icon = $CMD;&lt;br /&gt;
   my $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-new&amp;quot;,&amp;quot;20&amp;quot; );&lt;br /&gt;
   $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-temp&amp;quot;,&amp;quot;20&amp;quot; )&lt;br /&gt;
      if( !$VALUE || $VALUE == 0 );&lt;br /&gt;
   my $link;&lt;br /&gt;
  &lt;br /&gt;
   if( $CMD eq &amp;quot;up&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_upward&amp;quot;;&lt;br /&gt;
     $VALUE += 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;lt;= 24 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@red&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   } elsif( $CMD eq &amp;quot;down&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_downward&amp;quot;;&lt;br /&gt;
     $VALUE -= 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;gt;= 18 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@blue&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $notify = &amp;quot;notifyHeizungUpDown&amp;quot;;&lt;br /&gt;
   if( !defined($defs{$notify}) ) {&lt;br /&gt;
     CommandDefine(undef,&lt;br /&gt;
                    &amp;quot;$notify notify .*:desired-new.* &amp;quot;&lt;br /&gt;
                    .&amp;quot;{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }&amp;quot; );&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $ret = &amp;quot;%$icon&amp;quot;;&lt;br /&gt;
   $ret .= &amp;quot;%$link&amp;quot; if( $link );&lt;br /&gt;
  &lt;br /&gt;
   return $ret;&lt;br /&gt;
 }&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDownNotify($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$VALUE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   return if( $VALUE == 0 );&lt;br /&gt;
  &lt;br /&gt;
   my $at = &amp;quot;triggerHeizungUpDown_$DEVICE&amp;quot;;&lt;br /&gt;
   CommandDelete(undef, $at) if( defined($defs{$at}) );&lt;br /&gt;
   CommandDefine(undef,&lt;br /&gt;
                  &amp;quot;$at at +00:00:03 &amp;quot;&lt;br /&gt;
                  .&amp;quot;{my \$v = ReadingsVal(\&amp;quot;$DEVICE\&amp;quot;,\&amp;quot;desired-new\&amp;quot;,undef);&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;set $DEVICE desired-temp \$v\&amp;quot;) if( \$v );&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;setreading $DEVICE desired-new 00\&amp;quot;);}&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
   return undef;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich &amp;gt;=18 und &amp;lt;= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 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;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:RgThermostate.png|thumb|500px|links|Status, Steuerung und Wochenprofil]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;&lt;br /&gt;
set d_label Heizung Heizung &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Temperatur Temperatur &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label  Status Status &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Wochenplan Wochenplan &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Werktag Werktag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Samstag Samstag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Sonntag Sonntag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum1 Zeitraum 1 &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum2 Zeitraum 2 &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|Erzeugen der Readings im device [[Dummy_Hilfen#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; &lt;br /&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_Hilfen#d_label|d_label]]. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate nonames 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausblenden der Device Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate valueIcon &lt;br /&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;}&lt;br /&gt;
&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;
=== Heizungsteuerung für HM Wand- und Heizkörperthermostate ===&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;
{| 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;&lt;br /&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;\&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 \&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 \&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  \&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; \&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  \&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  \&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; \&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  \&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  \&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; \&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  \&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&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| ReadingsGoup anlegen. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;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;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;}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Schrift fett setzen etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
attr heatingInfo commands {&#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;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;quot;R-globalBtnLock.on&amp;quot;=&amp;gt;&amp;quot;set %DEVICE regSet globalBtnLock off&amp;quot;,&amp;quot;R-globalBtnLock.off&amp;quot;=&amp;gt;&amp;quot;set %DEVICE regSet globalBtnLock on&amp;quot;}&lt;br /&gt;
&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;,OG_BZ_TT01_Clima=&amp;gt;&amp;quot;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;Regler&amp;quot;,OG_SZ_WT01_Climate=&amp;gt;&amp;quot;Schlafzimmer&amp;quot;,OG_SZ_TT01_Clima=&amp;gt;&amp;quot;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;Regler&amp;quot;,OG_DZ_WT01_Climate=&amp;gt;&amp;quot;Duschbad&amp;quot;,OG_DZ_TT01_Clima=&amp;gt;&amp;quot;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;Regler&amp;quot;,EG_WZ_WT01_Climate=&amp;gt;&amp;quot;Wohnzimmer&amp;quot;,EG_WZ_TT01_Clima=&amp;gt;&amp;quot;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;Regler1&amp;quot;,EG_WZ_TT02_Clima=&amp;gt;&amp;quot;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;Regler2&amp;quot;,&#039;desired-temp&#039; =&amp;gt; &#039;&#039;}&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}elsif($READING eq &amp;quot;batteryLevel&amp;quot;){if($VALUE&amp;gt;=3){$VALUE=100}elsif($VALUE&amp;gt;=2.7){$VALUE=75}elsif($VALUE&amp;gt;=2.5){$VALUE=50}elsif($VALUE&amp;gt;=2.2){$VALUE=25}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;,&#039;controlMode.auto&#039; =&amp;gt; &#039;sani_heating_automatic@FFC13A&#039;, &#039;controlMode.boost&#039; =&amp;gt; &#039;my_sani_heating_boost@FB0C02&#039;, &#039;humidity&#039;=&amp;gt;&#039;my_humidity@6FD9FB&#039;, &#039;R-globalBtnLock.on&#039;=&amp;gt;&#039;secur_locked@F7301D&#039;, &#039;R-globalBtnLock.off&#039;=&amp;gt;&#039;secur_open@0CFB0C&#039;,&#039;ValvePosition.0&#039; =&amp;gt; &#039;my_sani_heating_level_0@002AE0&#039;,&#039;ValvePosition.10&#039; =&amp;gt; &#039;my_sani_heating_level_10@F8D53D&#039;,&#039;ValvePosition.20&#039; =&amp;gt; &#039;my_sani_heating_level_20@FF9341&#039;,&#039;ValvePosition.30&#039; =&amp;gt; &#039;my_sani_heating_level_30@F17F3F&#039;,&#039;ValvePosition.40&#039; =&amp;gt; &#039;my_sani_heating_level_40@E46C3C&#039;,&#039;ValvePosition.50&#039; =&amp;gt; &#039;my_sani_heating_level_50@DE3B3A&#039;,&#039;ValvePosition.60&#039; =&amp;gt; &#039;my_sani_heating_level_60@A30D2D&#039;,&#039;ValvePosition.70&#039; =&amp;gt; &#039;my_sani_heating_level_70@B40A23&#039;,&#039;ValvePosition.80&#039; =&amp;gt; &#039;my_sani_heating_level_80@C40619&#039;,&#039;ValvePosition.90&#039; =&amp;gt; &#039;my_sani_heating_level_90@D4030F&#039;,&#039;ValvePosition.100&#039; =&amp;gt; &#039;my_sani_heating_level_100@E50005&#039;,&#039;batteryLevel.100&#039;=&amp;gt;&#039;measure_battery_100@0CFB0C&#039;,&#039;batteryLevel.75&#039;=&amp;gt;&#039;measure_battery_75@42BC0A&#039;,&#039;batteryLevel.50&#039;=&amp;gt;&#039;measure_battery_50@F5FF10&#039;,&#039;batteryLevel.25&#039;=&amp;gt;&#039;measure_battery_25@FB5909&#039;,&#039;batteryLevel.0&#039;=&amp;gt;&#039;measure_battery_0@E50005&#039;,&#039;controlMode.set_boost&#039; =&amp;gt; &#039;my_wait&#039;,&#039;controlMode.set_auto&#039; =&amp;gt; &#039;my_wait&#039;,&#039;controlMode.set_manual&#039; =&amp;gt; &#039;my_wait&#039;,&#039;R-globalBtnLock.set_on&#039; =&amp;gt; &#039;my_wait&#039;,&#039;R-globalBtnLock.set_off&#039; =&amp;gt; &#039;my_wait&#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;){my $t=$VALUE;;my $d=ReadingsVal($DEVICE,&#039;desired-temp&#039;,0);;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;}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;quot;ValvePosition&amp;quot;=&amp;gt;&amp;quot; (&amp;quot;.ReadingsVal($DEVICE,$READING,0).&amp;quot; %)&amp;quot;, &amp;quot;humidity&amp;quot;=&amp;gt;&amp;quot; &amp;quot;.ReadingsVal($DEVICE,$READING,0).&amp;quot; % RH&amp;quot;, &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|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define myTemp readingsGroup &amp;lt;Raum&amp;gt;,&amp;lt;Tist&amp;gt;,&amp;lt;Tsoll&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Tnight&amp;gt;,&amp;lt;Tday&amp;gt;,&amp;lt;Hum&amp;gt;,&amp;lt;BatTC&amp;gt;,&amp;lt;Vist&amp;gt;,&amp;lt;Vsoll&amp;gt;,&amp;lt;Verr&amp;gt;,&amp;lt;BatVD&amp;gt; Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst &amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilantriebs. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp mapping    { &#039;Broetje&#039; =&amp;gt; &#039;Garten&#039;,&#039;Thermostat.AZ&#039; =&amp;gt; &#039;EG Arbeitszimmer&#039;,&#039;Thermostat.SZ&#039; =&amp;gt; &#039;OG Schlafzimmer&#039;,&#039;Thermostat.WZ&#039;=&amp;gt;&#039;EG Wohnzimmer&#039;,&#039;Thermostat.Kueche&#039; =&amp;gt; &#039;EG Küche&#039;,&#039;Thermostat.GZ&#039; =&amp;gt; &#039;OG Gästezimmer&#039;,&#039;Thermostat.Bad&#039; =&amp;gt; &#039;EG Bad&#039;,&#039;Thermostat.Bad.OG&#039; =&amp;gt; &#039;OG Bad&#039;,&#039;Thermostat.OZ&#039; =&amp;gt; &#039;EG Kaminzimmer&#039;,&#039;desired-temp&#039; =&amp;gt; &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp commands   { &#039;desired-temp&#039; =&amp;gt; &#039;desired-temp:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| desired-temp soll per dropDown einstellbar sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp nameStyle style=&amp;quot;color:yellow&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueFormat { &#039;measured-temp&#039; =&amp;gt; &amp;quot;%0.1f &amp;amp;amp;deg;C&amp;quot;,&#039;ToutIst&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;night-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;day-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;humidity&#039; =&amp;gt; &amp;quot;%.0f &lt;br /&gt;
%%&amp;quot;,&#039;ValvePosition&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;ValveDesired&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;R-valveErrorPos&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #namen des ventil device aus thermostat device ableiten&lt;br /&gt;
 sub valveOfDevice ($) {&lt;br /&gt;
   my ($DEVICE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   if ($DEVICE =~ m/AZ/) {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11).&amp;quot;.Nord&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11);  	&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.&lt;br /&gt;
|}&lt;br /&gt;
Da im {...} Teil des &amp;lt;reading&amp;gt;@&amp;lt;device&amp;gt; Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar &#039;Tricks&#039; lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:&amp;lt;code&amp;gt;...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Inhalte ===&lt;br /&gt;
[[Datei:rgDynamic-1.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 1]]&lt;br /&gt;
[[Datei:rgDynamic-2.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 2]]&lt;br /&gt;
Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich&lt;br /&gt;
einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LXrg dummy&lt;br /&gt;
attr LXrg group -&lt;br /&gt;
attr LXrg setList mode1:on,off mode2:open,closed,tilted&lt;br /&gt;
attr LXrg stateFormat 1=mode1 2=mode2&lt;br /&gt;
attr LXrg webCmd mode1:mode2&lt;br /&gt;
&lt;br /&gt;
define rg readingsGroup Window.*:state Light.*:state&lt;br /&gt;
attr rg group -&lt;br /&gt;
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode1&amp;quot;,&amp;quot;&amp;quot;) || $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode2&amp;quot;,&amp;quot;&amp;quot;) );; return undef;;}&lt;br /&gt;
&lt;br /&gt;
define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,&#039;state&#039;,&#039;&#039;);;;;fhem(&amp;quot;setreading $NAME $value&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable/Disable Button am Beispiel eines WeekdayTimer ===&lt;br /&gt;
Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den WeekdayTimer gibt es hier spezielle Erweiterungen (set Routinen, um das disable Attribut zu setzen, Reading &amp;quot;disabled&amp;quot;). Es gibt aber auch eine allgemeinere Variante (siehe [http://forum.fhem.de/index.php/topic,23655.msg169141.html#msg169141 diesen Forumsbeitrag]) für alle Objekte, die das FHEM Attribut &amp;quot;disable&amp;quot; unterstützen.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rg_scheduling.png|thumb|500px|links|Enable/Disable Button]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextUpdate&amp;quot;)}@disabled&amp;gt;,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextValue&amp;quot;)}@disabled&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Definition der angezeigten Readings. Das Reading disabled wird mit den u.a. Attributen zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine &amp;lt;code&amp;gt;rg_timer_Wasser_show_conditional&amp;lt;/code&amp;gt;, die in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, dass der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueFormat  { if ( $READING =~ m/.*DEF/ ) { my @text = split(&amp;quot; &amp;quot;, $VALUE); shift @text; return join(&amp;quot; &amp;quot;, @text) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Name des Timers wird aus dem interal Reading &amp;quot;+DEF&amp;quot; vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueIcon { &#039;disabled.0&#039; =&amp;gt; &#039;Restart&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;Shutdown&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser commands  { &#039;disabled.0&#039; =&amp;gt; &#039;set $DEVICE disable&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;set $DEVICE enable&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Toggle-Funktion für den Button. Wenn der Timer aktiv (&amp;quot;disabled.0&amp;quot;) sorgt ein Klick auf den Button, dass der Timer deaktiviert wird (&amp;quot;set $DEVICE disable&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&lt;br /&gt;
 sub rg_timer_Wasser_show_conditional($$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING) = @_;&lt;br /&gt;
   return ( ReadingsVal($DEVICE, &amp;quot;disabled&amp;quot;, &amp;quot;1&amp;quot;) eq &amp;quot;0&amp;quot; )? &lt;br /&gt;
      ReadingsVal($DEVICE, $READING, &amp;quot;reading_undef&amp;quot;) : &amp;quot;disabled&amp;quot;;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String &amp;quot;disabled&amp;quot; stattdessen angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links und Trigger ==&lt;br /&gt;
=== 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;
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;
== 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;
 &amp;lt;code&amp;gt;if( $READING eq ... ) {&lt;br /&gt;
   return xxx if( $VALUE &amp;lt; 1 );&lt;br /&gt;
   return yyy if( $VALUE &amp;lt; 1.5 );&lt;br /&gt;
   return zzz;&lt;br /&gt;
 } elsif( $READING eq ... ) {&lt;br /&gt;
   ...&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.&lt;br /&gt;
&lt;br /&gt;
=== 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;
=== 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>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9127</id>
		<title>ReadingsGroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=9127"/>
		<updated>2014-12-30T21:43:41Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Heizungswerte, Status, Steuerung und Wochenprofil */&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 commandref.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Weitergehende Erläuterungen zu einzelnen Attributen:&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;
&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;
=== notime ===&lt;br /&gt;
Es werden keine Timestamps für die Readings angezeigt. Nur für einspaltige readingGroups sinnvoll.&lt;br /&gt;
=== nostate ===&lt;br /&gt;
Das state-Reading wird bei regex match nicht berücksichtigt und nicht angezeigt.&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;
== 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_baraometric_pressure&amp;gt;,&amp;lt;Luftdruck&amp;gt;,pressure&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039; und &#039;&#039;&#039;pressure&#039;&#039;&#039; vom Device WetterXXX jeweils mit einem Icon und einem Label davor.&lt;br /&gt;
| rowspan=3 | [[Datei:rgWetter.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueFormat { temperature =&amp;gt; &#039;%1.f &amp;amp;amp;deg;C&#039;, humidity =&amp;gt; &#039;%1.f %%&#039;, pressure =&amp;gt; &#039;%i mbar&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Readingswerte&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueStyle style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Readings sollen rechtsbündig dargestellt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Value ausgeben ===&lt;br /&gt;
Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den 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]]&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;code&amp;gt;&lt;br /&gt;
 #Heizung regeln in readingsGroup&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDown($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$CMD) = @_;&lt;br /&gt;
  &lt;br /&gt;
   my $icon = $CMD;&lt;br /&gt;
   my $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-new&amp;quot;,&amp;quot;20&amp;quot; );&lt;br /&gt;
   $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-temp&amp;quot;,&amp;quot;20&amp;quot; )&lt;br /&gt;
      if( !$VALUE || $VALUE == 0 );&lt;br /&gt;
   my $link;&lt;br /&gt;
  &lt;br /&gt;
   if( $CMD eq &amp;quot;up&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_upward&amp;quot;;&lt;br /&gt;
     $VALUE += 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;lt;= 24 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@red&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   } elsif( $CMD eq &amp;quot;down&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_downward&amp;quot;;&lt;br /&gt;
     $VALUE -= 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;gt;= 18 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@blue&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $notify = &amp;quot;notifyHeizungUpDown&amp;quot;;&lt;br /&gt;
   if( !defined($defs{$notify}) ) {&lt;br /&gt;
     CommandDefine(undef,&lt;br /&gt;
                    &amp;quot;$notify notify .*:desired-new.* &amp;quot;&lt;br /&gt;
                    .&amp;quot;{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }&amp;quot; );&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $ret = &amp;quot;%$icon&amp;quot;;&lt;br /&gt;
   $ret .= &amp;quot;%$link&amp;quot; if( $link );&lt;br /&gt;
  &lt;br /&gt;
   return $ret;&lt;br /&gt;
 }&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDownNotify($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$VALUE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   return if( $VALUE == 0 );&lt;br /&gt;
  &lt;br /&gt;
   my $at = &amp;quot;triggerHeizungUpDown_$DEVICE&amp;quot;;&lt;br /&gt;
   CommandDelete(undef, $at) if( defined($defs{$at}) );&lt;br /&gt;
   CommandDefine(undef,&lt;br /&gt;
                  &amp;quot;$at at +00:00:03 &amp;quot;&lt;br /&gt;
                  .&amp;quot;{my \$v = ReadingsVal(\&amp;quot;$DEVICE\&amp;quot;,\&amp;quot;desired-new\&amp;quot;,undef);&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;set $DEVICE desired-temp \$v\&amp;quot;) if( \$v );&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;setreading $DEVICE desired-new 00\&amp;quot;);}&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
   return undef;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich &amp;gt;=18 und &amp;lt;= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 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;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:RgThermostate.png|thumb|500px|links|Status, Steuerung und Wochenprofil]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;&lt;br /&gt;
set d_label Heizung Heizung &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Temperatur Temperatur &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label  Status Status &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Wochenplan Wochenplan &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Werktag Werktag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Samstag Samstag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Sonntag Sonntag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum1 Zeitraum 1 &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum2 Zeitraum 2 &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|Erzeugen der Readings im device [[Dummy_Hilfen#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; &lt;br /&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_Hilfen#d_label|d_label]]. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate nonames 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausblenden der Device Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate valueIcon &lt;br /&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;}&lt;br /&gt;
&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;
=== Heizungsteuerung für HM Wand- und Heizkörperthermostate ===&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;
{| 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;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;&lt;br /&gt;
set d_label Heizung Heizung &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Temperatur Temperatur &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label  Status Status &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Wochenplan Wochenplan &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Werktag Werktag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Samstag Samstag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Sonntag Sonntag &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum1 Zeitraum 1 &amp;lt;br&amp;gt;&lt;br /&gt;
set d_label Zeitraum2 Zeitraum 2 &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|Erzeugen der Readings im device [[Dummy_Hilfen#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; &lt;br /&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_Hilfen#d_label|d_label]]. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate nonames 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ausblenden der Device Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&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;}&lt;br /&gt;
&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;&lt;br /&gt;
attr rg_thermostate valueIcon &lt;br /&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;}&lt;br /&gt;
&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;
=== Readings aus zusätzlichen Devices ===&lt;br /&gt;
Im folgenden Beispiel wird gezeigt wie sich Readings zusätzlicher Devices zu einer Zeile mit mehreren Readings hinzufügen lassen. Diese zusätzlichen Devices können z.b. die unterschiedlichen Channel eines HomeMatic Gerätes sein. Im folgenden Beispiel wird der Name des zugehörigen Geräts dynamisch bestimmt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rgHeizung4.png|thumb|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define myTemp readingsGroup &amp;lt;Raum&amp;gt;,&amp;lt;Tist&amp;gt;,&amp;lt;Tsoll&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Tnight&amp;gt;,&amp;lt;Tday&amp;gt;,&amp;lt;Hum&amp;gt;,&amp;lt;BatTC&amp;gt;,&amp;lt;Vist&amp;gt;,&amp;lt;Vsoll&amp;gt;,&amp;lt;Verr&amp;gt;,&amp;lt;BatVD&amp;gt; Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst &amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilantriebs. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp mapping    { &#039;Broetje&#039; =&amp;gt; &#039;Garten&#039;,&#039;Thermostat.AZ&#039; =&amp;gt; &#039;EG Arbeitszimmer&#039;,&#039;Thermostat.SZ&#039; =&amp;gt; &#039;OG Schlafzimmer&#039;,&#039;Thermostat.WZ&#039;=&amp;gt;&#039;EG Wohnzimmer&#039;,&#039;Thermostat.Kueche&#039; =&amp;gt; &#039;EG Küche&#039;,&#039;Thermostat.GZ&#039; =&amp;gt; &#039;OG Gästezimmer&#039;,&#039;Thermostat.Bad&#039; =&amp;gt; &#039;EG Bad&#039;,&#039;Thermostat.Bad.OG&#039; =&amp;gt; &#039;OG Bad&#039;,&#039;Thermostat.OZ&#039; =&amp;gt; &#039;EG Kaminzimmer&#039;,&#039;desired-temp&#039; =&amp;gt; &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp commands   { &#039;desired-temp&#039; =&amp;gt; &#039;desired-temp:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| desired-temp soll per dropDown einstellbar sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp nameStyle style=&amp;quot;color:yellow&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueFormat { &#039;measured-temp&#039; =&amp;gt; &amp;quot;%0.1f &amp;amp;amp;deg;C&amp;quot;,&#039;ToutIst&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;night-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;day-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;humidity&#039; =&amp;gt; &amp;quot;%.0f &lt;br /&gt;
%%&amp;quot;,&#039;ValvePosition&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;ValveDesired&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;R-valveErrorPos&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #namen des ventil device aus thermostat device ableiten&lt;br /&gt;
 sub valveOfDevice ($) {&lt;br /&gt;
   my ($DEVICE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   if ($DEVICE =~ m/AZ/) {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11).&amp;quot;.Nord&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11);  	&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.&lt;br /&gt;
|}&lt;br /&gt;
Da im {...} Teil des &amp;lt;reading&amp;gt;@&amp;lt;device&amp;gt; Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar &#039;Tricks&#039; lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:&amp;lt;code&amp;gt;...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Inhalte ===&lt;br /&gt;
[[Datei:rgDynamic-1.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 1]]&lt;br /&gt;
[[Datei:rgDynamic-2.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 2]]&lt;br /&gt;
Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich&lt;br /&gt;
einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LXrg dummy&lt;br /&gt;
attr LXrg group -&lt;br /&gt;
attr LXrg setList mode1:on,off mode2:open,closed,tilted&lt;br /&gt;
attr LXrg stateFormat 1=mode1 2=mode2&lt;br /&gt;
attr LXrg webCmd mode1:mode2&lt;br /&gt;
&lt;br /&gt;
define rg readingsGroup Window.*:state Light.*:state&lt;br /&gt;
attr rg group -&lt;br /&gt;
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode1&amp;quot;,&amp;quot;&amp;quot;) || $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode2&amp;quot;,&amp;quot;&amp;quot;) );; return undef;;}&lt;br /&gt;
&lt;br /&gt;
define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,&#039;state&#039;,&#039;&#039;);;;;fhem(&amp;quot;setreading $NAME $value&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable/Disable Button am Beispiel eines WeekdayTimer ===&lt;br /&gt;
Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den WeekdayTimer gibt es hier spezielle Erweiterungen (set Routinen, um das disable Attribut zu setzen, Reading &amp;quot;disabled&amp;quot;). Es gibt aber auch eine allgemeinere Variante (siehe [http://forum.fhem.de/index.php/topic,23655.msg169141.html#msg169141 diesen Forumsbeitrag]) für alle Objekte, die das FHEM Attribut &amp;quot;disable&amp;quot; unterstützen.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rg_scheduling.png|thumb|500px|links|Enable/Disable Button]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextUpdate&amp;quot;)}@disabled&amp;gt;,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextValue&amp;quot;)}@disabled&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Definition der angezeigten Readings. Das Reading disabled wird mit den u.a. Attributen zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine &amp;lt;code&amp;gt;rg_timer_Wasser_show_conditional&amp;lt;/code&amp;gt;, die in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, dass der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueFormat  { if ( $READING =~ m/.*DEF/ ) { my @text = split(&amp;quot; &amp;quot;, $VALUE); shift @text; return join(&amp;quot; &amp;quot;, @text) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Name des Timers wird aus dem interal Reading &amp;quot;+DEF&amp;quot; vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueIcon { &#039;disabled.0&#039; =&amp;gt; &#039;Restart&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;Shutdown&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser commands  { &#039;disabled.0&#039; =&amp;gt; &#039;set $DEVICE disable&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;set $DEVICE enable&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Toggle-Funktion für den Button. Wenn der Timer aktiv (&amp;quot;disabled.0&amp;quot;) sorgt ein Klick auf den Button, dass der Timer deaktiviert wird (&amp;quot;set $DEVICE disable&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&lt;br /&gt;
 sub rg_timer_Wasser_show_conditional($$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING) = @_;&lt;br /&gt;
   return ( ReadingsVal($DEVICE, &amp;quot;disabled&amp;quot;, &amp;quot;1&amp;quot;) eq &amp;quot;0&amp;quot; )? &lt;br /&gt;
      ReadingsVal($DEVICE, $READING, &amp;quot;reading_undef&amp;quot;) : &amp;quot;disabled&amp;quot;;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String &amp;quot;disabled&amp;quot; stattdessen angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links und Trigger ==&lt;br /&gt;
=== 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;
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;
== 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;
 &amp;lt;code&amp;gt;if( $READING eq ... ) {&lt;br /&gt;
   return xxx if( $VALUE &amp;lt; 1 );&lt;br /&gt;
   return yyy if( $VALUE &amp;lt; 1.5 );&lt;br /&gt;
   return zzz;&lt;br /&gt;
 } elsif( $READING eq ... ) {&lt;br /&gt;
   ...&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.&lt;br /&gt;
&lt;br /&gt;
=== 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;
=== 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>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:RgHMTh.jpg&amp;diff=9126</id>
		<title>Datei:RgHMTh.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:RgHMTh.jpg&amp;diff=9126"/>
		<updated>2014-12-30T21:42:33Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: ReadingsGroup: Heizungsteuerung für HM Wand- und Heizkörperthermostate&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ReadingsGroup: Heizungsteuerung für HM Wand- und Heizkörperthermostate&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_spricht_jabber&amp;diff=8471</id>
		<title>FHEM spricht jabber</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_spricht_jabber&amp;diff=8471"/>
		<updated>2014-11-11T19:59:53Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Ein einfaches Command-Interface mit Jabber&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von Jabber-Modul für FHEM kann man nicht nur von FHEM Nachrichten auf sein Handy senden lassen, sondern auch die Gegenrichtung benutzen, um Befehle und Anweisungen an den Server zu schicken.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So habe ich das realisiert...&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zunächst die Definitionen im fhem.cfg (es werden zwei Accounts auf jabber.de benötigt: &amp;lt;fhem_user&amp;gt; und &amp;lt;my_user&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Definition Jabber-Account fuer FHEM&lt;br /&gt;
define jabber Jabber jabber.de 5222 &amp;lt;fhem_user&amp;gt; &amp;lt;passwort&amp;gt; 1 0&lt;br /&gt;
attr jabber OnlineStatus available&lt;br /&gt;
attr jabber PollTimer 2&lt;br /&gt;
# Nachrichten nur von einem bestimmten Account akzeptieren&lt;br /&gt;
attr jabber RecvWhitelist &amp;lt;my_user&amp;gt;@jabber.de&lt;br /&gt;
# Account-Nickname&lt;br /&gt;
attr jabber ResourceName FHEM&lt;br /&gt;
&lt;br /&gt;
# Eine Methode beim Nachrichtenempfang aufrufen&lt;br /&gt;
define Jabber_Notify notify jabber:Message.* {sendJabberAnswer();;}&lt;br /&gt;
&lt;br /&gt;
# Taegliche Statusmeldung verschicken&lt;br /&gt;
define jabberstatus at *05:10:00 {sendMeStatusMsg();;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und dann die Perl-Funktionen (irgendwo in inem Modul, z.B. in 99_myUtils.pm):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
######################################################&lt;br /&gt;
# Meldung per Jabber senden&lt;br /&gt;
######################################################&lt;br /&gt;
sub&lt;br /&gt;
sendJabberMessage($$)&lt;br /&gt;
{&lt;br /&gt;
  my($rcp, $msg) = @_;&lt;br /&gt;
  fhem(&amp;quot;set jabber msg $rcp $msg&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################################&lt;br /&gt;
# Meldung an mich per Jabber senden&lt;br /&gt;
######################################################&lt;br /&gt;
sub&lt;br /&gt;
sendMeJabberMessage($)&lt;br /&gt;
{&lt;br /&gt;
	my($msg) = @_;&lt;br /&gt;
	sendJabberMessage(&#039;&amp;lt;my_user&amp;gt;@jabber.de&#039;, $msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################################&lt;br /&gt;
# Statusdaten an mein Handy per Jabber senden&lt;br /&gt;
######################################################&lt;br /&gt;
sub&lt;br /&gt;
sendMeStatusMsg()&lt;br /&gt;
{&lt;br /&gt;
  # Hier ist der Text fuer die Statusmeldung. Z.B. Werte von Sensoren.&lt;br /&gt;
	my $msg = &amp;quot;Status: Umwelt&amp;quot;;&lt;br /&gt;
	$msg=$msg.&amp;quot;\n  Vorgarten: &amp;quot;;&lt;br /&gt;
	$msg=$msg.&amp;quot;T: &amp;quot;.ReadingsVal(&amp;quot;Sensor1&amp;quot;, &amp;quot;temperature&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C&amp;quot;;&lt;br /&gt;
	$msg=$msg.&amp;quot;\n  Garten: &amp;quot;;&lt;br /&gt;
	$msg=$msg.&amp;quot;T: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;temperature&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C,&amp;quot;; &lt;br /&gt;
	$msg=$msg.&amp;quot; H: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;humidity&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; %,&amp;quot;;  &lt;br /&gt;
	$msg=$msg.&amp;quot; Bat: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;battery&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; V&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	sendMeJabberMessage($msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################################&lt;br /&gt;
# Kleines Jabber-Cmd-Interface&lt;br /&gt;
######################################################&lt;br /&gt;
sub&lt;br /&gt;
sendJabberAnswer()&lt;br /&gt;
{&lt;br /&gt;
  my $lastsender=ReadingsVal(&amp;quot;jabber&amp;quot;,&amp;quot;LastSenderJID&amp;quot;,&amp;quot;0&amp;quot;);&lt;br /&gt;
  my $lastmsg=ReadingsVal(&amp;quot;jabber&amp;quot;,&amp;quot;LastMessage&amp;quot;,&amp;quot;0&amp;quot;);&lt;br /&gt;
  my @cmd_list = split(/\s+/, trim($lastmsg));&lt;br /&gt;
  my $cmd = lc($cmd_list[0]);&lt;br /&gt;
  # erstes Element entfernen&lt;br /&gt;
  shift(@cmd_list);&lt;br /&gt;
  &lt;br /&gt;
  my $newmsg;&lt;br /&gt;
  # Hier den Status ausgeben: Z.B. Anwesenheit, Fenster, Telefonanrufe, Tuerklingel oder Briefkasten...&lt;br /&gt;
  if($cmd eq &amp;quot;status&amp;quot;) {&lt;br /&gt;
  	$newmsg.= &amp;quot;Status: (noch) nicht implementiert&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Ausssentemperatur etc. melden&lt;br /&gt;
  if($cmd eq &amp;quot;umwelt&amp;quot;) {&lt;br /&gt;
    $newmsg.= &amp;quot;Umwelt&amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;\n  Vorgarten: &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;T: &amp;quot;.ReadingsVal(&amp;quot;Sensor3&amp;quot;, &amp;quot;temperature&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C, &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;B: &amp;quot;.ReadingsVal(&amp;quot;Sensor3&amp;quot;, &amp;quot;brightness&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;, &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;Bat: &amp;quot;.ReadingsVal(&amp;quot;Sensor3&amp;quot;, &amp;quot;battery&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;\n  Garten: &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;T: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;temperature&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C,&amp;quot;; &lt;br /&gt;
    $newmsg.=&amp;quot; H: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;humidity&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; %,&amp;quot;;  &lt;br /&gt;
    $newmsg.=&amp;quot; Bat: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;battery&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; V&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Systemueberwachung durch SYSMON&lt;br /&gt;
  if($cmd eq &amp;quot;system&amp;quot;) {&lt;br /&gt;
   $newmsg.= &amp;quot;CPU Temp: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;cpu_temp_avg&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;loadavg: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;loadavg&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;Auslastung: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;stat_cpu_text&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;RAM: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;ram&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;Uptime: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;uptime_text&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;Idle: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;idletime_text&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;FHEM uptime: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;fhemuptime_text&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;FS Root: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;fs_root&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;FS USB: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;fs_usb1&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;Updates: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;sys_updates&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  # ggf. weitere Befehle&lt;br /&gt;
  &lt;br /&gt;
  # kleine Hilfe zu den verfuegbaren Anweisungen&lt;br /&gt;
  if($cmd eq &amp;quot;help&amp;quot; || $cmd eq &amp;quot;hilfe&amp;quot; || $cmd eq &amp;quot;?&amp;quot;) {&lt;br /&gt;
  	$newmsg.= &amp;quot;Befehle: Help (Hilfe), Status, System, Umwelt&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # FHEM-Anweisungen ausfuehren (als ob diese auf der Console eingegben wurden)&lt;br /&gt;
  if($cmd eq &amp;quot;fhem&amp;quot;) {&lt;br /&gt;
    my $cmd_tail = join(&amp;quot; &amp;quot;,@cmd_list);&lt;br /&gt;
    $newmsg.=fhem($cmd_tail);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  # Perl-Befehle ausfuehren  &lt;br /&gt;
  if($cmd eq &amp;quot;perl&amp;quot;) {&lt;br /&gt;
    my $cmd_tail = join(&amp;quot; &amp;quot;,@cmd_list);&lt;br /&gt;
    $newmsg.=eval($cmd_tail);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  # Sprachmeldung ausgeben (ueber TTS Modul)&lt;br /&gt;
  if($cmd eq &amp;quot;say&amp;quot; || $cmd eq &amp;quot;sprich&amp;quot;) {&lt;br /&gt;
      my $cmd_tail = join(&amp;quot; &amp;quot;,@cmd_list);&lt;br /&gt;
      speak($cmd_tail,0);&lt;br /&gt;
      $newmsg.=&amp;quot;ok&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if(defined($newmsg)) {&lt;br /&gt;
    fhem(&amp;quot;set jabber msg &amp;quot;. $lastsender . &amp;quot; &amp;quot;.$newmsg);&lt;br /&gt;
  } else {&lt;br /&gt;
  	fhem(&amp;quot;set jabber msg &amp;quot;. $lastsender . &amp;quot; Unbekanter Befehl: &amp;quot;.$lastmsg);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Was das ganze tut:&lt;br /&gt;
* Jeden Morgen mir die Wetterdaten von 2 meiner Sensoren senden&lt;br /&gt;
* Mehrere Befehle per Jabber-Chat akzeptieren und beantworten:&lt;br /&gt;
** System: ausgewählte System Informationen&lt;br /&gt;
** Umwelt: Wetterdaten&lt;br /&gt;
** perl &amp;lt;perl_cmd&amp;gt;: Perl-Befehle ausführen&lt;br /&gt;
** fhem &amp;lt;fhem_cmd&amp;gt;: FHEM-Commandos ausführen.&lt;br /&gt;
** Sprachmeldungen ausgeben&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und es gibt noch jede Menge Platz für Erweiterungen ;)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[http://www.s6z.de/cms/index.php/homeautomation/fhem/60-ein-einfaches-command-interface-mit-jabber Blog(de)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_spricht_jabber&amp;diff=8470</id>
		<title>FHEM spricht jabber</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_spricht_jabber&amp;diff=8470"/>
		<updated>2014-11-11T19:58:57Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Ein einfaches Command-Interface mit Jabber&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von Jabber-Modul für FHEM kann man nicht nur von FHEM Nachrichten auf sein Handy senden lassen, sondern auch die Gegenrichtung benutzen, um Befehle und Anweisungen an den Server zu schicken.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So habe ich das realisiert...&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zunächst die Definitionen im fhem.cfg (es werden zwei Accounts auf jabber.de benötigt: &amp;lt;fhem_user&amp;gt; und &amp;lt;my_user&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Definition Jabber-Account fuer FHEM&lt;br /&gt;
define jabber Jabber jabber.de 5222 &amp;lt;fhem_user&amp;gt; &amp;lt;passwort&amp;gt; 1 0&lt;br /&gt;
attr jabber OnlineStatus available&lt;br /&gt;
attr jabber PollTimer 2&lt;br /&gt;
# Nachrichten nur von einem bestimmten Account akzeptieren&lt;br /&gt;
attr jabber RecvWhitelist &amp;lt;my_user&amp;gt;@jabber.de&lt;br /&gt;
# Account-Nickname&lt;br /&gt;
attr jabber ResourceName FHEM&lt;br /&gt;
&lt;br /&gt;
# Eine Methode beim Nachrichtenempfang aufrufen&lt;br /&gt;
define Jabber_Notify notify jabber:Message.* {sendJabberAnswer();;}&lt;br /&gt;
&lt;br /&gt;
# Taegliche Statusmeldung verschicken&lt;br /&gt;
define jabberstatus at *05:10:00 {sendMeStatusMsg();;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und dann die Perl-Funktionen (irgendwo in inem Modul, z.B. in 99_myUtils.pm):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
######################################################&lt;br /&gt;
# Meldung per Jabber senden&lt;br /&gt;
######################################################&lt;br /&gt;
sub&lt;br /&gt;
sendJabberMessage($$)&lt;br /&gt;
{&lt;br /&gt;
  my($rcp, $msg) = @_;&lt;br /&gt;
  fhem(&amp;quot;set jabber msg $rcp $msg&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################################&lt;br /&gt;
# Meldung an mich per Jabber senden&lt;br /&gt;
######################################################&lt;br /&gt;
sub&lt;br /&gt;
sendMeJabberMessage($)&lt;br /&gt;
{&lt;br /&gt;
	my($msg) = @_;&lt;br /&gt;
	sendJabberMessage(&#039;&amp;lt;my_user&amp;gt;@jabber.de&#039;, $msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################################&lt;br /&gt;
# Statusdaten an mein Handy per Jabber senden&lt;br /&gt;
######################################################&lt;br /&gt;
sub&lt;br /&gt;
sendMeStatusMsg()&lt;br /&gt;
{&lt;br /&gt;
  # Hier ist der Text fuer die Statusmeldung. Z.B. Werte von Sensoren.&lt;br /&gt;
	my $msg = &amp;quot;Status: Umwelt&amp;quot;;&lt;br /&gt;
	$msg=$msg.&amp;quot;\n  Vorgarten: &amp;quot;;&lt;br /&gt;
	$msg=$msg.&amp;quot;T: &amp;quot;.ReadingsVal(&amp;quot;Sensor1&amp;quot;, &amp;quot;temperature&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C&amp;quot;;&lt;br /&gt;
	$msg=$msg.&amp;quot;\n  Garten: &amp;quot;;&lt;br /&gt;
	$msg=$msg.&amp;quot;T: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;temperature&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C,&amp;quot;; &lt;br /&gt;
	$msg=$msg.&amp;quot; H: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;humidity&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; %,&amp;quot;;  &lt;br /&gt;
	$msg=$msg.&amp;quot; Bat: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;battery&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; V&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	sendMeJabberMessage($msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################################&lt;br /&gt;
# Kleines Jabber-Cmd-Interface&lt;br /&gt;
######################################################&lt;br /&gt;
sub&lt;br /&gt;
sendJabberAnswer()&lt;br /&gt;
{&lt;br /&gt;
  my $lastsender=ReadingsVal(&amp;quot;jabber&amp;quot;,&amp;quot;LastSenderJID&amp;quot;,&amp;quot;0&amp;quot;);&lt;br /&gt;
  my $lastmsg=ReadingsVal(&amp;quot;jabber&amp;quot;,&amp;quot;LastMessage&amp;quot;,&amp;quot;0&amp;quot;);&lt;br /&gt;
  my @cmd_list = split(/\s+/, trim($lastmsg));&lt;br /&gt;
  my $cmd = lc($cmd_list[0]);&lt;br /&gt;
  # erstes Element entfernen&lt;br /&gt;
  shift(@cmd_list);&lt;br /&gt;
  &lt;br /&gt;
  my $newmsg;&lt;br /&gt;
  # Hier den Status ausgeben: Z.B. Anwesenheit, Fenster, Telefonanrufe, Tuerklingel oder Briefkasten...&lt;br /&gt;
  if($cmd eq &amp;quot;status&amp;quot;) {&lt;br /&gt;
  	$newmsg.= &amp;quot;Status: (noch) nicht implementiert&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Ausssentemperatur etc. melden&lt;br /&gt;
  if($cmd eq &amp;quot;umwelt&amp;quot;) {&lt;br /&gt;
    $newmsg.= &amp;quot;Umwelt&amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;\n  Vorgarten: &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;T: &amp;quot;.ReadingsVal(&amp;quot;Sensor3&amp;quot;, &amp;quot;temperature&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C, &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;B: &amp;quot;.ReadingsVal(&amp;quot;Sensor3&amp;quot;, &amp;quot;brightness&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;, &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;Bat: &amp;quot;.ReadingsVal(&amp;quot;Sensor3&amp;quot;, &amp;quot;battery&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;\n  Garten: &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;T: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;temperature&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C,&amp;quot;; &lt;br /&gt;
    $newmsg.=&amp;quot; H: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;humidity&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; %,&amp;quot;;  &lt;br /&gt;
    $newmsg.=&amp;quot; Bat: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;battery&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; V&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Systemueberwachung durch SYSMON&lt;br /&gt;
  if($cmd eq &amp;quot;system&amp;quot;) {&lt;br /&gt;
   $newmsg.= &amp;quot;CPU Temp: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;cpu_temp_avg&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;loadavg: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;loadavg&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;Auslastung: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;stat_cpu_text&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;RAM: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;ram&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;Uptime: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;uptime_text&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;Idle: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;idletime_text&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;FHEM uptime: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;fhemuptime_text&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;FS Root: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;fs_root&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;FS USB: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;fs_usb1&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;Updates: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;sys_updates&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  # ggf. weitere Befehle&lt;br /&gt;
  &lt;br /&gt;
  # kleine Hilfe zu den verfuegbaren Anweisungen&lt;br /&gt;
  if($cmd eq &amp;quot;help&amp;quot; || $cmd eq &amp;quot;hilfe&amp;quot; || $cmd eq &amp;quot;?&amp;quot;) {&lt;br /&gt;
  	$newmsg.= &amp;quot;Befehle: Help (Hilfe), Status, System, Umwelt&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # FHEM-Anweisungen ausfuehren (als ob diese auf der Console eingegben wurden)&lt;br /&gt;
  if($cmd eq &amp;quot;fhem&amp;quot;) {&lt;br /&gt;
    my $cmd_tail = join(&amp;quot; &amp;quot;,@cmd_list);&lt;br /&gt;
    $newmsg.=fhem($cmd_tail);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  # Perl-Befehle ausfuehren  &lt;br /&gt;
  if($cmd eq &amp;quot;perl&amp;quot;) {&lt;br /&gt;
    my $cmd_tail = join(&amp;quot; &amp;quot;,@cmd_list);&lt;br /&gt;
    $newmsg.=eval($cmd_tail);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  # Sprachmeldung ausgeben (ueber TTS Modul)&lt;br /&gt;
  if($cmd eq &amp;quot;say&amp;quot; || $cmd eq &amp;quot;sprich&amp;quot;) {&lt;br /&gt;
      my $cmd_tail = join(&amp;quot; &amp;quot;,@cmd_list);&lt;br /&gt;
      speak($cmd_tail,0);&lt;br /&gt;
      $newmsg.=&amp;quot;ok&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if(defined($newmsg)) {&lt;br /&gt;
    fhem(&amp;quot;set jabber msg &amp;quot;. $lastsender . &amp;quot; &amp;quot;.$newmsg);&lt;br /&gt;
  } else {&lt;br /&gt;
  	fhem(&amp;quot;set jabber msg &amp;quot;. $lastsender . &amp;quot; Unbekanter Befehl: &amp;quot;.$lastmsg);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Was das ganze tut:&lt;br /&gt;
* Jeden Morgen mir die Wetterdaten von 2 meiner Sensoren senden&lt;br /&gt;
* Mehrere Befehle per Jabber-Chat akzeptieren und beantworten:&lt;br /&gt;
** System: ausgewählte System Informationen&lt;br /&gt;
** Umwelt: Wetterdaten&lt;br /&gt;
** perl &amp;lt;perl_cmd&amp;gt;: Perl-Befehle ausführen&lt;br /&gt;
** fhem &amp;lt;fhem_cmd&amp;gt;: FHEM-Commandos ausführen.&lt;br /&gt;
** Sprachmeldungen ausgeben&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und es gibt noch jede Menge Platz für Erweiterungen ;)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[http://www.s6z.de/cms/index.php/homeautomation/fhem/60-ein-einfaches-command-interface-mit-jabber Blog(de)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_spricht_jabber&amp;diff=8469</id>
		<title>FHEM spricht jabber</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_spricht_jabber&amp;diff=8469"/>
		<updated>2014-11-11T19:57:30Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: initiale version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Ein einfaches Command-Interface mit Jabber&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von Jabber-Modul für FHEM kann man nicht nur von FHEM Nachrichten auf sein Handy senden lassen, sondern auch die Gegenrichtung benutzen, um Befehle und Anweisungen an den Server zu schicken.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So habe ich das realisiert...&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zunächst die Definitionen im fhem.cfg (es werden zwei Accounts auf jabber.de benötigt: &amp;lt;fhem_user&amp;gt; und &amp;lt;my_user&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Definition Jabber-Account fuer FHEM&lt;br /&gt;
define jabber Jabber jabber.de 5222 &amp;lt;fhem_user&amp;gt; &amp;lt;passwort&amp;gt; 1 0&lt;br /&gt;
attr jabber OnlineStatus available&lt;br /&gt;
attr jabber PollTimer 2&lt;br /&gt;
# Nachrichten nur von einem bestimmten Account akzeptieren&lt;br /&gt;
attr jabber RecvWhitelist &amp;lt;my_user&amp;gt;@jabber.de&lt;br /&gt;
# Account-Nickname&lt;br /&gt;
attr jabber ResourceName FHEM&lt;br /&gt;
&lt;br /&gt;
# Eine Methode beim Nachrichtenempfang aufrufen&lt;br /&gt;
define Jabber_Notify notify jabber:Message.* {sendJabberAnswer();;}&lt;br /&gt;
&lt;br /&gt;
# Taegliche Statusmeldung verschicken&lt;br /&gt;
define jabberstatus at *05:10:00 {sendMeStatusMsg();;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und dann die Perl-Funktionen (irgendwo in inem Modul, z.B. in 99_myUtils.pm):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
######################################################&lt;br /&gt;
# Meldung per Jabber senden&lt;br /&gt;
######################################################&lt;br /&gt;
sub&lt;br /&gt;
sendJabberMessage($$)&lt;br /&gt;
{&lt;br /&gt;
  my($rcp, $msg) = @_;&lt;br /&gt;
  fhem(&amp;quot;set jabber msg $rcp $msg&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################################&lt;br /&gt;
# Meldung an mich per Jabber senden&lt;br /&gt;
######################################################&lt;br /&gt;
sub&lt;br /&gt;
sendMeJabberMessage($)&lt;br /&gt;
{&lt;br /&gt;
	my($msg) = @_;&lt;br /&gt;
	sendJabberMessage(&#039;&amp;lt;my_user&amp;gt;@jabber.de&#039;, $msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################################&lt;br /&gt;
# Statusdaten an mein Handy per Jabber senden&lt;br /&gt;
######################################################&lt;br /&gt;
sub&lt;br /&gt;
sendMeStatusMsg()&lt;br /&gt;
{&lt;br /&gt;
  # Hier ist der Text fuer die Statusmeldung. Z.B. Werte von Sensoren.&lt;br /&gt;
	my $msg = &amp;quot;Status: Umwelt&amp;quot;;&lt;br /&gt;
	$msg=$msg.&amp;quot;\n  Vorgarten: &amp;quot;;&lt;br /&gt;
	$msg=$msg.&amp;quot;T: &amp;quot;.ReadingsVal(&amp;quot;Sensor1&amp;quot;, &amp;quot;temperature&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C&amp;quot;;&lt;br /&gt;
	$msg=$msg.&amp;quot;\n  Garten: &amp;quot;;&lt;br /&gt;
	$msg=$msg.&amp;quot;T: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;temperature&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C,&amp;quot;; &lt;br /&gt;
	$msg=$msg.&amp;quot; H: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;humidity&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; %,&amp;quot;;  &lt;br /&gt;
	$msg=$msg.&amp;quot; Bat: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;battery&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; V&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	sendMeJabberMessage($msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################################&lt;br /&gt;
# Kleines Jabber-Cmd-Interface&lt;br /&gt;
######################################################&lt;br /&gt;
sub&lt;br /&gt;
sendJabberAnswer()&lt;br /&gt;
{&lt;br /&gt;
  my $lastsender=ReadingsVal(&amp;quot;jabber&amp;quot;,&amp;quot;LastSenderJID&amp;quot;,&amp;quot;0&amp;quot;);&lt;br /&gt;
  my $lastmsg=ReadingsVal(&amp;quot;jabber&amp;quot;,&amp;quot;LastMessage&amp;quot;,&amp;quot;0&amp;quot;);&lt;br /&gt;
  my @cmd_list = split(/\s+/, trim($lastmsg));&lt;br /&gt;
  my $cmd = lc($cmd_list[0]);&lt;br /&gt;
  # erstes Element entfernen&lt;br /&gt;
  shift(@cmd_list);&lt;br /&gt;
  &lt;br /&gt;
  my $newmsg;&lt;br /&gt;
  # Hier den Status ausgeben: Z.B. Anwesenheit, Fenster, Telefonanrufe, Tuerklingel oder Briefkasten...&lt;br /&gt;
  if($cmd eq &amp;quot;status&amp;quot;) {&lt;br /&gt;
  	$newmsg.= &amp;quot;Status: (noch) nicht implementiert&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Ausssentemperatur etc. melden&lt;br /&gt;
  if($cmd eq &amp;quot;umwelt&amp;quot;) {&lt;br /&gt;
    $newmsg.= &amp;quot;Umwelt&amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;\n  Vorgarten: &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;T: &amp;quot;.ReadingsVal(&amp;quot;Sensor3&amp;quot;, &amp;quot;temperature&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C, &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;B: &amp;quot;.ReadingsVal(&amp;quot;Sensor3&amp;quot;, &amp;quot;brightness&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;, &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;Bat: &amp;quot;.ReadingsVal(&amp;quot;Sensor3&amp;quot;, &amp;quot;battery&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;\n  Garten: &amp;quot;;&lt;br /&gt;
    $newmsg.=&amp;quot;T: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;temperature&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C,&amp;quot;; &lt;br /&gt;
    $newmsg.=&amp;quot; H: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;humidity&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; %,&amp;quot;;  &lt;br /&gt;
    $newmsg.=&amp;quot; Bat: &amp;quot;.ReadingsVal(&amp;quot;Sensor2&amp;quot;, &amp;quot;battery&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; V&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Systemueberwachung durch SYSMON&lt;br /&gt;
  if($cmd eq &amp;quot;system&amp;quot;) {&lt;br /&gt;
   $newmsg.= &amp;quot;CPU Temp: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;cpu_temp_avg&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot; C\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;loadavg: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;loadavg&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;Auslastung: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;stat_cpu_text&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;RAM: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;ram&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;Uptime: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;uptime_text&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;Idle: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;idletime_text&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;FHEM uptime: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;fhemuptime_text&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;FS Root: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;fs_root&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;FS USB: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;fs_usb1&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
   $newmsg.= &amp;quot;Updates: &amp;quot;.ReadingsVal(&amp;quot;sysmon&amp;quot;, &amp;quot;sys_updates&amp;quot;, &amp;quot;---&amp;quot;).&amp;quot;\n&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  # ggf. weitere Befehle&lt;br /&gt;
  &lt;br /&gt;
  # kleine Hilfe zu den verfuegbaren Anweisungen&lt;br /&gt;
  if($cmd eq &amp;quot;help&amp;quot; || $cmd eq &amp;quot;hilfe&amp;quot; || $cmd eq &amp;quot;?&amp;quot;) {&lt;br /&gt;
  	$newmsg.= &amp;quot;Befehle: Help (Hilfe), Status, System, Umwelt&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # FHEM-Anweisungen ausfuehren (als ob diese auf der Console eingegben wurden)&lt;br /&gt;
  if($cmd eq &amp;quot;fhem&amp;quot;) {&lt;br /&gt;
    my $cmd_tail = join(&amp;quot; &amp;quot;,@cmd_list);&lt;br /&gt;
    $newmsg.=fhem($cmd_tail);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  # Perl-Befehle ausfuehren  &lt;br /&gt;
  if($cmd eq &amp;quot;perl&amp;quot;) {&lt;br /&gt;
    my $cmd_tail = join(&amp;quot; &amp;quot;,@cmd_list);&lt;br /&gt;
    $newmsg.=eval($cmd_tail);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  # Sprachmeldung ausgeben (ueber TTS Modul)&lt;br /&gt;
  if($cmd eq &amp;quot;say&amp;quot; || $cmd eq &amp;quot;sprich&amp;quot;) {&lt;br /&gt;
      my $cmd_tail = join(&amp;quot; &amp;quot;,@cmd_list);&lt;br /&gt;
      speak($cmd_tail,0);&lt;br /&gt;
      $newmsg.=&amp;quot;ok&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if(defined($newmsg)) {&lt;br /&gt;
    fhem(&amp;quot;set jabber msg &amp;quot;. $lastsender . &amp;quot; &amp;quot;.$newmsg);&lt;br /&gt;
  } else {&lt;br /&gt;
  	fhem(&amp;quot;set jabber msg &amp;quot;. $lastsender . &amp;quot; Unbekanter Befehl: &amp;quot;.$lastmsg);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Was das ganze tut:&lt;br /&gt;
* Jeden Morgen mir die Wetterdaten von 2 meiner Sensoren senden&lt;br /&gt;
* Mehrere Befehle per Jabber-Chat akzeptieren und beantworten:&lt;br /&gt;
** System: ausgewählte System Informationen&lt;br /&gt;
** Umwelt: Wetterdaten&lt;br /&gt;
** perl &amp;lt;perl_cmd&amp;gt;: Perl-Befehle ausführen&lt;br /&gt;
** fhem &amp;lt;fhem_cmd&amp;gt;: FHEM-Commandos ausführen.&lt;br /&gt;
** Sprachmeldungen ausgeben&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und es gibt noch jede Menge Platz für Erweiterungen ;)&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8463</id>
		<title>Wetter vorlesen lassen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8463"/>
		<updated>2014-11-10T23:53:19Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dieser Code-Fragment ermöglicht die aktuellen Temperatur/Luftfeuchte und die Wettervorherssage mit Hilfe von [[Text2Speech]]-Modul vorlesen zu lassen.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices ==&lt;br /&gt;
Es werden einige FHEM-Geräte benötigt:&lt;br /&gt;
# Das Text2Speak-Device (mit dem Namen &#039;tts&#039;)&lt;br /&gt;
# Der Temperatur/Feuchte-Sensor (&#039;thSensor&#039;)&lt;br /&gt;
# Das Weather-Modul (&#039;Wetter&#039;)&lt;br /&gt;
: (Die Namen können im Code anpasst werden.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
Der Code muss in irgendein Modul hineingeschrieben werden. Z.B. 99_myUtils.pm&lt;br /&gt;
&lt;br /&gt;
=== Konstanten ===&lt;br /&gt;
Die Konstanten legen die Geräte-Namen fest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use constant {&lt;br /&gt;
  DEVICE_NAME_TTS    =&amp;gt; &amp;quot;tts&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_TH      =&amp;gt; &amp;quot;thSensor&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_WEATHER =&amp;gt; &amp;quot;Wetter&amp;quot;,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hauptmethoden ===&lt;br /&gt;
Die zwei Methoden, die die eigentliche Sprachausgabe auslösen: speakWetterDaten(;$) und speakWetterVorhersage(;$).&lt;br /&gt;
Zum Testen kann man sie (wenn alles fertig eingetragen ist) direkt in der FHEM-Console (oder eben in der Commandline des Webinterfaces) eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterDaten()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterVorhersage()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beide haben optionale Parameter, diese sind im Quellcode beschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wetterdaten an&lt;br /&gt;
#  Param: Art: Variante der Aussage:&lt;br /&gt;
#         0: Kurzansage, 1: Normal&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterDaten(;$) {&lt;br /&gt;
	my($art)=@_;&lt;br /&gt;
	if(!defined($art)){$art=1;}&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $temp = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;temperature&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	my $humi = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;humidity&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	if($art==0) {&lt;br /&gt;
    #speak(&amp;quot;Aussentemperatur &amp;quot;.$temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak($temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
  if($art==1) {&lt;br /&gt;
    #speak(&amp;quot;Die Aussentemperatur betraegt &amp;quot;.$temp.&amp;quot; Grad. Die Luftfeuchtigkeit liegt bei &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak(&amp;quot;Temperatur &amp;quot;.$temp.&amp;quot; Grad. Luftfeuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wettervorhersage an.&lt;br /&gt;
#  Parameter: Tag: Zahl 1-5 (1-heute, 2-morgen,...) Defaul=2&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterVorhersage(;$) {&lt;br /&gt;
	my ($day) = @_;&lt;br /&gt;
	if(!defined($day)) {$day=2;}&lt;br /&gt;
	&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $t1= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_condition&amp;quot;,undef);&lt;br /&gt;
	my $t2= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_low_c&amp;quot;,undef);&lt;br /&gt;
	my $t3= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_high_c&amp;quot;,undef);&lt;br /&gt;
	&lt;br /&gt;
	my $text = &amp;quot;&amp;quot;;&lt;br /&gt;
	if($day==1) {&lt;br /&gt;
		#$text = &amp;quot;Wetter heute &amp;quot;;&lt;br /&gt;
		$text = &amp;quot;Heute &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==2) {&lt;br /&gt;
		$text = &amp;quot;Morgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==3) {&lt;br /&gt;
		$text = &amp;quot;Uebermorgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day&amp;gt;3) {&lt;br /&gt;
		$text = &amp;quot;Wetter in &amp;quot;.($day-1).&amp;quot; Tagen &amp;quot;;&lt;br /&gt;
	}	&lt;br /&gt;
	if(defined($t1) &amp;amp;&amp;amp; defined($t2) &amp;amp;&amp;amp; defined($t3)) {&lt;br /&gt;
	  $text.=$t1.&amp;quot;. &amp;quot;;&lt;br /&gt;
	  $text.=&amp;quot;Temperatur von &amp;quot;.$t2.&amp;quot; bis &amp;quot;.$t3.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  if($day==1) {&lt;br /&gt;
	  	# gefuehlte Temperatur&lt;br /&gt;
	  	my $tg= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_chill&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Gefuehlte Temperatur aktuell &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Gefuehlte &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	my $tw= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_speed&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Windgeschwindigkeit &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Wind &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  }&lt;br /&gt;
	} else {&lt;br /&gt;
		$text=&amp;quot;Leider keine Vorhersage verfuegbar.&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	speak($text,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfsroutinen ===&lt;br /&gt;
Diese halten bestimmte (in den Hauptmethoden benötigte) Services bereit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Zahlen zur Ansage auf.&lt;br /&gt;
# Ersetzt Kommas und Punkte durch das Wort &#039;Komma&#039;.&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareNumToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	$text =~ s/\./Komma/g;&lt;br /&gt;
  $text =~ s/,/Komma/g;&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl ohne Nachkommastellen&lt;br /&gt;
sub rundeZahl0($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int($val+0.5);&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl mit 1-er Nachkommastelle&lt;br /&gt;
sub rundeZahl1($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int(10*$val+0.5)/10;&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Texte zur Ansage auf.&lt;br /&gt;
# Ersetzt Umlaute (ä=ae etc.)&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareTextToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	# TODO: Ist halt noch nicht fertig geworden ;)&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja, und dann noch die Methode, die den TTS-Modul anspricht. Die Lautstärke wird je nach Tageszeit geändert (also Nachts leiser etc.)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
######################################################&lt;br /&gt;
# Sprachausgabe ueber Text2Speak Modul&lt;br /&gt;
#  Parameter:&lt;br /&gt;
#   - text: Auszugebender Text&lt;br /&gt;
#   - volume (optional) - Lautstaerke&lt;br /&gt;
#     (wenn nicht vorhaneden: wird aktuell gesetzte &lt;br /&gt;
#      Lautstaerke benutzt,&lt;br /&gt;
#      wenn 1 oder groesser: dieser Wert wird benutzt,&lt;br /&gt;
#      wenn 0: adaptiv gesetzt je nach Fageszeit &lt;br /&gt;
#              (also Nachts wesentlich leiser)&lt;br /&gt;
#       (ggf. spaeter adaptiv durch ermitteln der Zimmerlautstaerke)&lt;br /&gt;
######################################################&lt;br /&gt;
sub speak($;$) {&lt;br /&gt;
	my($text,$volume)=@_;&lt;br /&gt;
	if(defined ($volume)) {&lt;br /&gt;
		if(int($volume) &amp;gt;=1) {&lt;br /&gt;
      fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
    } else {&lt;br /&gt;
    	if(int($volume) == 0) {&lt;br /&gt;
    	# Adaptiv &lt;br /&gt;
    	my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;&lt;br /&gt;
    	# 5 - sehr leise&lt;br /&gt;
    	# 10 - ok&lt;br /&gt;
    	# 50 - gut hoerbar&lt;br /&gt;
    	# 100 - default / gut laut&lt;br /&gt;
    	#&lt;br /&gt;
    	# 20:00 - 22:00 =&amp;gt; 10&lt;br /&gt;
    	# 22:00 - 05:00 =&amp;gt;  5&lt;br /&gt;
    	# 05:00 - 07:00 =&amp;gt; 10&lt;br /&gt;
    	# 07:00 - 08:00 =&amp;gt; 50&lt;br /&gt;
    	# 08:00 - 20:00 =&amp;gt; 100&lt;br /&gt;
    	if ($hour&amp;gt;=20 &amp;amp;&amp;amp; $hour&amp;lt;22) {$volume=18}&lt;br /&gt;
    	if ($hour&amp;gt;=22 || $hour&amp;lt;5)  {$volume=8}&lt;br /&gt;
    	if ($hour&amp;gt;=5  &amp;amp;&amp;amp; $hour&amp;lt;7)  {$volume=15}&lt;br /&gt;
    	if ($hour&amp;gt;=7  &amp;amp;&amp;amp; $hour&amp;lt;8)  {$volume=40}&lt;br /&gt;
    	if ($hour&amp;gt;=8  &amp;amp;&amp;amp; $hour&amp;lt;20)  {$volume=100}&lt;br /&gt;
    	&lt;br /&gt;
    	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; tts &amp;quot;.prepareTextToSpeak($text));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
Wie kann man das Ganze sinnvoll einsetzen? Na zum Beispiel indem man die Methoden auf ein Funkbutton oder ein Bewegungsmelder legt und sich so jeden Morgen nach dem Aufstehen auf die Welt da draußen vorbereiten lässt  ;D&lt;br /&gt;
&lt;br /&gt;
Was braucht man an Hardware? Außer Wettersensoren werden aktive Boxen o.ä. benötigt, die an den Line-Out Ausgang des Rechners angeschlossen werden. Und natürlich etwas zum Aktivieren der Ansage.&lt;br /&gt;
(Ich nutze einen in der Wand installierten Lautsprecher ([http://www.pollin.de/shop/dt/MDI2OTUzOTk-/HiFi_Car_HiFi_Video_TV/Lautsprecher/Lautsprecherboxen/Decken_Einbau_Lautsprecher.html Link], für die Sprachausgabe ausreichend, lässt sich in einer tiefen UP-Dose installieren) der über eine kleine 3Watt Verstärkerplatine an meinen Cubietruck angeschlossen ist.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Vorstellung und Diskussion im [http://forum.fhem.de/index.php/topic,28924.0.html Fhem Forum]&lt;br /&gt;
* [[Text2Speech | Beschreibung TTS-Modul]]&lt;br /&gt;
* [[Wetter Vorhersagen | Beispiel für Wethear-Modul]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:Wetter]]&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8462</id>
		<title>Wetter vorlesen lassen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8462"/>
		<updated>2014-11-10T23:52:29Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dieser Code-Fragment ermöglicht die aktuellen Temperatur/Luftfeuchte und die Wettervorherssage mit Hilfe von [[Text2Speech]]-Modul vorlesen zu lassen.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices ==&lt;br /&gt;
Es werden einige FHEM-Geräte benötigt:&lt;br /&gt;
# Das Text2Speak-Device (mit dem Namen &#039;tts&#039;)&lt;br /&gt;
# Der Temperatur/Feuchte-Sensor (&#039;thSensor&#039;)&lt;br /&gt;
# Das Weather-Modul (&#039;Wetter&#039;)&lt;br /&gt;
: (Die Namen können im Code anpasst werden.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
Der Code muss in irgendein Modul hineingeschrieben werden. Z.B. 99_myUtils.pm&lt;br /&gt;
&lt;br /&gt;
=== Konstanten ===&lt;br /&gt;
Die Konstanten legen die Geräte-Namen fest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use constant {&lt;br /&gt;
  DEVICE_NAME_TTS    =&amp;gt; &amp;quot;tts&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_TH      =&amp;gt; &amp;quot;thSensor&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_WEATHER =&amp;gt; &amp;quot;Wetter&amp;quot;,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hauptmethoden ===&lt;br /&gt;
Die zwei Methoden, die die eigentliche Sprachausgabe auslösen: speakWetterDaten(;$) und speakWetterVorhersage(;$).&lt;br /&gt;
Zum Testen kann man sie (wenn alles fertig eingetragen ist) direkt in der FHEM-Console (oder eben in der Commandline des Webinterfaces) eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterDaten()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterVorhersage()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beide haben optionale Parameter, diese sind im Quellcode beschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wetterdaten an&lt;br /&gt;
#  Param: Art: Variante der Aussage:&lt;br /&gt;
#         0: Kurzansage, 1: Normal&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterDaten(;$) {&lt;br /&gt;
	my($art)=@_;&lt;br /&gt;
	if(!defined($art)){$art=1;}&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $temp = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;temperature&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	my $humi = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;humidity&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	if($art==0) {&lt;br /&gt;
    #speak(&amp;quot;Aussentemperatur &amp;quot;.$temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak($temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
  if($art==1) {&lt;br /&gt;
    #speak(&amp;quot;Die Aussentemperatur betraegt &amp;quot;.$temp.&amp;quot; Grad. Die Luftfeuchtigkeit liegt bei &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak(&amp;quot;Temperatur &amp;quot;.$temp.&amp;quot; Grad. Luftfeuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wettervorhersage an.&lt;br /&gt;
#  Parameter: Tag: Zahl 1-5 (1-heute, 2-morgen,...) Defaul=2&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterVorhersage(;$) {&lt;br /&gt;
	my ($day) = @_;&lt;br /&gt;
	if(!defined($day)) {$day=2;}&lt;br /&gt;
	&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $t1= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_condition&amp;quot;,undef);&lt;br /&gt;
	my $t2= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_low_c&amp;quot;,undef);&lt;br /&gt;
	my $t3= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_high_c&amp;quot;,undef);&lt;br /&gt;
	&lt;br /&gt;
	my $text = &amp;quot;&amp;quot;;&lt;br /&gt;
	if($day==1) {&lt;br /&gt;
		#$text = &amp;quot;Wetter heute &amp;quot;;&lt;br /&gt;
		$text = &amp;quot;Heute &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==2) {&lt;br /&gt;
		$text = &amp;quot;Morgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==3) {&lt;br /&gt;
		$text = &amp;quot;Uebermorgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day&amp;gt;3) {&lt;br /&gt;
		$text = &amp;quot;Wetter in &amp;quot;.($day-1).&amp;quot; Tagen &amp;quot;;&lt;br /&gt;
	}	&lt;br /&gt;
	if(defined($t1) &amp;amp;&amp;amp; defined($t2) &amp;amp;&amp;amp; defined($t3)) {&lt;br /&gt;
	  $text.=$t1.&amp;quot;. &amp;quot;;&lt;br /&gt;
	  $text.=&amp;quot;Temperatur von &amp;quot;.$t2.&amp;quot; bis &amp;quot;.$t3.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  if($day==1) {&lt;br /&gt;
	  	# gefuehlte Temperatur&lt;br /&gt;
	  	my $tg= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_chill&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Gefuehlte Temperatur aktuell &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Gefuehlte &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	my $tw= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_speed&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Windgeschwindigkeit &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Wind &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  }&lt;br /&gt;
	} else {&lt;br /&gt;
		$text=&amp;quot;Leider keine Vorhersage verfuegbar.&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	speak($text,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfsroutinen ===&lt;br /&gt;
Diese halten bestimmte (in den Hauptmethoden benötigte) Services bereit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Zahlen zur Ansage auf.&lt;br /&gt;
# Ersetzt Kommas und Punkte durch das Wort &#039;Komma&#039;.&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareNumToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	$text =~ s/\./Komma/g;&lt;br /&gt;
  $text =~ s/,/Komma/g;&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl ohne Nachkommastellen&lt;br /&gt;
sub rundeZahl0($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int($val+0.5);&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl mit 1-er Nachkommastelle&lt;br /&gt;
sub rundeZahl1($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int(10*$val+0.5)/10;&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Texte zur Ansage auf.&lt;br /&gt;
# Ersetzt Umlaute (ä=ae etc.)&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareTextToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	# TODO: Ist halt noch nicht fertig geworden ;)&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja, und dann noch die Methode, die den TTS-Modul anspricht. Die Lautstärke wird je nach Tageszeit geändert (also Nachts leiser etc.)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
######################################################&lt;br /&gt;
# Sprachausgabe ueber Text2Speak Modul&lt;br /&gt;
#  Parameter:&lt;br /&gt;
#   - text: Auszugebender Text&lt;br /&gt;
#   - volume (optional) - Lautstaerke&lt;br /&gt;
#     (wenn nicht vorhaneden: wird aktuell gesetzte &lt;br /&gt;
#      Lautstaerke benutzt,&lt;br /&gt;
#      wenn 1 oder groesser: dieser Wert wird benutzt,&lt;br /&gt;
#      wenn 0: adaptiv gesetzt je nach Fageszeit &lt;br /&gt;
#              (also Nachts wesentlich leiser)&lt;br /&gt;
#       (ggf. spaeter adaptiv durch ermitteln der Zimmerlautstaerke)&lt;br /&gt;
######################################################&lt;br /&gt;
sub speak($;$) {&lt;br /&gt;
	my($text,$volume)=@_;&lt;br /&gt;
	if(defined ($volume)) {&lt;br /&gt;
		if(int($volume) &amp;gt;=1) {&lt;br /&gt;
      fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
    } else {&lt;br /&gt;
    	if(int($volume) == 0) {&lt;br /&gt;
    	# Adaptiv &lt;br /&gt;
    	my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;&lt;br /&gt;
    	# 5 - sehr leise&lt;br /&gt;
    	# 10 - ok&lt;br /&gt;
    	# 50 - gut hoerbar&lt;br /&gt;
    	# 100 - default / gut laut&lt;br /&gt;
    	#&lt;br /&gt;
    	# 20:00 - 22:00 =&amp;gt; 10&lt;br /&gt;
    	# 22:00 - 05:00 =&amp;gt;  5&lt;br /&gt;
    	# 05:00 - 07:00 =&amp;gt; 10&lt;br /&gt;
    	# 07:00 - 08:00 =&amp;gt; 50&lt;br /&gt;
    	# 08:00 - 20:00 =&amp;gt; 100&lt;br /&gt;
    	if ($hour&amp;gt;=20 &amp;amp;&amp;amp; $hour&amp;lt;22) {$volume=18}&lt;br /&gt;
    	if ($hour&amp;gt;=22 || $hour&amp;lt;5)  {$volume=8}&lt;br /&gt;
    	if ($hour&amp;gt;=5  &amp;amp;&amp;amp; $hour&amp;lt;7)  {$volume=15}&lt;br /&gt;
    	if ($hour&amp;gt;=7  &amp;amp;&amp;amp; $hour&amp;lt;8)  {$volume=40}&lt;br /&gt;
    	if ($hour&amp;gt;=8  &amp;amp;&amp;amp; $hour&amp;lt;20)  {$volume=100}&lt;br /&gt;
    	&lt;br /&gt;
    	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; tts &amp;quot;.prepareTextToSpeak($text));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
Wie kann man das Ganze sinnvoll einsetzen? Na zum Beispiel indem man die Methoden auf ein Funkbutton oder ein Bewegungsmelder legt und sich so jeden Morgen nach dem Aufstehen auf die Welt da draußen vorbereiten lässt  ;D&lt;br /&gt;
&lt;br /&gt;
Was braucht man an Hardware? Außer Wettersensoren werden aktive Boxen o.ä. benötigt, die an den Line-Out Ausgang des Rechners angeschlossen werden. Und natürlich etwas zum Aktivieren der Ansage.&lt;br /&gt;
(Ich nutze einen in der Wand installierten Lautsprecher ([http://www.pollin.de/shop/dt/MDI2OTUzOTk-/HiFi_Car_HiFi_Video_TV/Lautsprecher/Lautsprecherboxen/Decken_Einbau_Lautsprecher.html Link], für die Sprachausgabe ausreichend, lässt sich in einer tiefen UP-Dose installieren) der über eine kleine 3Watt Verstärkerplatine an meinen Cubietruck angeschlossen ist.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Vorstellung und Diskussion im [http://forum.fhem.de/index.php/topic,28924.0.html Fhem Forum]&lt;br /&gt;
* [[Wetter Vorhersagen | Beispiel für Wethear-Modul]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:Wetter]]&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8461</id>
		<title>Wetter vorlesen lassen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8461"/>
		<updated>2014-11-10T23:46:34Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dieser Code-Fragment ermöglicht die aktuellen Temperatur/Luftfeuchte und die Wettervorherssage mit Hilfe von [[Text2Speech]]-Modul vorlesen zu lassen.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices ==&lt;br /&gt;
Es werden einige FHEM-Geräte benötigt:&lt;br /&gt;
# Das Text2Speak-Device (mit dem Namen &#039;tts&#039;)&lt;br /&gt;
# Der Temperatur/Feuchte-Sensor (&#039;thSensor&#039;)&lt;br /&gt;
# Das Weather-Modul (&#039;Wetter&#039;)&lt;br /&gt;
: (Die Namen können im Code anpasst werden.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
Der Code muss in irgendein Modul hineingeschrieben werden. Z.B. 99_myUtils.pm&lt;br /&gt;
&lt;br /&gt;
=== Konstanten ===&lt;br /&gt;
Die Konstanten legen die Geräte-Namen fest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use constant {&lt;br /&gt;
  DEVICE_NAME_TTS    =&amp;gt; &amp;quot;tts&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_TH      =&amp;gt; &amp;quot;thSensor&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_WEATHER =&amp;gt; &amp;quot;Wetter&amp;quot;,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hauptmethoden ===&lt;br /&gt;
Die zwei Methoden, die die eigentliche Sprachausgabe auslösen: speakWetterDaten(;$) und speakWetterVorhersage(;$).&lt;br /&gt;
Zum Testen kann man sie (wenn alles fertig eingetragen ist) direkt in der FHEM-Console (oder eben in der Commandline des Webinterfaces) eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterDaten()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterVorhersage()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beide haben optionale Parameter, diese sind im Quellcode beschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wetterdaten an&lt;br /&gt;
#  Param: Art: Variante der Aussage:&lt;br /&gt;
#         0: Kurzansage, 1: Normal&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterDaten(;$) {&lt;br /&gt;
	my($art)=@_;&lt;br /&gt;
	if(!defined($art)){$art=1;}&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $temp = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;temperature&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	my $humi = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;humidity&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	if($art==0) {&lt;br /&gt;
    #speak(&amp;quot;Aussentemperatur &amp;quot;.$temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak($temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
  if($art==1) {&lt;br /&gt;
    #speak(&amp;quot;Die Aussentemperatur betraegt &amp;quot;.$temp.&amp;quot; Grad. Die Luftfeuchtigkeit liegt bei &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak(&amp;quot;Temperatur &amp;quot;.$temp.&amp;quot; Grad. Luftfeuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wettervorhersage an.&lt;br /&gt;
#  Parameter: Tag: Zahl 1-5 (1-heute, 2-morgen,...) Defaul=2&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterVorhersage(;$) {&lt;br /&gt;
	my ($day) = @_;&lt;br /&gt;
	if(!defined($day)) {$day=2;}&lt;br /&gt;
	&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $t1= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_condition&amp;quot;,undef);&lt;br /&gt;
	my $t2= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_low_c&amp;quot;,undef);&lt;br /&gt;
	my $t3= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_high_c&amp;quot;,undef);&lt;br /&gt;
	&lt;br /&gt;
	my $text = &amp;quot;&amp;quot;;&lt;br /&gt;
	if($day==1) {&lt;br /&gt;
		#$text = &amp;quot;Wetter heute &amp;quot;;&lt;br /&gt;
		$text = &amp;quot;Heute &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==2) {&lt;br /&gt;
		$text = &amp;quot;Morgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==3) {&lt;br /&gt;
		$text = &amp;quot;Uebermorgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day&amp;gt;3) {&lt;br /&gt;
		$text = &amp;quot;Wetter in &amp;quot;.($day-1).&amp;quot; Tagen &amp;quot;;&lt;br /&gt;
	}	&lt;br /&gt;
	if(defined($t1) &amp;amp;&amp;amp; defined($t2) &amp;amp;&amp;amp; defined($t3)) {&lt;br /&gt;
	  $text.=$t1.&amp;quot;. &amp;quot;;&lt;br /&gt;
	  $text.=&amp;quot;Temperatur von &amp;quot;.$t2.&amp;quot; bis &amp;quot;.$t3.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  if($day==1) {&lt;br /&gt;
	  	# gefuehlte Temperatur&lt;br /&gt;
	  	my $tg= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_chill&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Gefuehlte Temperatur aktuell &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Gefuehlte &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	my $tw= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_speed&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Windgeschwindigkeit &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Wind &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  }&lt;br /&gt;
	} else {&lt;br /&gt;
		$text=&amp;quot;Leider keine Vorhersage verfuegbar.&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	speak($text,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfsroutinen ===&lt;br /&gt;
Diese halten bestimmte (in den Hauptmethoden benötigte) Services bereit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Zahlen zur Ansage auf.&lt;br /&gt;
# Ersetzt Kommas und Punkte durch das Wort &#039;Komma&#039;.&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareNumToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	$text =~ s/\./Komma/g;&lt;br /&gt;
  $text =~ s/,/Komma/g;&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl ohne Nachkommastellen&lt;br /&gt;
sub rundeZahl0($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int($val+0.5);&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl mit 1-er Nachkommastelle&lt;br /&gt;
sub rundeZahl1($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int(10*$val+0.5)/10;&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Texte zur Ansage auf.&lt;br /&gt;
# Ersetzt Umlaute (ä=ae etc.)&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareTextToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	# TODO: Ist halt noch nicht fertig geworden ;)&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja, und dann noch die Methode, die den TTS-Modul anspricht. Die Lautstärke wird je nach Tageszeit geändert (also Nachts leiser etc.)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
######################################################&lt;br /&gt;
# Sprachausgabe ueber Text2Speak Modul&lt;br /&gt;
#  Parameter:&lt;br /&gt;
#   - text: Auszugebender Text&lt;br /&gt;
#   - volume (optional) - Lautstaerke&lt;br /&gt;
#     (wenn nicht vorhaneden: wird aktuell gesetzte &lt;br /&gt;
#      Lautstaerke benutzt,&lt;br /&gt;
#      wenn 1 oder groesser: dieser Wert wird benutzt,&lt;br /&gt;
#      wenn 0: adaptiv gesetzt je nach Fageszeit &lt;br /&gt;
#              (also Nachts wesentlich leiser)&lt;br /&gt;
#       (ggf. spaeter adaptiv durch ermitteln der Zimmerlautstaerke)&lt;br /&gt;
######################################################&lt;br /&gt;
sub speak($;$) {&lt;br /&gt;
	my($text,$volume)=@_;&lt;br /&gt;
	if(defined ($volume)) {&lt;br /&gt;
		if(int($volume) &amp;gt;=1) {&lt;br /&gt;
      fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
    } else {&lt;br /&gt;
    	if(int($volume) == 0) {&lt;br /&gt;
    	# Adaptiv &lt;br /&gt;
    	my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;&lt;br /&gt;
    	# 5 - sehr leise&lt;br /&gt;
    	# 10 - ok&lt;br /&gt;
    	# 50 - gut hoerbar&lt;br /&gt;
    	# 100 - default / gut laut&lt;br /&gt;
    	#&lt;br /&gt;
    	# 20:00 - 22:00 =&amp;gt; 10&lt;br /&gt;
    	# 22:00 - 05:00 =&amp;gt;  5&lt;br /&gt;
    	# 05:00 - 07:00 =&amp;gt; 10&lt;br /&gt;
    	# 07:00 - 08:00 =&amp;gt; 50&lt;br /&gt;
    	# 08:00 - 20:00 =&amp;gt; 100&lt;br /&gt;
    	if ($hour&amp;gt;=20 &amp;amp;&amp;amp; $hour&amp;lt;22) {$volume=18}&lt;br /&gt;
    	if ($hour&amp;gt;=22 || $hour&amp;lt;5)  {$volume=8}&lt;br /&gt;
    	if ($hour&amp;gt;=5  &amp;amp;&amp;amp; $hour&amp;lt;7)  {$volume=15}&lt;br /&gt;
    	if ($hour&amp;gt;=7  &amp;amp;&amp;amp; $hour&amp;lt;8)  {$volume=40}&lt;br /&gt;
    	if ($hour&amp;gt;=8  &amp;amp;&amp;amp; $hour&amp;lt;20)  {$volume=100}&lt;br /&gt;
    	&lt;br /&gt;
    	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; tts &amp;quot;.prepareTextToSpeak($text));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
Wie kann man das Ganze sinnvoll einsetzen? Na zum Beispiel indem man die Methoden auf ein Funkbutton oder ein Bewegungsmelder legt und sich so jeden Morgen nach dem Aufstehen auf die Welt da draußen vorbereiten lässt  ;D&lt;br /&gt;
&lt;br /&gt;
Was braucht man an Hardware? Außer Wettersensoren werden aktive Boxen o.ä. benötigt, die an den Line-Out Ausgang des Rechners angeschlossen werden. Und natürlich etwas zum Aktivieren der Ansage.&lt;br /&gt;
(Ich nutze einen in der Wand installierten Lautsprecher ([http://www.pollin.de/shop/dt/MDI2OTUzOTk-/HiFi_Car_HiFi_Video_TV/Lautsprecher/Lautsprecherboxen/Decken_Einbau_Lautsprecher.html Link], für die Sprachausgabe ausreichend, lässt sich in einer tiefen UP-Dose installieren) der über eine kleine 3Watt Verstärkerplatine an meinen Cubietruck angeschlossen ist.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Vorstellung und Diskussion im [http://forum.fhem.de/index.php/topic,28924.0.html Fhem Forum]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8460</id>
		<title>Wetter vorlesen lassen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8460"/>
		<updated>2014-11-10T23:44:29Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Verwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dieser Code-Fragment ermöglicht die aktuellen Temperatur/Luftfeuchte und die Wettervorherssage mit Hilfe von [[Text2Speech]]-Modul vorlesen zu lassen.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices ==&lt;br /&gt;
Es werden einige FHEM-Geräte benötigt:&lt;br /&gt;
# Das Text2Speak-Device (mit dem Namen &#039;tts&#039;)&lt;br /&gt;
# Der Temperatur/Feuchte-Sensor (&#039;thSensor&#039;)&lt;br /&gt;
# Das Weather-Modul (&#039;Wetter&#039;)&lt;br /&gt;
: (Die Namen können im Code anpasst werden.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
Der Code muss in irgendein Modul hineingeschrieben werden. Z.B. 99_myUtils.pm&lt;br /&gt;
&lt;br /&gt;
=== Konstanten ===&lt;br /&gt;
Die Konstanten legen die Geräte-Namen fest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use constant {&lt;br /&gt;
  DEVICE_NAME_TTS    =&amp;gt; &amp;quot;tts&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_TH      =&amp;gt; &amp;quot;thSensor&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_WEATHER =&amp;gt; &amp;quot;Wetter&amp;quot;,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hauptmethoden ===&lt;br /&gt;
Die zwei Methoden, die die eigentliche Sprachausgabe auslösen: speakWetterDaten(;$) und speakWetterVorhersage(;$).&lt;br /&gt;
Zum Testen kann man sie (wenn alles fertig eingetragen ist) direkt in der FHEM-Console (oder eben in der Commandline des Webinterfaces) eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterDaten()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterVorhersage()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beide haben optionale Parameter, diese sind im Quellcode beschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wetterdaten an&lt;br /&gt;
#  Param: Art: Variante der Aussage:&lt;br /&gt;
#         0: Kurzansage, 1: Normal&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterDaten(;$) {&lt;br /&gt;
	my($art)=@_;&lt;br /&gt;
	if(!defined($art)){$art=1;}&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $temp = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;temperature&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	my $humi = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;humidity&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	if($art==0) {&lt;br /&gt;
    #speak(&amp;quot;Aussentemperatur &amp;quot;.$temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak($temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
  if($art==1) {&lt;br /&gt;
    #speak(&amp;quot;Die Aussentemperatur betraegt &amp;quot;.$temp.&amp;quot; Grad. Die Luftfeuchtigkeit liegt bei &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak(&amp;quot;Temperatur &amp;quot;.$temp.&amp;quot; Grad. Luftfeuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wettervorhersage an.&lt;br /&gt;
#  Parameter: Tag: Zahl 1-5 (1-heute, 2-morgen,...) Defaul=2&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterVorhersage(;$) {&lt;br /&gt;
	my ($day) = @_;&lt;br /&gt;
	if(!defined($day)) {$day=2;}&lt;br /&gt;
	&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $t1= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_condition&amp;quot;,undef);&lt;br /&gt;
	my $t2= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_low_c&amp;quot;,undef);&lt;br /&gt;
	my $t3= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_high_c&amp;quot;,undef);&lt;br /&gt;
	&lt;br /&gt;
	my $text = &amp;quot;&amp;quot;;&lt;br /&gt;
	if($day==1) {&lt;br /&gt;
		#$text = &amp;quot;Wetter heute &amp;quot;;&lt;br /&gt;
		$text = &amp;quot;Heute &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==2) {&lt;br /&gt;
		$text = &amp;quot;Morgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==3) {&lt;br /&gt;
		$text = &amp;quot;Uebermorgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day&amp;gt;3) {&lt;br /&gt;
		$text = &amp;quot;Wetter in &amp;quot;.($day-1).&amp;quot; Tagen &amp;quot;;&lt;br /&gt;
	}	&lt;br /&gt;
	if(defined($t1) &amp;amp;&amp;amp; defined($t2) &amp;amp;&amp;amp; defined($t3)) {&lt;br /&gt;
	  $text.=$t1.&amp;quot;. &amp;quot;;&lt;br /&gt;
	  $text.=&amp;quot;Temperatur von &amp;quot;.$t2.&amp;quot; bis &amp;quot;.$t3.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  if($day==1) {&lt;br /&gt;
	  	# gefuehlte Temperatur&lt;br /&gt;
	  	my $tg= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_chill&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Gefuehlte Temperatur aktuell &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Gefuehlte &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	my $tw= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_speed&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Windgeschwindigkeit &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Wind &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  }&lt;br /&gt;
	} else {&lt;br /&gt;
		$text=&amp;quot;Leider keine Vorhersage verfuegbar.&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	speak($text,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfsroutinen ===&lt;br /&gt;
Diese halten bestimmte (in den Hauptmethoden benötigte) Services bereit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Zahlen zur Ansage auf.&lt;br /&gt;
# Ersetzt Kommas und Punkte durch das Wort &#039;Komma&#039;.&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareNumToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	$text =~ s/\./Komma/g;&lt;br /&gt;
  $text =~ s/,/Komma/g;&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl ohne Nachkommastellen&lt;br /&gt;
sub rundeZahl0($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int($val+0.5);&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl mit 1-er Nachkommastelle&lt;br /&gt;
sub rundeZahl1($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int(10*$val+0.5)/10;&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Texte zur Ansage auf.&lt;br /&gt;
# Ersetzt Umlaute (ä=ae etc.)&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareTextToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	# TODO: Ist halt noch nicht fertig geworden ;)&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja, und dann noch die Methode, die den TTS-Modul anspricht. Die Lautstärke wird je nach Tageszeit geändert (also Nachts leiser etc.)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
######################################################&lt;br /&gt;
# Sprachausgabe ueber Text2Speak Modul&lt;br /&gt;
#  Parameter:&lt;br /&gt;
#   - text: Auszugebender Text&lt;br /&gt;
#   - volume (optional) - Lautstaerke&lt;br /&gt;
#     (wenn nicht vorhaneden: wird aktuell gesetzte &lt;br /&gt;
#      Lautstaerke benutzt,&lt;br /&gt;
#      wenn 1 oder groesser: dieser Wert wird benutzt,&lt;br /&gt;
#      wenn 0: adaptiv gesetzt je nach Fageszeit &lt;br /&gt;
#              (also Nachts wesentlich leiser)&lt;br /&gt;
#       (ggf. spaeter adaptiv durch ermitteln der Zimmerlautstaerke)&lt;br /&gt;
######################################################&lt;br /&gt;
sub speak($;$) {&lt;br /&gt;
	my($text,$volume)=@_;&lt;br /&gt;
	if(defined ($volume)) {&lt;br /&gt;
		if(int($volume) &amp;gt;=1) {&lt;br /&gt;
      fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
    } else {&lt;br /&gt;
    	if(int($volume) == 0) {&lt;br /&gt;
    	# Adaptiv &lt;br /&gt;
    	my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;&lt;br /&gt;
    	# 5 - sehr leise&lt;br /&gt;
    	# 10 - ok&lt;br /&gt;
    	# 50 - gut hoerbar&lt;br /&gt;
    	# 100 - default / gut laut&lt;br /&gt;
    	#&lt;br /&gt;
    	# 20:00 - 22:00 =&amp;gt; 10&lt;br /&gt;
    	# 22:00 - 05:00 =&amp;gt;  5&lt;br /&gt;
    	# 05:00 - 07:00 =&amp;gt; 10&lt;br /&gt;
    	# 07:00 - 08:00 =&amp;gt; 50&lt;br /&gt;
    	# 08:00 - 20:00 =&amp;gt; 100&lt;br /&gt;
    	if ($hour&amp;gt;=20 &amp;amp;&amp;amp; $hour&amp;lt;22) {$volume=18}&lt;br /&gt;
    	if ($hour&amp;gt;=22 || $hour&amp;lt;5)  {$volume=8}&lt;br /&gt;
    	if ($hour&amp;gt;=5  &amp;amp;&amp;amp; $hour&amp;lt;7)  {$volume=15}&lt;br /&gt;
    	if ($hour&amp;gt;=7  &amp;amp;&amp;amp; $hour&amp;lt;8)  {$volume=40}&lt;br /&gt;
    	if ($hour&amp;gt;=8  &amp;amp;&amp;amp; $hour&amp;lt;20)  {$volume=100}&lt;br /&gt;
    	&lt;br /&gt;
    	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; tts &amp;quot;.prepareTextToSpeak($text));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
Wie kann man das Ganze sinnvoll einsetzen? Na zum Beispiel indem man die Methoden auf ein Funkbutton oder ein Bewegungsmelder legt und sich so jeden Morgen nach dem Aufstehen auf die Welt da draußen vorbereiten lässt  ;D&lt;br /&gt;
&lt;br /&gt;
Was braucht man an Hardware? Außer Wettersensoren werden aktive Boxen o.ä. benötigt, die an den Line-Out Ausgang des Rechners angeschlossen werden. Und natürlich etwas zum Aktivieren der Ansage.&lt;br /&gt;
(Ich nutze einen in der Wand installierten Lautsprecher ([http://www.pollin.de/shop/dt/MDI2OTUzOTk-/HiFi_Car_HiFi_Video_TV/Lautsprecher/Lautsprecherboxen/Decken_Einbau_Lautsprecher.html Link], für die Sprachausgabe ausreichend, lässt sich in einer tiefen UP-Dose installieren) der über eine kleine 3Watt Verstärkerplatine an meinen Cubietruck angeschlossen ist.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Vorstellung und Diskussion im [http://forum.fhem.de/index.php/topic,28924.0.html Fhem Forum]&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8459</id>
		<title>Wetter vorlesen lassen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8459"/>
		<updated>2014-11-10T23:43:39Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Verwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dieser Code-Fragment ermöglicht die aktuellen Temperatur/Luftfeuchte und die Wettervorherssage mit Hilfe von [[Text2Speech]]-Modul vorlesen zu lassen.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices ==&lt;br /&gt;
Es werden einige FHEM-Geräte benötigt:&lt;br /&gt;
# Das Text2Speak-Device (mit dem Namen &#039;tts&#039;)&lt;br /&gt;
# Der Temperatur/Feuchte-Sensor (&#039;thSensor&#039;)&lt;br /&gt;
# Das Weather-Modul (&#039;Wetter&#039;)&lt;br /&gt;
: (Die Namen können im Code anpasst werden.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
Der Code muss in irgendein Modul hineingeschrieben werden. Z.B. 99_myUtils.pm&lt;br /&gt;
&lt;br /&gt;
=== Konstanten ===&lt;br /&gt;
Die Konstanten legen die Geräte-Namen fest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use constant {&lt;br /&gt;
  DEVICE_NAME_TTS    =&amp;gt; &amp;quot;tts&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_TH      =&amp;gt; &amp;quot;thSensor&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_WEATHER =&amp;gt; &amp;quot;Wetter&amp;quot;,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hauptmethoden ===&lt;br /&gt;
Die zwei Methoden, die die eigentliche Sprachausgabe auslösen: speakWetterDaten(;$) und speakWetterVorhersage(;$).&lt;br /&gt;
Zum Testen kann man sie (wenn alles fertig eingetragen ist) direkt in der FHEM-Console (oder eben in der Commandline des Webinterfaces) eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterDaten()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterVorhersage()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beide haben optionale Parameter, diese sind im Quellcode beschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wetterdaten an&lt;br /&gt;
#  Param: Art: Variante der Aussage:&lt;br /&gt;
#         0: Kurzansage, 1: Normal&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterDaten(;$) {&lt;br /&gt;
	my($art)=@_;&lt;br /&gt;
	if(!defined($art)){$art=1;}&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $temp = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;temperature&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	my $humi = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;humidity&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	if($art==0) {&lt;br /&gt;
    #speak(&amp;quot;Aussentemperatur &amp;quot;.$temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak($temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
  if($art==1) {&lt;br /&gt;
    #speak(&amp;quot;Die Aussentemperatur betraegt &amp;quot;.$temp.&amp;quot; Grad. Die Luftfeuchtigkeit liegt bei &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak(&amp;quot;Temperatur &amp;quot;.$temp.&amp;quot; Grad. Luftfeuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wettervorhersage an.&lt;br /&gt;
#  Parameter: Tag: Zahl 1-5 (1-heute, 2-morgen,...) Defaul=2&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterVorhersage(;$) {&lt;br /&gt;
	my ($day) = @_;&lt;br /&gt;
	if(!defined($day)) {$day=2;}&lt;br /&gt;
	&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $t1= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_condition&amp;quot;,undef);&lt;br /&gt;
	my $t2= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_low_c&amp;quot;,undef);&lt;br /&gt;
	my $t3= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_high_c&amp;quot;,undef);&lt;br /&gt;
	&lt;br /&gt;
	my $text = &amp;quot;&amp;quot;;&lt;br /&gt;
	if($day==1) {&lt;br /&gt;
		#$text = &amp;quot;Wetter heute &amp;quot;;&lt;br /&gt;
		$text = &amp;quot;Heute &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==2) {&lt;br /&gt;
		$text = &amp;quot;Morgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==3) {&lt;br /&gt;
		$text = &amp;quot;Uebermorgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day&amp;gt;3) {&lt;br /&gt;
		$text = &amp;quot;Wetter in &amp;quot;.($day-1).&amp;quot; Tagen &amp;quot;;&lt;br /&gt;
	}	&lt;br /&gt;
	if(defined($t1) &amp;amp;&amp;amp; defined($t2) &amp;amp;&amp;amp; defined($t3)) {&lt;br /&gt;
	  $text.=$t1.&amp;quot;. &amp;quot;;&lt;br /&gt;
	  $text.=&amp;quot;Temperatur von &amp;quot;.$t2.&amp;quot; bis &amp;quot;.$t3.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  if($day==1) {&lt;br /&gt;
	  	# gefuehlte Temperatur&lt;br /&gt;
	  	my $tg= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_chill&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Gefuehlte Temperatur aktuell &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Gefuehlte &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	my $tw= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_speed&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Windgeschwindigkeit &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Wind &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  }&lt;br /&gt;
	} else {&lt;br /&gt;
		$text=&amp;quot;Leider keine Vorhersage verfuegbar.&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	speak($text,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfsroutinen ===&lt;br /&gt;
Diese halten bestimmte (in den Hauptmethoden benötigte) Services bereit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Zahlen zur Ansage auf.&lt;br /&gt;
# Ersetzt Kommas und Punkte durch das Wort &#039;Komma&#039;.&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareNumToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	$text =~ s/\./Komma/g;&lt;br /&gt;
  $text =~ s/,/Komma/g;&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl ohne Nachkommastellen&lt;br /&gt;
sub rundeZahl0($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int($val+0.5);&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl mit 1-er Nachkommastelle&lt;br /&gt;
sub rundeZahl1($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int(10*$val+0.5)/10;&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Texte zur Ansage auf.&lt;br /&gt;
# Ersetzt Umlaute (ä=ae etc.)&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareTextToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	# TODO: Ist halt noch nicht fertig geworden ;)&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja, und dann noch die Methode, die den TTS-Modul anspricht. Die Lautstärke wird je nach Tageszeit geändert (also Nachts leiser etc.)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
######################################################&lt;br /&gt;
# Sprachausgabe ueber Text2Speak Modul&lt;br /&gt;
#  Parameter:&lt;br /&gt;
#   - text: Auszugebender Text&lt;br /&gt;
#   - volume (optional) - Lautstaerke&lt;br /&gt;
#     (wenn nicht vorhaneden: wird aktuell gesetzte &lt;br /&gt;
#      Lautstaerke benutzt,&lt;br /&gt;
#      wenn 1 oder groesser: dieser Wert wird benutzt,&lt;br /&gt;
#      wenn 0: adaptiv gesetzt je nach Fageszeit &lt;br /&gt;
#              (also Nachts wesentlich leiser)&lt;br /&gt;
#       (ggf. spaeter adaptiv durch ermitteln der Zimmerlautstaerke)&lt;br /&gt;
######################################################&lt;br /&gt;
sub speak($;$) {&lt;br /&gt;
	my($text,$volume)=@_;&lt;br /&gt;
	if(defined ($volume)) {&lt;br /&gt;
		if(int($volume) &amp;gt;=1) {&lt;br /&gt;
      fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
    } else {&lt;br /&gt;
    	if(int($volume) == 0) {&lt;br /&gt;
    	# Adaptiv &lt;br /&gt;
    	my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;&lt;br /&gt;
    	# 5 - sehr leise&lt;br /&gt;
    	# 10 - ok&lt;br /&gt;
    	# 50 - gut hoerbar&lt;br /&gt;
    	# 100 - default / gut laut&lt;br /&gt;
    	#&lt;br /&gt;
    	# 20:00 - 22:00 =&amp;gt; 10&lt;br /&gt;
    	# 22:00 - 05:00 =&amp;gt;  5&lt;br /&gt;
    	# 05:00 - 07:00 =&amp;gt; 10&lt;br /&gt;
    	# 07:00 - 08:00 =&amp;gt; 50&lt;br /&gt;
    	# 08:00 - 20:00 =&amp;gt; 100&lt;br /&gt;
    	if ($hour&amp;gt;=20 &amp;amp;&amp;amp; $hour&amp;lt;22) {$volume=18}&lt;br /&gt;
    	if ($hour&amp;gt;=22 || $hour&amp;lt;5)  {$volume=8}&lt;br /&gt;
    	if ($hour&amp;gt;=5  &amp;amp;&amp;amp; $hour&amp;lt;7)  {$volume=15}&lt;br /&gt;
    	if ($hour&amp;gt;=7  &amp;amp;&amp;amp; $hour&amp;lt;8)  {$volume=40}&lt;br /&gt;
    	if ($hour&amp;gt;=8  &amp;amp;&amp;amp; $hour&amp;lt;20)  {$volume=100}&lt;br /&gt;
    	&lt;br /&gt;
    	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; tts &amp;quot;.prepareTextToSpeak($text));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
Wie kann man das Ganze sinnvoll einsetzen? Na zum Beispiel indem man die Methoden auf ein Funkbutton oder ein Bewegungsmelder legt und sich so jeden Morgen nach dem Aufstehen auf die Welt da draußen vorbereiten lässt  ;D&lt;br /&gt;
&lt;br /&gt;
Was braucht man an Hardware? Außer Wettersensoren werden aktive Boxen o.ä. benötigt, die an den Line-Out Ausgang des Rechners angeschlossen werden. Und natürlich etwas zum Aktivieren der Ansage.&lt;br /&gt;
(Ich nutze einen in der Wand installierten Lautsprecher ([http://www.pollin.de/shop/dt/MDI2OTUzOTk-/HiFi_Car_HiFi_Video_TV/Lautsprecher/Lautsprecherboxen/Decken_Einbau_Lautsprecher.html Link], lässt sich in einer tiefen UP-Dase installieren) der über eine kleine 3Watt Verstärkerplatine an meinen Cubietruck angeschlossen ist.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Vorstellung und Diskussion im [http://forum.fhem.de/index.php/topic,28924.0.html Fhem Forum]&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8458</id>
		<title>Wetter vorlesen lassen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8458"/>
		<updated>2014-11-10T23:38:59Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dieser Code-Fragment ermöglicht die aktuellen Temperatur/Luftfeuchte und die Wettervorherssage mit Hilfe von [[Text2Speech]]-Modul vorlesen zu lassen.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices ==&lt;br /&gt;
Es werden einige FHEM-Geräte benötigt:&lt;br /&gt;
# Das Text2Speak-Device (mit dem Namen &#039;tts&#039;)&lt;br /&gt;
# Der Temperatur/Feuchte-Sensor (&#039;thSensor&#039;)&lt;br /&gt;
# Das Weather-Modul (&#039;Wetter&#039;)&lt;br /&gt;
: (Die Namen können im Code anpasst werden.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
Der Code muss in irgendein Modul hineingeschrieben werden. Z.B. 99_myUtils.pm&lt;br /&gt;
&lt;br /&gt;
=== Konstanten ===&lt;br /&gt;
Die Konstanten legen die Geräte-Namen fest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use constant {&lt;br /&gt;
  DEVICE_NAME_TTS    =&amp;gt; &amp;quot;tts&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_TH      =&amp;gt; &amp;quot;thSensor&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_WEATHER =&amp;gt; &amp;quot;Wetter&amp;quot;,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hauptmethoden ===&lt;br /&gt;
Die zwei Methoden, die die eigentliche Sprachausgabe auslösen: speakWetterDaten(;$) und speakWetterVorhersage(;$).&lt;br /&gt;
Zum Testen kann man sie (wenn alles fertig eingetragen ist) direkt in der FHEM-Console (oder eben in der Commandline des Webinterfaces) eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterDaten()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterVorhersage()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beide haben optionale Parameter, diese sind im Quellcode beschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wetterdaten an&lt;br /&gt;
#  Param: Art: Variante der Aussage:&lt;br /&gt;
#         0: Kurzansage, 1: Normal&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterDaten(;$) {&lt;br /&gt;
	my($art)=@_;&lt;br /&gt;
	if(!defined($art)){$art=1;}&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $temp = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;temperature&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	my $humi = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;humidity&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	if($art==0) {&lt;br /&gt;
    #speak(&amp;quot;Aussentemperatur &amp;quot;.$temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak($temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
  if($art==1) {&lt;br /&gt;
    #speak(&amp;quot;Die Aussentemperatur betraegt &amp;quot;.$temp.&amp;quot; Grad. Die Luftfeuchtigkeit liegt bei &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak(&amp;quot;Temperatur &amp;quot;.$temp.&amp;quot; Grad. Luftfeuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wettervorhersage an.&lt;br /&gt;
#  Parameter: Tag: Zahl 1-5 (1-heute, 2-morgen,...) Defaul=2&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterVorhersage(;$) {&lt;br /&gt;
	my ($day) = @_;&lt;br /&gt;
	if(!defined($day)) {$day=2;}&lt;br /&gt;
	&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $t1= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_condition&amp;quot;,undef);&lt;br /&gt;
	my $t2= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_low_c&amp;quot;,undef);&lt;br /&gt;
	my $t3= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_high_c&amp;quot;,undef);&lt;br /&gt;
	&lt;br /&gt;
	my $text = &amp;quot;&amp;quot;;&lt;br /&gt;
	if($day==1) {&lt;br /&gt;
		#$text = &amp;quot;Wetter heute &amp;quot;;&lt;br /&gt;
		$text = &amp;quot;Heute &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==2) {&lt;br /&gt;
		$text = &amp;quot;Morgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==3) {&lt;br /&gt;
		$text = &amp;quot;Uebermorgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day&amp;gt;3) {&lt;br /&gt;
		$text = &amp;quot;Wetter in &amp;quot;.($day-1).&amp;quot; Tagen &amp;quot;;&lt;br /&gt;
	}	&lt;br /&gt;
	if(defined($t1) &amp;amp;&amp;amp; defined($t2) &amp;amp;&amp;amp; defined($t3)) {&lt;br /&gt;
	  $text.=$t1.&amp;quot;. &amp;quot;;&lt;br /&gt;
	  $text.=&amp;quot;Temperatur von &amp;quot;.$t2.&amp;quot; bis &amp;quot;.$t3.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  if($day==1) {&lt;br /&gt;
	  	# gefuehlte Temperatur&lt;br /&gt;
	  	my $tg= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_chill&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Gefuehlte Temperatur aktuell &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Gefuehlte &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	my $tw= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_speed&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Windgeschwindigkeit &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Wind &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  }&lt;br /&gt;
	} else {&lt;br /&gt;
		$text=&amp;quot;Leider keine Vorhersage verfuegbar.&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	speak($text,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfsroutinen ===&lt;br /&gt;
Diese halten bestimmte (in den Hauptmethoden benötigte) Services bereit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Zahlen zur Ansage auf.&lt;br /&gt;
# Ersetzt Kommas und Punkte durch das Wort &#039;Komma&#039;.&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareNumToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	$text =~ s/\./Komma/g;&lt;br /&gt;
  $text =~ s/,/Komma/g;&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl ohne Nachkommastellen&lt;br /&gt;
sub rundeZahl0($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int($val+0.5);&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl mit 1-er Nachkommastelle&lt;br /&gt;
sub rundeZahl1($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int(10*$val+0.5)/10;&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Texte zur Ansage auf.&lt;br /&gt;
# Ersetzt Umlaute (ä=ae etc.)&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareTextToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	# TODO: Ist halt noch nicht fertig geworden ;)&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja, und dann noch die Methode, die den TTS-Modul anspricht. Die Lautstärke wird je nach Tageszeit geändert (also Nachts leiser etc.)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
######################################################&lt;br /&gt;
# Sprachausgabe ueber Text2Speak Modul&lt;br /&gt;
#  Parameter:&lt;br /&gt;
#   - text: Auszugebender Text&lt;br /&gt;
#   - volume (optional) - Lautstaerke&lt;br /&gt;
#     (wenn nicht vorhaneden: wird aktuell gesetzte &lt;br /&gt;
#      Lautstaerke benutzt,&lt;br /&gt;
#      wenn 1 oder groesser: dieser Wert wird benutzt,&lt;br /&gt;
#      wenn 0: adaptiv gesetzt je nach Fageszeit &lt;br /&gt;
#              (also Nachts wesentlich leiser)&lt;br /&gt;
#       (ggf. spaeter adaptiv durch ermitteln der Zimmerlautstaerke)&lt;br /&gt;
######################################################&lt;br /&gt;
sub speak($;$) {&lt;br /&gt;
	my($text,$volume)=@_;&lt;br /&gt;
	if(defined ($volume)) {&lt;br /&gt;
		if(int($volume) &amp;gt;=1) {&lt;br /&gt;
      fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
    } else {&lt;br /&gt;
    	if(int($volume) == 0) {&lt;br /&gt;
    	# Adaptiv &lt;br /&gt;
    	my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;&lt;br /&gt;
    	# 5 - sehr leise&lt;br /&gt;
    	# 10 - ok&lt;br /&gt;
    	# 50 - gut hoerbar&lt;br /&gt;
    	# 100 - default / gut laut&lt;br /&gt;
    	#&lt;br /&gt;
    	# 20:00 - 22:00 =&amp;gt; 10&lt;br /&gt;
    	# 22:00 - 05:00 =&amp;gt;  5&lt;br /&gt;
    	# 05:00 - 07:00 =&amp;gt; 10&lt;br /&gt;
    	# 07:00 - 08:00 =&amp;gt; 50&lt;br /&gt;
    	# 08:00 - 20:00 =&amp;gt; 100&lt;br /&gt;
    	if ($hour&amp;gt;=20 &amp;amp;&amp;amp; $hour&amp;lt;22) {$volume=18}&lt;br /&gt;
    	if ($hour&amp;gt;=22 || $hour&amp;lt;5)  {$volume=8}&lt;br /&gt;
    	if ($hour&amp;gt;=5  &amp;amp;&amp;amp; $hour&amp;lt;7)  {$volume=15}&lt;br /&gt;
    	if ($hour&amp;gt;=7  &amp;amp;&amp;amp; $hour&amp;lt;8)  {$volume=40}&lt;br /&gt;
    	if ($hour&amp;gt;=8  &amp;amp;&amp;amp; $hour&amp;lt;20)  {$volume=100}&lt;br /&gt;
    	&lt;br /&gt;
    	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; tts &amp;quot;.prepareTextToSpeak($text));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
Wie kann man das Ganze sinnvoll einsetzen? Na zum Beispiel indem man die Methoden auf ein Funkbutton oder ein Bewegungsmelder legt und sich so jeden Morgen nach dem Aufstehen auf die Welt da draußen vorbereiten lässt  ;D&lt;br /&gt;
&lt;br /&gt;
Was braucht man an Hardware? Außer Wettersensoren werden aktive Boxen o.ä. benötigt, die an den Line-Out Ausgang des Rechners angeschlossen werden. Und natürlich etwas zum Aktivieren der Ansage.&lt;br /&gt;
(Ich nutze einen in der Wand installierten Lautsprecher (http://www.pollin.de/shop/dt/MDI2OTUzOTk-/HiFi_Car_HiFi_Video_TV/Lautsprecher/Lautsprecherboxen/Decken_Einbau_Lautsprecher.html) der über eine kleine 3Watt Verstärkerplatine an mein Cubietruck angeschlossen ist.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Vorstellung und Diskussion im [http://forum.fhem.de/index.php/topic,28924.0.html Fhem Forum]&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8457</id>
		<title>Wetter vorlesen lassen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Wetter_vorlesen_lassen&amp;diff=8457"/>
		<updated>2014-11-10T23:37:58Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: initiale Version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dieser Code-Fragment ermöglicht die aktuellen Temperatur/Luftfeuchte und die Wettervorherssage mit Hilfe von [[Text2Speech]]-Modul vorlesen zu lassen.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices ==&lt;br /&gt;
Es werden einige FHEM-Geräte benötigt:&lt;br /&gt;
# Das Text2Speak-Device (mit dem Namen &#039;tts&#039;)&lt;br /&gt;
# Der Temperatur/Feuchte-Sensor (&#039;thSensor&#039;)&lt;br /&gt;
# Das Weather-Modul (&#039;Wetter&#039;)&lt;br /&gt;
: (Die Namen können im Code anpasst werden.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
Der Code muss in irgendein Modul hineingeschrieben werden. Z.B. 99_myUtils.pm&lt;br /&gt;
&lt;br /&gt;
=== Konstanten ===&lt;br /&gt;
Die Konstanten legen die Geräte-Namen fest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use constant {&lt;br /&gt;
  DEVICE_NAME_TTS    =&amp;gt; &amp;quot;tts&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_TH      =&amp;gt; &amp;quot;thSensor&amp;quot;,&lt;br /&gt;
  DEVICE_NAME_WEATHER =&amp;gt; &amp;quot;Wetter&amp;quot;,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hauptmethoden ===&lt;br /&gt;
Die zwei Methoden, die die eigentliche Sprachausgabe auslösen: speakWetterDaten(;$) und speakWetterVorhersage(;$).&lt;br /&gt;
Zum Testen kann man sie (wenn alles fertig eingetragen ist) direkt in der FHEM-Console (oder eben in der Commandline des Webinterfaces) eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterDaten()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&amp;lt;pre&amp;gt;{speakWetterVorhersage()}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beide haben optionale Parameter, diese sind im Quellcode beschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wetterdaten an&lt;br /&gt;
#  Param: Art: Variante der Aussage:&lt;br /&gt;
#         0: Kurzansage, 1: Normal&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterDaten(;$) {&lt;br /&gt;
	my($art)=@_;&lt;br /&gt;
	if(!defined($art)){$art=1;}&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $temp = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;temperature&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	my $humi = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,&amp;quot;humidity&amp;quot;,&amp;quot;unbekannt&amp;quot;)));&lt;br /&gt;
	if($art==0) {&lt;br /&gt;
    #speak(&amp;quot;Aussentemperatur &amp;quot;.$temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak($temp.&amp;quot; Grad. Feuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
  if($art==1) {&lt;br /&gt;
    #speak(&amp;quot;Die Aussentemperatur betraegt &amp;quot;.$temp.&amp;quot; Grad. Die Luftfeuchtigkeit liegt bei &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
    speak(&amp;quot;Temperatur &amp;quot;.$temp.&amp;quot; Grad. Luftfeuchtigkeit &amp;quot;.$humi.&amp;quot; Prozent.&amp;quot;,0);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Sagt Wettervorhersage an.&lt;br /&gt;
#  Parameter: Tag: Zahl 1-5 (1-heute, 2-morgen,...) Defaul=2&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub speakWetterVorhersage(;$) {&lt;br /&gt;
	my ($day) = @_;&lt;br /&gt;
	if(!defined($day)) {$day=2;}&lt;br /&gt;
	&lt;br /&gt;
	# TODO: Sauber / Abstraktionslayer erstellen&lt;br /&gt;
	my $t1= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_condition&amp;quot;,undef);&lt;br /&gt;
	my $t2= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_low_c&amp;quot;,undef);&lt;br /&gt;
	my $t3= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;fc&amp;quot;.$day.&amp;quot;_high_c&amp;quot;,undef);&lt;br /&gt;
	&lt;br /&gt;
	my $text = &amp;quot;&amp;quot;;&lt;br /&gt;
	if($day==1) {&lt;br /&gt;
		#$text = &amp;quot;Wetter heute &amp;quot;;&lt;br /&gt;
		$text = &amp;quot;Heute &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==2) {&lt;br /&gt;
		$text = &amp;quot;Morgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day==3) {&lt;br /&gt;
		$text = &amp;quot;Uebermorgen &amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($day&amp;gt;3) {&lt;br /&gt;
		$text = &amp;quot;Wetter in &amp;quot;.($day-1).&amp;quot; Tagen &amp;quot;;&lt;br /&gt;
	}	&lt;br /&gt;
	if(defined($t1) &amp;amp;&amp;amp; defined($t2) &amp;amp;&amp;amp; defined($t3)) {&lt;br /&gt;
	  $text.=$t1.&amp;quot;. &amp;quot;;&lt;br /&gt;
	  $text.=&amp;quot;Temperatur von &amp;quot;.$t2.&amp;quot; bis &amp;quot;.$t3.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  if($day==1) {&lt;br /&gt;
	  	# gefuehlte Temperatur&lt;br /&gt;
	  	my $tg= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_chill&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Gefuehlte Temperatur aktuell &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Gefuehlte &amp;quot;.$tg.&amp;quot; Grad.&amp;quot;;&lt;br /&gt;
	  	my $tw= ReadingsVal(+DEVICE_NAME_WEATHER,&amp;quot;wind_speed&amp;quot;,undef);&lt;br /&gt;
	  	#$text.=&amp;quot;Windgeschwindigkeit &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  	$text.=&amp;quot;Wind &amp;quot;.$tw.&amp;quot; Kilometer pro Stunde.&amp;quot;;&lt;br /&gt;
	  }&lt;br /&gt;
	} else {&lt;br /&gt;
		$text=&amp;quot;Leider keine Vorhersage verfuegbar.&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	speak($text,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfsroutinen ===&lt;br /&gt;
Diese halten bestimmte (in den Hauptmethoden benötigte) Services bereit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Zahlen zur Ansage auf.&lt;br /&gt;
# Ersetzt Kommas und Punkte durch das Wort &#039;Komma&#039;.&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareNumToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	$text =~ s/\./Komma/g;&lt;br /&gt;
  $text =~ s/,/Komma/g;&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl ohne Nachkommastellen&lt;br /&gt;
sub rundeZahl0($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int($val+0.5);&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Rundet eine Zahl mit 1-er Nachkommastelle&lt;br /&gt;
sub rundeZahl1($) {&lt;br /&gt;
	my($val)=@_;&lt;br /&gt;
	# Prüfen, ob numerisch&lt;br /&gt;
	if(int($val)&amp;gt;0) {&lt;br /&gt;
		$val = int(10*$val+0.5)/10;&lt;br /&gt;
	}&lt;br /&gt;
	return $val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Bereitet Texte zur Ansage auf.&lt;br /&gt;
# Ersetzt Umlaute (ä=ae etc.)&lt;br /&gt;
###############################################################################&lt;br /&gt;
sub prepareTextToSpeak($) {&lt;br /&gt;
	my($text) = @_;&lt;br /&gt;
	# TODO: Ist halt noch nicht fertig geworden ;)&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja, und dann noch die Methode, die den TTS-Modul anspricht. Die Lautstärke wird je nach Tageszeit geändert (also Nachts leiser etc.)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
######################################################&lt;br /&gt;
# Sprachausgabe ueber Text2Speak Modul&lt;br /&gt;
#  Parameter:&lt;br /&gt;
#   - text: Auszugebender Text&lt;br /&gt;
#   - volume (optional) - Lautstaerke&lt;br /&gt;
#     (wenn nicht vorhaneden: wird aktuell gesetzte &lt;br /&gt;
#      Lautstaerke benutzt,&lt;br /&gt;
#      wenn 1 oder groesser: dieser Wert wird benutzt,&lt;br /&gt;
#      wenn 0: adaptiv gesetzt je nach Fageszeit &lt;br /&gt;
#              (also Nachts wesentlich leiser)&lt;br /&gt;
#       (ggf. spaeter adaptiv durch ermitteln der Zimmerlautstaerke)&lt;br /&gt;
######################################################&lt;br /&gt;
sub speak($;$) {&lt;br /&gt;
	my($text,$volume)=@_;&lt;br /&gt;
	if(defined ($volume)) {&lt;br /&gt;
		if(int($volume) &amp;gt;=1) {&lt;br /&gt;
      fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
    } else {&lt;br /&gt;
    	if(int($volume) == 0) {&lt;br /&gt;
    	# Adaptiv &lt;br /&gt;
    	my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;&lt;br /&gt;
    	# 5 - sehr leise&lt;br /&gt;
    	# 10 - ok&lt;br /&gt;
    	# 50 - gut hoerbar&lt;br /&gt;
    	# 100 - default / gut laut&lt;br /&gt;
    	#&lt;br /&gt;
    	# 20:00 - 22:00 =&amp;gt; 10&lt;br /&gt;
    	# 22:00 - 05:00 =&amp;gt;  5&lt;br /&gt;
    	# 05:00 - 07:00 =&amp;gt; 10&lt;br /&gt;
    	# 07:00 - 08:00 =&amp;gt; 50&lt;br /&gt;
    	# 08:00 - 20:00 =&amp;gt; 100&lt;br /&gt;
    	if ($hour&amp;gt;=20 &amp;amp;&amp;amp; $hour&amp;lt;22) {$volume=18}&lt;br /&gt;
    	if ($hour&amp;gt;=22 || $hour&amp;lt;5)  {$volume=8}&lt;br /&gt;
    	if ($hour&amp;gt;=5  &amp;amp;&amp;amp; $hour&amp;lt;7)  {$volume=15}&lt;br /&gt;
    	if ($hour&amp;gt;=7  &amp;amp;&amp;amp; $hour&amp;lt;8)  {$volume=40}&lt;br /&gt;
    	if ($hour&amp;gt;=8  &amp;amp;&amp;amp; $hour&amp;lt;20)  {$volume=100}&lt;br /&gt;
    	&lt;br /&gt;
    	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; volume &amp;quot;.$volume);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
	fhem(&amp;quot;set &amp;quot;.+DEVICE_NAME_TTS.&amp;quot; tts &amp;quot;.prepareTextToSpeak($text));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
Wie kann man das Ganze sinnvoll einsetzen? Na zum Beispiel indem man die Methoden auf ein Funkbutton oder ein Bewegungsmelder legt und sich so jeden Morgen nach dem Aufstehen auf die Welt da draußen vorbereiten lässt  ;D&lt;br /&gt;
&lt;br /&gt;
Was braucht man an Hardware? Außer Wettersensoren werden aktive Boxen o.ä. benötigt, die an den Line-Out Ausgang des Rechners angeschlossen werden. Und natürlich etwas zum Aktivieren der Ansage.&lt;br /&gt;
(Ich nutze einen in der Wand installierten Lautsprecher (http://www.pollin.de/shop/dt/MDI2OTUzOTk-/HiFi_Car_HiFi_Video_TV/Lautsprecher/Lautsprecherboxen/Decken_Einbau_Lautsprecher.html) der über eine kleine 3Watt Verstärkerplatine an mein Cubietruck angeschlossen ist.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Vorstellung und Diskussion im [http://forum.fhem.de/index.php/topic,28924.0.html Fhem Forum]&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=7163</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=7163"/>
		<updated>2014-08-10T22:01:43Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: Power-Readings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anzeige von Informationen und Statistiken zu dem System, auf dem Fhem ausgeführt wird.&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModForumArea=[http://forum.fhem.de/index.php/board,44.0.html Unterstützende Dienste]&lt;br /&gt;
|ModTechName=42_SYSMON.pm&lt;br /&gt;
|ModOwner=hexenmeister &amp;lt;br /&amp;gt;([http://forum.fhem.de/index.php?action=profile;u=4065 Forum] / [[Benutzer:Hexenmeister|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[SYSMON]] Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung erstellt eine neue SYSMON-Instanz. Die Parameter M1 bis M4 legen die Aktualisierungsintervalle für verschiedenen Readings (Statistiken) fest. Die Parameter sind als Multiplikatoren für die Zeit, die durch INTERVAL_BASE definiert ist, zu verstehen. Da diese Zeit fest auf 60 Sekunden gesetzt ist, können die Mx-Parameters als Zeitintervalle in Minuten angesehen werden.&lt;br /&gt;
Wird einer (oder mehrere) Multiplikatoren auf Null gesetzt werden, wird das entsprechende Readings deaktiviert.&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
Die Parameter sind für die Aktualisierung der Readings nach folgender Schema zuständig:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M1&#039;&#039;&#039;: (Default-Wert: 1)&lt;br /&gt;
:CPU-Daten: &#039;&#039;cpu_freq&#039;&#039;, &#039;&#039;cpu_temp&#039;&#039;, &#039;&#039;cpu_temp_avg&#039;&#039;, &#039;&#039;loadavg&#039;&#039;, &#039;&#039;stat_cpu&#039;&#039;, &#039;&#039;stat_cpu_diff&#039;&#039;, &#039;&#039;stat_cpu_percent&#039;&#039;, &#039;&#039;stat_cpu_text&#039;&#039;, power readings&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
&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 Netwerk-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-Commando.&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 anzuzeigende 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 eihentlichen Wert angezeigt (so können z.B. Einheiten wie MHz angezeigt werden).&lt;br /&gt;
Falls kein Comment angegeben ist, wird eine intern vordefinierte Beschreibung angegeben. Bei benutzerdefinierbaren Readings wird ggf. Comment aus der Definition verwendet.&lt;br /&gt;
Wird keine Liste angegeben, wird eine vordefinierte Auswahl verwendet (alle Werte).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define sysv1 weblink htmlCode {SYSMON_ShowValuesHTML(&#039;sysmon&#039;)}&lt;br /&gt;
define sysv2 weblink htmlCode {SYSMON_ShowValuesHTML(&#039;sysmon&#039;, (&#039;date:Datum&#039;, &#039;cpu_temp:CPU Temperatur: °C&#039;, &#039;cpu_freq:CPU Frequenz: MHz&#039;))}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text-Ausgabe===&lt;br /&gt;
&lt;br /&gt;
Text-Ausgabe-Methode: SYSMON_ShowValuesText(&amp;lt;SYSMON-Instance&amp;gt;[,&amp;lt;Liste&amp;gt;])&lt;br /&gt;
&lt;br /&gt;
Analog SYSMON_ShowValuesHTML, jedoch formatiert als reines Text.&lt;br /&gt;
&lt;br /&gt;
===Readings-Werte mit Perl lesen===&lt;br /&gt;
SYSMON_getValues([&amp;lt;Liste der gewünschten Schlüssel&amp;gt;])&lt;br /&gt;
&lt;br /&gt;
Liefert ein Hash-Ref mit den gewünschten Werten. Wenn keine Liste (array) übergeben wird, werden alle Werte geliefert.&lt;br /&gt;
&lt;br /&gt;
==Beispielkonfiguration==&lt;br /&gt;
&lt;br /&gt;
    # Modul-Definition&lt;br /&gt;
    define sysmon SYSMON 1 1 1 10&lt;br /&gt;
    #attr sysmon event-on-update-reading cpu_temp,cpu_temp_avg,cpu_freq,eth0_diff,loadavg,ram,^~ /.*usb.*,~ /$&lt;br /&gt;
    attr sysmon event-on-update-reading cpu_temp,cpu_temp_avg,cpu_freq,eth0_diff,loadavg,ram,fs_.*,stat_cpu_percent&lt;br /&gt;
    attr sysmon filesystems fs_boot:/boot,fs_root:/:Root,fs_usb1:/media/usb1:USB-Stick&lt;br /&gt;
    attr sysmon network-interfaces eth0:eth0:Ethernet,wlan0:wlan0:WiFi&lt;br /&gt;
    attr sysmon group RPi&lt;br /&gt;
    attr sysmon room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Log&lt;br /&gt;
    define FileLog_sysmon FileLog ./log/sysmon-%Y-%m.log sysmon&lt;br /&gt;
    attr FileLog_sysmon group RPi&lt;br /&gt;
    attr FileLog_sysmon logtype SM_CPUTemp:Plot,text&lt;br /&gt;
    attr FileLog_sysmon room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: CPU-Temperatur&lt;br /&gt;
    define wl_sysmon_temp SVG FileLog_sysmon:SM_CPUTemp:CURRENT&lt;br /&gt;
    attr wl_sysmon_temp group RPi&lt;br /&gt;
    attr wl_sysmon_temp label &amp;quot;CPU Temperatur: Min $data{min2}, Max $data{max2}, Last $data{currval2}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_temp room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: Netzwerk-Datenübertragung für eth0&lt;br /&gt;
    define wl_sysmon_eth0 SVG FileLog_sysmon:SM_Network_eth0:CURRENT&lt;br /&gt;
    attr wl_sysmon_eth0 group RPi&lt;br /&gt;
    attr wl_sysmon_eth0 label &amp;quot;Netzwerk-Traffic eth0: $data{min1}, Max: $data{max1}, Aktuell: $data{currval1}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_eth0 room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: Netzwerk-Datenübertragung für wlan0&lt;br /&gt;
    define wl_sysmon_wlan0 SVG FileLog_sysmon:SM_Network_wlan0:CURRENT&lt;br /&gt;
    attr wl_sysmon_wlan0 group RPi&lt;br /&gt;
    attr wl_sysmon_wlan0 label &amp;quot;Netzwerk-Traffic wlan0: $data{min1}, Max: $data{max1}, Aktuell: $data{currval1}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_wlan0 room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: CPU-Auslastung (load average)&lt;br /&gt;
    define wl_sysmon_load SVG FileLog_sysmon:SM_Load:CURRENT&lt;br /&gt;
    attr wl_sysmon_load group RPi&lt;br /&gt;
    attr wl_sysmon_load label &amp;quot;Load Min: $data{min1}, Max: $data{max1}, Aktuell: $data{currval1}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_load room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: RAM-Nutzung&lt;br /&gt;
    define wl_sysmon_ram SVG FileLog_sysmon:SM_RAM:CURRENT&lt;br /&gt;
    attr wl_sysmon_ram group RPi&lt;br /&gt;
    attr wl_sysmon_ram label &amp;quot;RAM-Nutzung Total: $data{max1}, Min: $data{min2}, Max: $data{max2}, Aktuell: $data{currval2}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_ram room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: Dateisystem: Root-Partition&lt;br /&gt;
    define wl_sysmon_fs_root SVG FileLog_sysmon:SM_FS_root:CURRENT&lt;br /&gt;
    attr wl_sysmon_fs_root group RPi&lt;br /&gt;
    attr wl_sysmon_fs_root label &amp;quot;Root Partition Total: $data{max1}, Min: $data{min2}, Max: $data{max2}, Aktuell: $data{currval2}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_fs_root room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: Dateisystem: USB-Stick&lt;br /&gt;
    define wl_sysmon_fs_usb1 SVG FileLog_sysmon:SM_FS_usb1:CURRENT&lt;br /&gt;
    attr wl_sysmon_fs_usb1 group RPi&lt;br /&gt;
    attr wl_sysmon_fs_usb1 label &amp;quot;USB1 Total: $data{max1}, Min: $data{min2}, Max: $data{max2}, Aktuell: $data{currval2}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_fs_usb1 room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Anzeige der Readings zum Einbinden in ein &#039;Raum&#039;.&lt;br /&gt;
    define SysValues weblink htmlCode {SYSMON_ShowValuesHTML(&#039;sysmon&#039;)}&lt;br /&gt;
    attr SysValues group RPi&lt;br /&gt;
    attr SysValues room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Anzeige CPU Auslasung&lt;br /&gt;
    define wl_sysmon_cpustat SVG FileLog_sysmon:SM_CPUStat:CURRENT&lt;br /&gt;
    attr wl_sysmon_cpustat label &amp;quot;CPU(min/max): user:$data{min1}/$data{max1} nice:$data{min2}/$data{max2} sys:$data{min3}/$data{max3} idle:$data{min4}/$data{max4} io:$data{min5}/$data{max5} irq:$data{min6}/$data{max6} sirq:$data{min7}/$data{max7}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_cpustat group RPi&lt;br /&gt;
    attr wl_sysmon_cpustat room 9.99_Test&lt;br /&gt;
    attr wl_sysmon_cpustat plotsize 840,420&lt;br /&gt;
    define wl_sysmon_cpustat_s SVG FileLog_sysmon:SM_CPUStatSum:CURRENT&lt;br /&gt;
    attr wl_sysmon_cpustat_s label &amp;quot;CPU(min/max): user:$data{min1}/$data{max1} nice:$data{min2}/$data{max2} sys:$data{min3}/$data{max3} idle:$data{min4}/$data{max4} io:$data{min5}/$data{max5} irq:$data{min6}/$data{max6} sirq:$data{min7}/$data{max7}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_cpustat_s group RPi&lt;br /&gt;
    attr wl_sysmon_cpustat_s room 9.99_Test&lt;br /&gt;
    attr wl_sysmon_cpustat_s plotsize 840,420&lt;br /&gt;
    define wl_sysmon_cpustatT SVG FileLog_sysmon:SM_CPUStatTotal:CURRENT&lt;br /&gt;
    attr wl_sysmon_cpustatT label &amp;quot;CPU-Auslastung&amp;quot;&lt;br /&gt;
    attr wl_sysmon_cpustatT group RPi&lt;br /&gt;
    attr wl_sysmon_cpustatT plotsize 840,420&lt;br /&gt;
    &lt;br /&gt;
    # Anzeige Stromversorgung AC&lt;br /&gt;
    define wl_sysmon_power_ac SVG FileLog_sysmon:SM_power_ac:CURRENT&lt;br /&gt;
    attr wl_sysmon_power_ac label &amp;quot;Stromversorgung (ac) Spannung: $data{min1} - $data{max1} V,  Strom: $data{min2} - $data{max2} mA&amp;quot;&lt;br /&gt;
    attr wl_sysmon_power_ac room Technik&lt;br /&gt;
    attr wl_sysmon_power_ac group system&lt;br /&gt;
    &lt;br /&gt;
    # Anzeige Stromversorgung Battery&lt;br /&gt;
    define wl_sysmon_power_bat SVG FileLog_sysmon:SM_power_battery:CURRENT&lt;br /&gt;
    attr wl_sysmon_power_bat label &amp;quot;Stromversorgung (bat) Spannung: $data{min1} - $data{max1} V,  Strom: $data{min2} - $data{max2} mA&amp;quot;&lt;br /&gt;
    attr wl_sysmon_power_bat room Technik&lt;br /&gt;
    attr wl_sysmon_power_bat group system&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6556</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6556"/>
		<updated>2014-06-12T21:03:09Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Beispielkonfiguration */&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=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=42_SYSMON.pm&lt;br /&gt;
|ModOwner=hexenmeister / [http://forum.fhem.de/index.php?action=profile;u=4065 Hexenmeister]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[SYSMON]] Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung erstellt eine neue SYSMON-Instanz. Die Parameter M1 bis M4 legen die Aktualisierungsintervalle für verschiedenen Readings (Statistiken) fest. Die Parameter sind als Multiplikatoren für die Zeit, die durch INTERVAL_BASE definiert ist, zu verstehen. Da diese Zeit fest auf 60 Sekunden gesetzt ist, können die Mx-Parameters als Zeitintervalle in Minuten angesehen werden.&lt;br /&gt;
Wird einer (oder mehrere) Multiplikatoren auf Null gesetzt werden, wird das entsprechende Readings deaktiviert.&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
Die Parameter sind für die Aktualisierung der Readings nach folgender Schema zuständig:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M1&#039;&#039;&#039;: (Default-Wert: 1)&lt;br /&gt;
:CPU-Daten: &#039;&#039;cpu_freq&#039;&#039;, &#039;&#039;cpu_temp&#039;&#039;, &#039;&#039;cpu_temp_avg&#039;&#039;, &#039;&#039;loadavg&#039;&#039;, &#039;&#039;stat_cpu&#039;&#039;, &#039;&#039;stat_cpu_diff&#039;&#039;, &#039;&#039;stat_cpu_percent&#039;&#039;, &#039;&#039;stat_cpu_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
===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 Netwerk-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-Commando.&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;
: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 anzuzeigende 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 eihentlichen 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;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6555</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6555"/>
		<updated>2014-06-12T21:02:36Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Readings-Werte mit Perl lesen */&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=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=42_SYSMON.pm&lt;br /&gt;
|ModOwner=hexenmeister / [http://forum.fhem.de/index.php?action=profile;u=4065 Hexenmeister]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[SYSMON]] Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung erstellt eine neue SYSMON-Instanz. Die Parameter M1 bis M4 legen die Aktualisierungsintervalle für verschiedenen Readings (Statistiken) fest. Die Parameter sind als Multiplikatoren für die Zeit, die durch INTERVAL_BASE definiert ist, zu verstehen. Da diese Zeit fest auf 60 Sekunden gesetzt ist, können die Mx-Parameters als Zeitintervalle in Minuten angesehen werden.&lt;br /&gt;
Wird einer (oder mehrere) Multiplikatoren auf Null gesetzt werden, wird das entsprechende Readings deaktiviert.&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
Die Parameter sind für die Aktualisierung der Readings nach folgender Schema zuständig:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M1&#039;&#039;&#039;: (Default-Wert: 1)&lt;br /&gt;
:CPU-Daten: &#039;&#039;cpu_freq&#039;&#039;, &#039;&#039;cpu_temp&#039;&#039;, &#039;&#039;cpu_temp_avg&#039;&#039;, &#039;&#039;loadavg&#039;&#039;, &#039;&#039;stat_cpu&#039;&#039;, &#039;&#039;stat_cpu_diff&#039;&#039;, &#039;&#039;stat_cpu_percent&#039;&#039;, &#039;&#039;stat_cpu_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
===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 Netwerk-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-Commando.&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;
: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 anzuzeigende 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 eihentlichen 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;
...to be continued...&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6554</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6554"/>
		<updated>2014-06-12T21:02:08Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Text-Ausgabe */&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=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=42_SYSMON.pm&lt;br /&gt;
|ModOwner=hexenmeister / [http://forum.fhem.de/index.php?action=profile;u=4065 Hexenmeister]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[SYSMON]] Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung erstellt eine neue SYSMON-Instanz. Die Parameter M1 bis M4 legen die Aktualisierungsintervalle für verschiedenen Readings (Statistiken) fest. Die Parameter sind als Multiplikatoren für die Zeit, die durch INTERVAL_BASE definiert ist, zu verstehen. Da diese Zeit fest auf 60 Sekunden gesetzt ist, können die Mx-Parameters als Zeitintervalle in Minuten angesehen werden.&lt;br /&gt;
Wird einer (oder mehrere) Multiplikatoren auf Null gesetzt werden, wird das entsprechende Readings deaktiviert.&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
Die Parameter sind für die Aktualisierung der Readings nach folgender Schema zuständig:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M1&#039;&#039;&#039;: (Default-Wert: 1)&lt;br /&gt;
:CPU-Daten: &#039;&#039;cpu_freq&#039;&#039;, &#039;&#039;cpu_temp&#039;&#039;, &#039;&#039;cpu_temp_avg&#039;&#039;, &#039;&#039;loadavg&#039;&#039;, &#039;&#039;stat_cpu&#039;&#039;, &#039;&#039;stat_cpu_diff&#039;&#039;, &#039;&#039;stat_cpu_percent&#039;&#039;, &#039;&#039;stat_cpu_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
===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 Netwerk-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-Commando.&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;
: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 anzuzeigende 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 eihentlichen 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;
-TODO-&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;
...to be continued...&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6553</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6553"/>
		<updated>2014-06-12T21:01:25Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Text-Ausgabe */&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=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=42_SYSMON.pm&lt;br /&gt;
|ModOwner=hexenmeister / [http://forum.fhem.de/index.php?action=profile;u=4065 Hexenmeister]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[SYSMON]] Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung erstellt eine neue SYSMON-Instanz. Die Parameter M1 bis M4 legen die Aktualisierungsintervalle für verschiedenen Readings (Statistiken) fest. Die Parameter sind als Multiplikatoren für die Zeit, die durch INTERVAL_BASE definiert ist, zu verstehen. Da diese Zeit fest auf 60 Sekunden gesetzt ist, können die Mx-Parameters als Zeitintervalle in Minuten angesehen werden.&lt;br /&gt;
Wird einer (oder mehrere) Multiplikatoren auf Null gesetzt werden, wird das entsprechende Readings deaktiviert.&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
Die Parameter sind für die Aktualisierung der Readings nach folgender Schema zuständig:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M1&#039;&#039;&#039;: (Default-Wert: 1)&lt;br /&gt;
:CPU-Daten: &#039;&#039;cpu_freq&#039;&#039;, &#039;&#039;cpu_temp&#039;&#039;, &#039;&#039;cpu_temp_avg&#039;&#039;, &#039;&#039;loadavg&#039;&#039;, &#039;&#039;stat_cpu&#039;&#039;, &#039;&#039;stat_cpu_diff&#039;&#039;, &#039;&#039;stat_cpu_percent&#039;&#039;, &#039;&#039;stat_cpu_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
===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 Netwerk-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-Commando.&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;
: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 anzuzeigende 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 eihentlichen 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 (see Weblink): 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;
-TODO-&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;
...to be continued...&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6552</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6552"/>
		<updated>2014-06-12T21:00:21Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* HTML-Ausgabe */&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=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=42_SYSMON.pm&lt;br /&gt;
|ModOwner=hexenmeister / [http://forum.fhem.de/index.php?action=profile;u=4065 Hexenmeister]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[SYSMON]] Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung erstellt eine neue SYSMON-Instanz. Die Parameter M1 bis M4 legen die Aktualisierungsintervalle für verschiedenen Readings (Statistiken) fest. Die Parameter sind als Multiplikatoren für die Zeit, die durch INTERVAL_BASE definiert ist, zu verstehen. Da diese Zeit fest auf 60 Sekunden gesetzt ist, können die Mx-Parameters als Zeitintervalle in Minuten angesehen werden.&lt;br /&gt;
Wird einer (oder mehrere) Multiplikatoren auf Null gesetzt werden, wird das entsprechende Readings deaktiviert.&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
Die Parameter sind für die Aktualisierung der Readings nach folgender Schema zuständig:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M1&#039;&#039;&#039;: (Default-Wert: 1)&lt;br /&gt;
:CPU-Daten: &#039;&#039;cpu_freq&#039;&#039;, &#039;&#039;cpu_temp&#039;&#039;, &#039;&#039;cpu_temp_avg&#039;&#039;, &#039;&#039;loadavg&#039;&#039;, &#039;&#039;stat_cpu&#039;&#039;, &#039;&#039;stat_cpu_diff&#039;&#039;, &#039;&#039;stat_cpu_percent&#039;&#039;, &#039;&#039;stat_cpu_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
===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 Netwerk-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-Commando.&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;
: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 anzuzeigende 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 eihentlichen 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;
-TODO-&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;
-TODO-&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;
...to be continued...&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6551</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6551"/>
		<updated>2014-06-12T20:59:15Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Attribute */&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=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=42_SYSMON.pm&lt;br /&gt;
|ModOwner=hexenmeister / [http://forum.fhem.de/index.php?action=profile;u=4065 Hexenmeister]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[SYSMON]] Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung erstellt eine neue SYSMON-Instanz. Die Parameter M1 bis M4 legen die Aktualisierungsintervalle für verschiedenen Readings (Statistiken) fest. Die Parameter sind als Multiplikatoren für die Zeit, die durch INTERVAL_BASE definiert ist, zu verstehen. Da diese Zeit fest auf 60 Sekunden gesetzt ist, können die Mx-Parameters als Zeitintervalle in Minuten angesehen werden.&lt;br /&gt;
Wird einer (oder mehrere) Multiplikatoren auf Null gesetzt werden, wird das entsprechende Readings deaktiviert.&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
Die Parameter sind für die Aktualisierung der Readings nach folgender Schema zuständig:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M1&#039;&#039;&#039;: (Default-Wert: 1)&lt;br /&gt;
:CPU-Daten: &#039;&#039;cpu_freq&#039;&#039;, &#039;&#039;cpu_temp&#039;&#039;, &#039;&#039;cpu_temp_avg&#039;&#039;, &#039;&#039;loadavg&#039;&#039;, &#039;&#039;stat_cpu&#039;&#039;, &#039;&#039;stat_cpu_diff&#039;&#039;, &#039;&#039;stat_cpu_percent&#039;&#039;, &#039;&#039;stat_cpu_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
===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 Netwerk-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-Commando.&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;
: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;
-TODO-&lt;br /&gt;
&lt;br /&gt;
===Text-Ausgabe===&lt;br /&gt;
-TODO-&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;
-TODO-&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;
...to be continued...&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6550</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6550"/>
		<updated>2014-06-12T20:59:00Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Attribute */&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=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=42_SYSMON.pm&lt;br /&gt;
|ModOwner=hexenmeister / [http://forum.fhem.de/index.php?action=profile;u=4065 Hexenmeister]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[SYSMON]] Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung erstellt eine neue SYSMON-Instanz. Die Parameter M1 bis M4 legen die Aktualisierungsintervalle für verschiedenen Readings (Statistiken) fest. Die Parameter sind als Multiplikatoren für die Zeit, die durch INTERVAL_BASE definiert ist, zu verstehen. Da diese Zeit fest auf 60 Sekunden gesetzt ist, können die Mx-Parameters als Zeitintervalle in Minuten angesehen werden.&lt;br /&gt;
Wird einer (oder mehrere) Multiplikatoren auf Null gesetzt werden, wird das entsprechende Readings deaktiviert.&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
Die Parameter sind für die Aktualisierung der Readings nach folgender Schema zuständig:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M1&#039;&#039;&#039;: (Default-Wert: 1)&lt;br /&gt;
:CPU-Daten: &#039;&#039;cpu_freq&#039;&#039;, &#039;&#039;cpu_temp&#039;&#039;, &#039;&#039;cpu_temp_avg&#039;&#039;, &#039;&#039;loadavg&#039;&#039;, &#039;&#039;stat_cpu&#039;&#039;, &#039;&#039;stat_cpu_diff&#039;&#039;, &#039;&#039;stat_cpu_percent&#039;&#039;, &#039;&#039;stat_cpu_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
===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 Netwerk-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-Commando.&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;
&lt;br /&gt;
Plots:&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;
: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;
-TODO-&lt;br /&gt;
&lt;br /&gt;
===Text-Ausgabe===&lt;br /&gt;
-TODO-&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;
-TODO-&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;
...to be continued...&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6549</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6549"/>
		<updated>2014-06-12T20:55:31Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Plots */&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=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=42_SYSMON.pm&lt;br /&gt;
|ModOwner=hexenmeister / [http://forum.fhem.de/index.php?action=profile;u=4065 Hexenmeister]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[SYSMON]] Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung erstellt eine neue SYSMON-Instanz. Die Parameter M1 bis M4 legen die Aktualisierungsintervalle für verschiedenen Readings (Statistiken) fest. Die Parameter sind als Multiplikatoren für die Zeit, die durch INTERVAL_BASE definiert ist, zu verstehen. Da diese Zeit fest auf 60 Sekunden gesetzt ist, können die Mx-Parameters als Zeitintervalle in Minuten angesehen werden.&lt;br /&gt;
Wird einer (oder mehrere) Multiplikatoren auf Null gesetzt werden, wird das entsprechende Readings deaktiviert.&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
Die Parameter sind für die Aktualisierung der Readings nach folgender Schema zuständig:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M1&#039;&#039;&#039;: (Default-Wert: 1)&lt;br /&gt;
:CPU-Daten: &#039;&#039;cpu_freq&#039;&#039;, &#039;&#039;cpu_temp&#039;&#039;, &#039;&#039;cpu_temp_avg&#039;&#039;, &#039;&#039;loadavg&#039;&#039;, &#039;&#039;stat_cpu&#039;&#039;, &#039;&#039;stat_cpu_diff&#039;&#039;, &#039;&#039;stat_cpu_percent&#039;&#039;, &#039;&#039;stat_cpu_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
===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;
-TODO-&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;
: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;
-TODO-&lt;br /&gt;
&lt;br /&gt;
===Text-Ausgabe===&lt;br /&gt;
-TODO-&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;
-TODO-&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;
...to be continued...&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6548</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6548"/>
		<updated>2014-06-12T20:53:43Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* set */&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=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=42_SYSMON.pm&lt;br /&gt;
|ModOwner=hexenmeister / [http://forum.fhem.de/index.php?action=profile;u=4065 Hexenmeister]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[SYSMON]] Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung erstellt eine neue SYSMON-Instanz. Die Parameter M1 bis M4 legen die Aktualisierungsintervalle für verschiedenen Readings (Statistiken) fest. Die Parameter sind als Multiplikatoren für die Zeit, die durch INTERVAL_BASE definiert ist, zu verstehen. Da diese Zeit fest auf 60 Sekunden gesetzt ist, können die Mx-Parameters als Zeitintervalle in Minuten angesehen werden.&lt;br /&gt;
Wird einer (oder mehrere) Multiplikatoren auf Null gesetzt werden, wird das entsprechende Readings deaktiviert.&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
Die Parameter sind für die Aktualisierung der Readings nach folgender Schema zuständig:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M1&#039;&#039;&#039;: (Default-Wert: 1)&lt;br /&gt;
:CPU-Daten: &#039;&#039;cpu_freq&#039;&#039;, &#039;&#039;cpu_temp&#039;&#039;, &#039;&#039;cpu_temp_avg&#039;&#039;, &#039;&#039;loadavg&#039;&#039;, &#039;&#039;stat_cpu&#039;&#039;, &#039;&#039;stat_cpu_diff&#039;&#039;, &#039;&#039;stat_cpu_percent&#039;&#039;, &#039;&#039;stat_cpu_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
===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;
-TODO-&lt;br /&gt;
&lt;br /&gt;
==Plots==&lt;br /&gt;
-TODO-&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;
-TODO-&lt;br /&gt;
&lt;br /&gt;
===Text-Ausgabe===&lt;br /&gt;
-TODO-&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;
-TODO-&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;
...to be continued...&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6547</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6547"/>
		<updated>2014-06-12T20:52:56Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* get */&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=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=42_SYSMON.pm&lt;br /&gt;
|ModOwner=hexenmeister / [http://forum.fhem.de/index.php?action=profile;u=4065 Hexenmeister]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[SYSMON]] Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung erstellt eine neue SYSMON-Instanz. Die Parameter M1 bis M4 legen die Aktualisierungsintervalle für verschiedenen Readings (Statistiken) fest. Die Parameter sind als Multiplikatoren für die Zeit, die durch INTERVAL_BASE definiert ist, zu verstehen. Da diese Zeit fest auf 60 Sekunden gesetzt ist, können die Mx-Parameters als Zeitintervalle in Minuten angesehen werden.&lt;br /&gt;
Wird einer (oder mehrere) Multiplikatoren auf Null gesetzt werden, wird das entsprechende Readings deaktiviert.&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
Die Parameter sind für die Aktualisierung der Readings nach folgender Schema zuständig:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M1&#039;&#039;&#039;: (Default-Wert: 1)&lt;br /&gt;
:CPU-Daten: &#039;&#039;cpu_freq&#039;&#039;, &#039;&#039;cpu_temp&#039;&#039;, &#039;&#039;cpu_temp_avg&#039;&#039;, &#039;&#039;loadavg&#039;&#039;, &#039;&#039;stat_cpu&#039;&#039;, &#039;&#039;stat_cpu_diff&#039;&#039;, &#039;&#039;stat_cpu_percent&#039;&#039;, &#039;&#039;stat_cpu_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
===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;
-TODO-&lt;br /&gt;
&lt;br /&gt;
==Attribute==&lt;br /&gt;
-TODO-&lt;br /&gt;
&lt;br /&gt;
==Plots==&lt;br /&gt;
-TODO-&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;
-TODO-&lt;br /&gt;
&lt;br /&gt;
===Text-Ausgabe===&lt;br /&gt;
-TODO-&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;
-TODO-&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;
...to be continued...&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6546</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6546"/>
		<updated>2014-06-12T20:51:54Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: /* Ausgabe-Beispiel */&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=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=42_SYSMON.pm&lt;br /&gt;
|ModOwner=hexenmeister / [http://forum.fhem.de/index.php?action=profile;u=4065 Hexenmeister]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[SYSMON]] Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung erstellt eine neue SYSMON-Instanz. Die Parameter M1 bis M4 legen die Aktualisierungsintervalle für verschiedenen Readings (Statistiken) fest. Die Parameter sind als Multiplikatoren für die Zeit, die durch INTERVAL_BASE definiert ist, zu verstehen. Da diese Zeit fest auf 60 Sekunden gesetzt ist, können die Mx-Parameters als Zeitintervalle in Minuten angesehen werden.&lt;br /&gt;
Wird einer (oder mehrere) Multiplikatoren auf Null gesetzt werden, wird das entsprechende Readings deaktiviert.&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
Die Parameter sind für die Aktualisierung der Readings nach folgender Schema zuständig:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M1&#039;&#039;&#039;: (Default-Wert: 1)&lt;br /&gt;
:CPU-Daten: &#039;&#039;cpu_freq&#039;&#039;, &#039;&#039;cpu_temp&#039;&#039;, &#039;&#039;cpu_temp_avg&#039;&#039;, &#039;&#039;loadavg&#039;&#039;, &#039;&#039;stat_cpu&#039;&#039;, &#039;&#039;stat_cpu_diff&#039;&#039;, &#039;&#039;stat_cpu_percent&#039;&#039;, &#039;&#039;stat_cpu_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
===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;
-TODO-&lt;br /&gt;
&lt;br /&gt;
===set===&lt;br /&gt;
-TODO-&lt;br /&gt;
&lt;br /&gt;
==Attribute==&lt;br /&gt;
-TODO-&lt;br /&gt;
&lt;br /&gt;
==Plots==&lt;br /&gt;
-TODO-&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;
-TODO-&lt;br /&gt;
&lt;br /&gt;
===Text-Ausgabe===&lt;br /&gt;
-TODO-&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;
-TODO-&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;
...to be continued...&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6499</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6499"/>
		<updated>2014-06-03T21:52:34Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das &#039;&#039;&#039;SYSMON&#039;&#039;&#039; Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
s.a. [http://fhem.de/commandref.html#SYSMON commandref].&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
&lt;br /&gt;
    define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&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;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
===Ausgabe-Beispiel===&lt;br /&gt;
-TODO-&lt;br /&gt;
&lt;br /&gt;
==Befehle==&lt;br /&gt;
&lt;br /&gt;
===get===&lt;br /&gt;
-TODO-&lt;br /&gt;
&lt;br /&gt;
===set===&lt;br /&gt;
-TODO-&lt;br /&gt;
&lt;br /&gt;
==Attribute==&lt;br /&gt;
-TODO-&lt;br /&gt;
&lt;br /&gt;
==Plots==&lt;br /&gt;
-TODO-&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;
-TODO-&lt;br /&gt;
&lt;br /&gt;
===Text-Ausgabe===&lt;br /&gt;
-TODO-&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;
-TODO-&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;
...to be continued...&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6498</id>
		<title>SYSMON</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SYSMON&amp;diff=6498"/>
		<updated>2014-06-03T21:49:37Z</updated>

		<summary type="html">&lt;p&gt;Hexenmeister: FHEM-Modul SYSMON&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das &#039;&#039;&#039;SYSMON&#039;&#039;&#039; Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
&lt;br /&gt;
    define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&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;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (texttuelle 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 Sekenden) 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 erleichten.&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 Kommanden, 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;
===Ausgabe-Beispiel===&lt;br /&gt;
-TODO-&lt;br /&gt;
&lt;br /&gt;
==Befehle==&lt;br /&gt;
&lt;br /&gt;
===get===&lt;br /&gt;
-TODO-&lt;br /&gt;
&lt;br /&gt;
===set===&lt;br /&gt;
-TODO-&lt;br /&gt;
&lt;br /&gt;
==Attribute==&lt;br /&gt;
-TODO-&lt;br /&gt;
&lt;br /&gt;
==Plots==&lt;br /&gt;
-TODO-&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;
-TODO-&lt;br /&gt;
&lt;br /&gt;
===Text-Ausgabe===&lt;br /&gt;
-TODO-&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;
-TODO-&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;
...to be continued...&lt;/div&gt;</summary>
		<author><name>Hexenmeister</name></author>
	</entry>
</feed>