<?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=LWith</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=LWith"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/LWith"/>
	<updated>2026-04-10T00:48:07Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-SEC-WIN_WinMatic&amp;diff=19386</id>
		<title>HM-SEC-WIN WinMatic</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-SEC-WIN_WinMatic&amp;diff=19386"/>
		<updated>2017-02-03T11:27:11Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Channel (Kanal) 01 Winmatic */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Features ==&lt;br /&gt;
Das Gerät dient zum motorgesteuerten Entriegeln, Öffnen (nur Kippen), Schließen und Verriegeln von Fenstern.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Der HM-SEC-WIN Winmatic  verwendet ausschließlich die AES authentifizierte Kommunikation.&lt;br /&gt;
&lt;br /&gt;
Das Pairing sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden. An der WinMatic muss dafür die Anlerntaste (Taste Schließen) betätigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Sicherheitshinweis ===&lt;br /&gt;
Wenn die WinMatic an einem aktiven HMLAN Konfigurator angelernt wurde, kann die entsprechende Tür per FHEM ver- / entriegelt bzw. geöffnet werden. Somit sollte das Netzwerk in dem FHEM läuft entsprechend gesichert sein. (Nicht nach Außen geöffnet, kein unsicheres WLAN usw.)&lt;br /&gt;
&lt;br /&gt;
Die Verwendung eines eigenen [[AES Encryption#Aktivieren.2C_Einrichten.2C_Umgang_in_FHEM|AES Sicherheitsschlüssels]] ist dringend anzuraten, da ansonsten eine WinMatic relativ einfach ferngesteuert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Channels (Kanäle) ==&lt;br /&gt;
=== Channel (Kanal) 01 Winmatic ===&lt;br /&gt;
Der Fensterantrieb wird folgendermaßen angesteuert&lt;br /&gt;
  set winmatic level #1 #2 #3&lt;br /&gt;
Dabei ist&lt;br /&gt;
; #1 : Die Position in %, die anzufahren ist&lt;br /&gt;
; #2 : Die Zeit in Sekunden, bis nach Anfahren der Position aus #1 das Fenster verschlossen und verriegelt wird. Statt der Sekundne kann durch &amp;quot;ignore&amp;quot; endlos angegeben werden.&lt;br /&gt;
; #3 : Geschwindigkeit des Motors in Prozent (0-100) für die Aktion&lt;br /&gt;
&lt;br /&gt;
Schließen geht mit&lt;br /&gt;
  set winmatic level 0 0 #3&lt;br /&gt;
Dabei ist &lt;br /&gt;
; #3 : Geschwindigkeit des Motors in Prozent (0-100) für die Aktion&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
  set winmatic level lock&lt;br /&gt;
wird nur verriegelt (mit der Standardgeschwindigkeit des Motors).&lt;br /&gt;
&lt;br /&gt;
=== Channel (Kanal) 02 Akku ===&lt;br /&gt;
Der Akku hat folgende Readings&lt;br /&gt;
;charge : ob geladen oder entladen wird&lt;br /&gt;
;recentStateType&lt;br /&gt;
;state :der Ladezustrand des Akkus&lt;br /&gt;
&lt;br /&gt;
== Mögliche Zustände ==&lt;br /&gt;
WinMatic hat folgende Schaltzustände:&lt;br /&gt;
;locked : Das Fenster ist geschlossen und verriegelt.&lt;br /&gt;
;unlocked : Das Fenster ist entriegelt.&lt;br /&gt;
;0-100 : Das Fenster ist zu dem Prozentsatz gekippt (im Verhälntnis zum maximalen Kippwinkel)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Anleitung [https://files.elv.com/service/manuals/73472_HM_WinMatic_GE_um.pdf] PDF&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Fenstersteuerung]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DOIF/Labor_-_ausf%C3%BChrbare,_praxisnahe_Beispiele_als_Probleml%C3%B6sung_zum_Experimentieren&amp;diff=19295</id>
		<title>DOIF/Labor - ausführbare, praxisnahe Beispiele als Problemlösung zum Experimentieren</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DOIF/Labor_-_ausf%C3%BChrbare,_praxisnahe_Beispiele_als_Probleml%C3%B6sung_zum_Experimentieren&amp;diff=19295"/>
		<updated>2017-02-02T13:16:26Z</updated>

		<summary type="html">&lt;p&gt;LWith: LWith verschob die Seite DOIF/Labor - ausführbare, praxisnahe Beispiele als Problemlösung zum Experimetieren nach DOIF/Labor - ausführbare, praxisnahe Beispiele als Problemlösung zum Experimentieren: Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Randnotiz|RNTyp=g|RNText=Eine aktuelle DOIF-Version ist erforderlich}}&amp;lt;br&amp;gt;&lt;br /&gt;
==Zusammenfassung==&lt;br /&gt;
Das DOIF-Labor fasst praxisnahe Beispiele in dem FHEM-Raum &#039;&#039;&#039;DOIF_Labor&#039;&#039;&#039; zusammen. Alle Beispiele sind so aufbereitet, dass sie über &#039;&#039;&#039;Raw definition&#039;&#039;&#039; ausführbar importiert werden können. Jedes Beispiel einschliesslich der dazugehörenden Geräte wird einer FHEM-Gruppe zugeordnet, der Laborgruppe. Das DOIF-Labor kann komplett und die Laborgruppen können einzeln importiert werden. Die Beispiele können die Grundlage für eigene Problemlösungen sein. Experimente mit den Beispielen und Übungen sollen helfen DOIF mit seinen Möglichkeiten besser kennenzulernen.&lt;br /&gt;
==Nutzungshinweise==&lt;br /&gt;
Das Labor kann komplett oder gruppenweise importiert werden, siehe [[DOIF/Import von Code Snippets]].&lt;br /&gt;
Die Namen definierter Geräte enden auf &#039;&#039;&#039;_Labor&#039;&#039;&#039;, ggf. mit einer nachfolgenden Nummer und die Laborgruppen beginnen mit &#039;&#039;&#039;Labor: &#039;&#039;&#039;, damit sollen Namenskonflikte mit bestehenden Geräten reduziert werden. Durch Umbenennen betroffener Gerät im Import-Code, können Namenskonflikte vermieden werden.&lt;br /&gt;
Das Labor befindet sich im Raum &amp;quot;DOIF_Labor&amp;quot; und kann komplett oder gruppenweise gelöscht werden.&lt;br /&gt;
* Gruppe löschen mit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	delete group=&amp;lt;Gruppenname&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Komplette Löschung mit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	delete room=DOIF_Labor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der im Browser geöffneten Raumansicht des DOIF_Labor können die Beispiele bedient werden.&amp;lt;br&amp;gt;&lt;br /&gt;
In einem zweiten Browserfenster könnte die Geräteansicht des DOIF geöffnet werden, dann ist das Verhalten des DOIF als Reaktion auf die Bedienung gleichzeitig zu beobachten, falls die Browserfenster nebeneinander liegen.&lt;br /&gt;
&lt;br /&gt;
==Links zu den Laborgruppen==&lt;br /&gt;
===Operatorenrangfolge===&lt;br /&gt;
[[DOIF/Operatorenrangfolge]]&lt;br /&gt;
===Mehrfachnutzung eines Tasters===&lt;br /&gt;
[[DOIF/Mehrfachnutzung eines Tasters]]&lt;br /&gt;
===Zeitgeber===&lt;br /&gt;
[[DOIF/Zeitgeber]] Wecker, Kurzzeitwecker, Tageszeitgeber&lt;br /&gt;
===Zeitsteuerung mit manuell Ein/Aus===&lt;br /&gt;
[[DOIF/Ein- und Ausgabe in FHEMWEB und Tablet-UI am Beispiel einer Schaltuhr]]&lt;br /&gt;
=== Datumsbereich von HH:MM dd.mm.yyyy bis HH:MM dd.mm.yyyy schalten===&lt;br /&gt;
[[DOIF/Zeitspanne zwischen zwei Terminen schalten]]&lt;br /&gt;
===Zeitspanne im DOIF und disableForIntervals im Vergleich===&lt;br /&gt;
[[DOIF/Zeitspanne im DOIF und disableForIntervals im Vergleich]]&lt;br /&gt;
===partielle Deaktivierung der Befehlsausführung===&lt;br /&gt;
[[DOIF/partielle Deaktivierung der Befehlsausführung, Zurücksetzen eines Wait-Timers mit $SELF oder IsDisabled verhindern, im Vergleich]]&lt;br /&gt;
&lt;br /&gt;
==Das komplette Labor zum Importieren==&lt;br /&gt;
Die Definitionen sind zum den direkten Import über &#039;&#039;&#039;[[DOIF/Import_von_Code_Snippets|Raw definition]]&#039;&#039;&#039; vorbereitet.&amp;lt;br&amp;gt;&lt;br /&gt;
Zum Update muss ein vorhandenes Labor gelöscht werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Nach dem Import, die Änderungen an FHEM mit &#039;&#039;&#039;save&#039;&#039;&#039; übernehmen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Heizperiode_Labor DOIF ([00:01] and [?$SELF:P_dbegin] eq &amp;quot;$month-$mday&amp;quot; or [$SELF:P_einaus,&amp;quot;auto&amp;quot;] eq &amp;quot;on&amp;quot;)\&lt;br /&gt;
   ({Log 1, &amp;quot;Heizperiode an&amp;quot;})\&lt;br /&gt;
DOELSEIF ([00:01] and [?$SELF:P_dende] eq &amp;quot;$month-$mday&amp;quot; or [$SELF:P_einaus,&amp;quot;auto&amp;quot;] eq &amp;quot;off&amp;quot; or [&amp;quot;^global$:^MODIFIED $SELF$&amp;quot;])\&lt;br /&gt;
   ({Log 1, &amp;quot;Heizperiode aus&amp;quot;})&lt;br /&gt;
attr Heizperiode_Labor alias Heizperiode&lt;br /&gt;
attr Heizperiode_Labor cmdState 1|0&lt;br /&gt;
attr Heizperiode_Labor group Labor: Heizperiode&lt;br /&gt;
attr Heizperiode_Labor icon time_calendar&lt;br /&gt;
attr Heizperiode_Labor readingList P_einaus P_begin P_ende&lt;br /&gt;
attr Heizperiode_Labor room DOIF_Labor&lt;br /&gt;
attr Heizperiode_Labor setList P_einaus:uzsuSelectRadio,auto,on,off P_begin:datetime,theme:&amp;quot;default&amp;quot;,inline:true,timepicker:false P_ende:datetime,theme:&amp;quot;default&amp;quot;,inline:true,timepicker:false&lt;br /&gt;
attr Heizperiode_Labor userReadings P_dbegin:P_begin.* {\&lt;br /&gt;
    my ($d,$m,$y,$hm) = split(/\.| /,ReadingsVal($name,&amp;quot;P_begin&amp;quot;,&amp;quot;none&amp;quot;));;\&lt;br /&gt;
    return int($m).&amp;quot;-&amp;quot;.int($d);;\&lt;br /&gt;
},\&lt;br /&gt;
P_dende:P_ende.* {\&lt;br /&gt;
    my ($d,$m,$y,$hm) = split(/\.| /,ReadingsVal($name,&amp;quot;P_ende&amp;quot;,&amp;quot;none&amp;quot;));;\&lt;br /&gt;
    return int($m).&amp;quot;-&amp;quot;.int($d);;\&lt;br /&gt;
}\&lt;br /&gt;
&lt;br /&gt;
attr Heizperiode_Labor webCmd P_einaus:P_begin:P_ende&lt;br /&gt;
attr Heizperiode_Labor widgetOverride setList:textField-long&lt;br /&gt;
&lt;br /&gt;
define battState_Labor DOIF ([&amp;quot;:^battery: low&amp;quot;] and [?$SELF:BATT$DEVICE,&amp;quot;init&amp;quot;] ne &amp;quot;low&amp;quot;)\&lt;br /&gt;
   (setreading $SELF msg {((AttrVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;alias&amp;quot;,&amp;quot;&amp;quot;) ? AttrVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;alias&amp;quot;,&amp;quot;&amp;quot;) : &amp;quot;$DEVICE&amp;quot;).&amp;quot; Battery is low&amp;quot;)}, {Log 1,((AttrVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;alias&amp;quot;,&amp;quot;&amp;quot;) ? AttrVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;alias&amp;quot;,&amp;quot;&amp;quot;) : &amp;quot;$DEVICE&amp;quot;).&amp;quot; Battery is low&amp;quot;)},setreading $SELF BATT$DEVICE low)\&lt;br /&gt;
DOELSEIF ([&amp;quot;:^battery: ok&amp;quot;] and [?$SELF:BATT$DEVICE,&amp;quot;init&amp;quot;] ne &amp;quot;ok&amp;quot;)\&lt;br /&gt;
   (setreading $SELF BATT$DEVICE ok, setreading $SELF msg -)&lt;br /&gt;
attr battState_Labor alias einmal Statusmeldung je Gerät für [&amp;quot;&amp;amp;lt;;Regex&amp;amp;gt;;:^battery: low&amp;quot;] mit autom. Rücksetzung&lt;br /&gt;
attr battState_Labor do always&lt;br /&gt;
attr battState_Labor group Labor: Statusabfragen&lt;br /&gt;
attr battState_Labor room DOIF_Labor&lt;br /&gt;
attr battState_Labor stateFormat msg&lt;br /&gt;
setstate battState_Labor 2016-11-26 16:27:25 P_Link_zur_Commandref &amp;lt;html&amp;gt;&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events&amp;quot;&amp;gt;s. Bsp. Batteriewarnung&amp;lt;/a&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
define button_Labor000 dummy&lt;br /&gt;
attr button_Labor000 alias Taster&lt;br /&gt;
attr button_Labor000 group Labor: Mehrfachnutzung eines Tasters&lt;br /&gt;
attr button_Labor000 room DOIF_Labor&lt;br /&gt;
attr button_Labor000 setList short long&lt;br /&gt;
attr button_Labor000 webCmd short:long&lt;br /&gt;
&lt;br /&gt;
define datumsbereich_Labor0 DOIF ([[$SELF:P_bhm,&amp;quot;00:00&amp;quot;]|8] and [?$SELF:P_dbegin] eq &amp;quot;$year-$month-$mday&amp;quot;)\&lt;br /&gt;
   ({Log 1, &amp;quot;Alarmstart&amp;quot;})\&lt;br /&gt;
DOELSEIF ([[$SELF:P_ehm,&amp;quot;00:00&amp;quot;]] and [?$SELF:P_dende] eq &amp;quot;$year-$month-$mday&amp;quot; or [&amp;quot;^global$:^MODIFIED $SELF$&amp;quot;])\&lt;br /&gt;
   ({Log 1, &amp;quot;Alarmstop&amp;quot;})&lt;br /&gt;
attr datumsbereich_Labor0 alias Terminspanne&lt;br /&gt;
attr datumsbereich_Labor0 cmdState 1|0&lt;br /&gt;
attr datumsbereich_Labor0 group Labor: Datumsbereich von HH:MM dd.mm.yyyy bis HH:MM dd.mm.yyyy ohne datetimepicker Widget&lt;br /&gt;
attr datumsbereich_Labor0 icon time_calendar&lt;br /&gt;
attr datumsbereich_Labor0 readingList P_bhm P_bday P_bmon P_byear P_ehm P_eday P_emon P_eyear&lt;br /&gt;
attr datumsbereich_Labor0 room DOIF_Labor&lt;br /&gt;
attr datumsbereich_Labor0 setList P_bhm:time P_bday:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 P_bmon:1,2,3,4,5,6,7,8,9,10,11,12 P_byear:2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026 P_ehm:time P_eday:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 P_emon:1,2,3,4,5,6,7,8,9,10,11,12 P_eyear:2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026&lt;br /&gt;
attr datumsbereich_Labor0 userReadings P_dbegin:P_b(year|mon|day).* {\&lt;br /&gt;
   return ReadingsVal($name,&amp;quot;P_byear&amp;quot;,&amp;quot;none&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($name,&amp;quot;P_bmon&amp;quot;,&amp;quot;none&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($name,&amp;quot;P_bday&amp;quot;,&amp;quot;none&amp;quot;);;\&lt;br /&gt;
}, \&lt;br /&gt;
P_dende:P_e(year|mon|day).* {\&lt;br /&gt;
return ReadingsVal($name,&amp;quot;P_eyear&amp;quot;,&amp;quot;none&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($name,&amp;quot;P_emon&amp;quot;,&amp;quot;none&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($name,&amp;quot;P_eday&amp;quot;,&amp;quot;none&amp;quot;);;\&lt;br /&gt;
}&lt;br /&gt;
attr datumsbereich_Labor0 webCmd P_bhm:P_bday:P_bmon:P_byear:P_ehm:P_eday:P_emon:P_eyear&lt;br /&gt;
attr datumsbereich_Labor0 widgetOverride setList:textField-long&lt;br /&gt;
&lt;br /&gt;
define datumsbereich_Labor1 DOIF ([[$SELF:P_bhm,&amp;quot;00:00&amp;quot;]] and [?$SELF:P_dbegin] eq &amp;quot;$year-$month-$mday&amp;quot;)\&lt;br /&gt;
   ({Log 1, &amp;quot;Alarmstart&amp;quot;})\&lt;br /&gt;
DOELSEIF ([[$SELF:P_ehm,&amp;quot;00:00&amp;quot;]] and [?$SELF:P_dende] eq &amp;quot;$year-$month-$mday&amp;quot; or [&amp;quot;^global$:^MODIFIED $SELF$&amp;quot;])\&lt;br /&gt;
   ({Log 1, &amp;quot;Alarmstop&amp;quot;})&lt;br /&gt;
attr datumsbereich_Labor1 alias Terminspanne über Jahre,Monate und Tage&lt;br /&gt;
attr datumsbereich_Labor1 cmdState 1|0&lt;br /&gt;
attr datumsbereich_Labor1 group Labor: Datumsbereich von HH:MM dd.mm.yyyy bis HH:MM dd.mm.yyyy&lt;br /&gt;
attr datumsbereich_Labor1 icon time_calendar&lt;br /&gt;
attr datumsbereich_Labor1 readingList P_begin P_ende&lt;br /&gt;
attr datumsbereich_Labor1 room DOIF_Labor&lt;br /&gt;
attr datumsbereich_Labor1 setList P_begin:datetime,theme:&amp;quot;default&amp;quot;,step:5,inline:true P_ende:datetime,theme:&amp;quot;default&amp;quot;,step:5,inline:true&lt;br /&gt;
attr datumsbereich_Labor1 userReadings P_bhm:P_begin.* {\&lt;br /&gt;
    my ($d,$m,$y,$hm) = split(/\.| /,ReadingsVal($name,&amp;quot;P_begin&amp;quot;,&amp;quot;none&amp;quot;));;\&lt;br /&gt;
    return $hm;;\&lt;br /&gt;
},\&lt;br /&gt;
P_dbegin:P_begin.* {\&lt;br /&gt;
    my ($d,$m,$y,$hm) = split(/\.| /,ReadingsVal($name,&amp;quot;P_begin&amp;quot;,&amp;quot;none&amp;quot;));;\&lt;br /&gt;
    return $y.&amp;quot;-&amp;quot;.int($m).&amp;quot;-&amp;quot;.int($d);;\&lt;br /&gt;
},\&lt;br /&gt;
P_ehm:P_ende.* {\&lt;br /&gt;
    my ($d,$m,$y,$hm) = split(/\.| /,ReadingsVal($name,&amp;quot;P_ende&amp;quot;,&amp;quot;none&amp;quot;));;\&lt;br /&gt;
    return $hm;;\&lt;br /&gt;
},\&lt;br /&gt;
P_dende:P_ende.* {\&lt;br /&gt;
    my ($d,$m,$y,$hm) = split(/\.| /,ReadingsVal($name,&amp;quot;P_ende&amp;quot;,&amp;quot;none&amp;quot;));;\&lt;br /&gt;
    return $y.&amp;quot;-&amp;quot;.int($m).&amp;quot;-&amp;quot;.int($d);;\&lt;br /&gt;
}\&lt;br /&gt;
&lt;br /&gt;
attr datumsbereich_Labor1 webCmd P_begin:P_ende&lt;br /&gt;
attr datumsbereich_Labor1 widgetOverride setList:textField-long&lt;br /&gt;
&lt;br /&gt;
define kurzzeitwecker_Labor DOIF ([$SELF:P_weckzeit,0])\&lt;br /&gt;
DOELSEIF ([+([$SELF:P_weckzeit,1] * 60)]) ## (set &amp;lt;Gerätename&amp;gt; &amp;lt;gerätespezifische Angaben&amp;gt;)&lt;br /&gt;
attr kurzzeitwecker_Labor alias Kurzzeitwecker&lt;br /&gt;
attr kurzzeitwecker_Labor cmdState warten|alarm&lt;br /&gt;
attr kurzzeitwecker_Labor group Labor: Zeitgeber&lt;br /&gt;
attr kurzzeitwecker_Labor readingList P_weckzeit&lt;br /&gt;
attr kurzzeitwecker_Labor room DOIF_Labor&lt;br /&gt;
attr kurzzeitwecker_Labor setList P_weckzeit:0,1,2,3,4,5,6,7,8,9,10,15,20,25,30,35,40,45,50,55,60&lt;br /&gt;
attr kurzzeitwecker_Labor webCmd P_weckzeit&lt;br /&gt;
&lt;br /&gt;
define lamp1_Labor000 dummy&lt;br /&gt;
attr lamp1_Labor000 alias Lampe1&lt;br /&gt;
attr lamp1_Labor000 group Labor: Mehrfachnutzung eines Tasters&lt;br /&gt;
attr lamp1_Labor000 room DOIF_Labor&lt;br /&gt;
&lt;br /&gt;
define lamp2_Labor000 dummy&lt;br /&gt;
attr lamp2_Labor000 alias Lampe2&lt;br /&gt;
attr lamp2_Labor000 group Labor: Mehrfachnutzung eines Tasters&lt;br /&gt;
attr lamp2_Labor000 room DOIF_Labor&lt;br /&gt;
&lt;br /&gt;
define lamp_Labor000 dummy&lt;br /&gt;
attr lamp_Labor000 alias Lampe&lt;br /&gt;
attr lamp_Labor000 group Labor: Zeitsteuerung mit manuell Ein/Aus&lt;br /&gt;
attr lamp_Labor000 room DOIF_Labor&lt;br /&gt;
&lt;br /&gt;
define operatorenRang_Labor1 DOIF (([$SELF1:A] or [$SELF1:B]) and [$SELF1:C]) ## operatorenRang_Labor2 operatorenRang_Labor11&lt;br /&gt;
attr operatorenRang_Labor1 alias c) (A or B) and C&lt;br /&gt;
attr operatorenRang_Labor1 cmdState Bedingung wahr|Bedingung falsch&lt;br /&gt;
attr operatorenRang_Labor1 group Labor: Operatorenrangfolge&lt;br /&gt;
attr operatorenRang_Labor1 room DOIF_Labor&lt;br /&gt;
&lt;br /&gt;
define operatorenRang_Labor11 DOIF ([$SELF:A,0] or [$SELF:B,0] and [$SELF:C,0]) ## operatorenRang_Labor1 operatorenRang_Labor2&lt;br /&gt;
attr operatorenRang_Labor11 alias a) A or B and C&lt;br /&gt;
attr operatorenRang_Labor11 cmdState Bedingung wahr|Bedingung falsch&lt;br /&gt;
attr operatorenRang_Labor11 group Labor: Operatorenrangfolge&lt;br /&gt;
attr operatorenRang_Labor11 readingList A B C&lt;br /&gt;
attr operatorenRang_Labor11 room DOIF_Labor&lt;br /&gt;
attr operatorenRang_Labor11 setList A:0,#,null,1,-1,eins B:0,#,null,1,-1,eins C:0,#,null,1,-1,eins&lt;br /&gt;
attr operatorenRang_Labor11 webCmd A:B:C&lt;br /&gt;
&lt;br /&gt;
define operatorenRang_Labor2 DOIF ([operatorenRang_Labor11:A] || [operatorenRang_Labor11:B] and [operatorenRang_Labor11:C]) ## operatorenRang_Labor1 operatorenRang_Labor3 operatorenRang_Labor11&lt;br /&gt;
attr operatorenRang_Labor2 alias b) A || B and C&lt;br /&gt;
attr operatorenRang_Labor2 cmdState Bedingung wahr|Bedingung falsch&lt;br /&gt;
attr operatorenRang_Labor2 group Labor: Operatorenrangfolge&lt;br /&gt;
attr operatorenRang_Labor2 room DOIF_Labor&lt;br /&gt;
&lt;br /&gt;
define operatorenRang_Labor3 DOIF ([operatorenRang_Labor11:A] =~ &amp;quot;ein|1&amp;quot;) ## operatorenRang_Labor1 operatorenRang_Labor2 operatorenRang_Labor11&lt;br /&gt;
attr operatorenRang_Labor3 alias d) A =~ &amp;quot;ein|1&amp;quot;&lt;br /&gt;
attr operatorenRang_Labor3 cmdState Bedingung wahr|Bedingung falsch&lt;br /&gt;
attr operatorenRang_Labor3 group Labor: Operatorenrangfolge&lt;br /&gt;
attr operatorenRang_Labor3 room DOIF_Labor&lt;br /&gt;
&lt;br /&gt;
define schrittSchalter_Labor001 DOIF ## 1 \&lt;br /&gt;
([&amp;quot;button_Labor000:short&amp;quot;] and $cmd=~&amp;quot;0|4&amp;quot;) \&lt;br /&gt;
   (set lamp1_Labor000 on)\&lt;br /&gt;
## 2\&lt;br /&gt;
DOELSEIF ([&amp;quot;button_Labor000:short&amp;quot;] and $cmd==1) \&lt;br /&gt;
   (set lamp2_Labor000 on, set lamp1_Labor000 off)\&lt;br /&gt;
## 3\&lt;br /&gt;
DOELSEIF ([&amp;quot;button_Labor000:short&amp;quot;] and $cmd==2) \&lt;br /&gt;
   (set lamp(1|2)_Labor000 on)\&lt;br /&gt;
## 4\&lt;br /&gt;
DOELSEIF ([&amp;quot;button_Labor000:short&amp;quot;] and $cmd==3) \&lt;br /&gt;
   (set lamp(1|2)_Labor000 off)&lt;br /&gt;
attr schrittSchalter_Labor001 alias Schrittschalter&lt;br /&gt;
attr schrittSchalter_Labor001 cmdState Schritt 1|Schritt 2|Schritt 3|Schritt 4&lt;br /&gt;
attr schrittSchalter_Labor001 group Labor: Mehrfachnutzung eines Tasters&lt;br /&gt;
attr schrittSchalter_Labor001 room DOIF_Labor&lt;br /&gt;
&lt;br /&gt;
define statusBattWndw_Labor0 dummy&lt;br /&gt;
attr statusBattWndw_Labor0 alias Fenstersensor&lt;br /&gt;
attr statusBattWndw_Labor0 group Labor: Statusabfragen&lt;br /&gt;
attr statusBattWndw_Labor0 readingList battery&lt;br /&gt;
attr statusBattWndw_Labor0 room DOIF_Labor&lt;br /&gt;
attr statusBattWndw_Labor0 setList battery:ok,low&lt;br /&gt;
attr statusBattWndw_Labor0 stateFormat Batterie: battery&lt;br /&gt;
attr statusBattWndw_Labor0 webCmd battery ok:battery low&lt;br /&gt;
&lt;br /&gt;
define statusBattWndw_Labor1 dummy&lt;br /&gt;
attr statusBattWndw_Labor1 group Labor: Statusabfragen&lt;br /&gt;
attr statusBattWndw_Labor1 readingList battery&lt;br /&gt;
attr statusBattWndw_Labor1 room DOIF_Labor&lt;br /&gt;
attr statusBattWndw_Labor1 setList battery:ok,low&lt;br /&gt;
attr statusBattWndw_Labor1 stateFormat Batterie: battery&lt;br /&gt;
attr statusBattWndw_Labor1 webCmd battery ok:battery low&lt;br /&gt;
&lt;br /&gt;
define tageszeit_Labor DOIF ([[$SELF:P_morgens,&amp;quot;06:00&amp;quot;]])\&lt;br /&gt;
DOELSEIF ([[$SELF:P_vormittags,&amp;quot;09:00&amp;quot;]])\&lt;br /&gt;
DOELSEIF ([[$SELF:P_mittags,&amp;quot;12:00&amp;quot;]])\&lt;br /&gt;
DOELSEIF ([[$SELF:P_nachmittags,&amp;quot;14:00&amp;quot;]])\&lt;br /&gt;
DOELSEIF ([[$SELF:P_abends,&amp;quot;18:00&amp;quot;]])\&lt;br /&gt;
DOELSEIF ([[$SELF:P_nachts,&amp;quot;22:00&amp;quot;]])&lt;br /&gt;
attr tageszeit_Labor alias einstellbarer Zeitgeber Tageszeit&lt;br /&gt;
attr tageszeit_Labor cmdState morgens|vormittags|mittags|nachmittags|abends|nachts&lt;br /&gt;
attr tageszeit_Labor group Labor: Zeitgeber&lt;br /&gt;
attr tageszeit_Labor readingList P_morgens P_vormittags P_mittags P_nachmittags P_abends P_nachts&lt;br /&gt;
attr tageszeit_Labor room DOIF_Labor&lt;br /&gt;
attr tageszeit_Labor setList P_morgens:time P_vormittags:time P_mittags:time P_nachmittags:time P_abends:time P_nachts:time&lt;br /&gt;
attr tageszeit_Labor webCmd P_morgens:P_vormittags:P_mittags:P_nachmittags:P_abends:P_nachts&lt;br /&gt;
&lt;br /&gt;
define time_switch_Labor DOIF ([&amp;quot;$SELF:P_mybutton: on&amp;quot;] or [[$SELF:P_mybegin,&amp;quot;00:00&amp;quot;]])\&lt;br /&gt;
   (set lamp_Labor000 on)\&lt;br /&gt;
DOELSEIF ([&amp;quot;$SELF:P_mybutton: off&amp;quot;] or [[$SELF:P_myend,&amp;quot;00:01&amp;quot;]])\&lt;br /&gt;
   (set lamp_Labor000 off)&lt;br /&gt;
attr time_switch_Labor alias Schaltuhr&lt;br /&gt;
attr time_switch_Labor cmdState on|off&lt;br /&gt;
attr time_switch_Labor group Labor: Zeitsteuerung mit manuell Ein/Aus&lt;br /&gt;
attr time_switch_Labor readingList P_mybutton P_mybegin P_myend&lt;br /&gt;
attr time_switch_Labor room DOIF_Labor&lt;br /&gt;
attr time_switch_Labor setList P_mybutton:uzsuSelectRadio,on,off P_mybegin:time P_myend:time&lt;br /&gt;
attr time_switch_Labor webCmd P_mybutton:P_mybegin:P_myend&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
defmod rg_time_switch_Labor readingsGroup time_switch_Labor:+STATE,&amp;lt;P_mybutton&amp;gt;,P_mybutton,&amp;lt;P_mybegin&amp;gt;,P_mybegin,&amp;lt;P_myend&amp;gt;,P_myend&lt;br /&gt;
attr rg_time_switch_Labor commands {&amp;quot;P_mybutton&amp;quot;=&amp;gt;&amp;quot;P_mybutton:&amp;quot;,&amp;quot;P_mybegin&amp;quot;=&amp;gt;&amp;quot;P_mybegin:&amp;quot;,&amp;quot;P_myend&amp;quot;=&amp;gt;&amp;quot;P_myend:&amp;quot;,}&lt;br /&gt;
attr rg_time_switch_Labor group Labor: Zeitsteuerung mit manuell Ein/Aus&lt;br /&gt;
attr rg_time_switch_Labor noheading 1&lt;br /&gt;
attr rg_time_switch_Labor room DOIF_Labor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
define wecker_Labor DOIF ([$SELF:P_einaus,&amp;quot;off&amp;quot;] eq &amp;quot;on&amp;quot; and [[$SELF:P_weckzeit,&amp;quot;12:00&amp;quot;]]) ## (&amp;lt;Befehle&amp;gt;)&lt;br /&gt;
attr wecker_Labor alias Wecker&lt;br /&gt;
attr wecker_Labor do always&lt;br /&gt;
attr wecker_Labor group Labor: Zeitgeber&lt;br /&gt;
attr wecker_Labor readingList P_einaus P_weckzeit&lt;br /&gt;
attr wecker_Labor room DOIF_Labor&lt;br /&gt;
attr wecker_Labor setList P_einaus:uzsuSelectRadio,on,off P_weckzeit:time&lt;br /&gt;
attr wecker_Labor webCmd P_einaus:P_weckzeit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
define using_disabledForIntervals_Labor DOIF ## 1\&lt;br /&gt;
([$SELF:mybutton] == 1 and !IsDisabled(&amp;quot;$SELF&amp;quot;)) \&lt;br /&gt;
   ({Log 1, &amp;quot;Befehl 1&amp;quot;})\&lt;br /&gt;
## 2\&lt;br /&gt;
DOELSEIF ([$SELF:mybutton] == 2 and !IsDisabled(&amp;quot;$SELF&amp;quot;))\&lt;br /&gt;
   ({Log 1, &amp;quot;Befehl 2&amp;quot;})&lt;br /&gt;
attr using_disabledForIntervals_Labor userattr disabledForIntervals&lt;br /&gt;
attr using_disabledForIntervals_Labor alias Nutzung von Attribut disabledForIntervals und IsDisabled-Funktion&lt;br /&gt;
attr using_disabledForIntervals_Labor cmdState Befehl 1|Befehl 2&lt;br /&gt;
attr using_disabledForIntervals_Labor disabledForIntervals 13:00-14:00&lt;br /&gt;
attr using_disabledForIntervals_Labor group Labor: state inactive Funktion IsDisabled und disabledForIntervals&lt;br /&gt;
attr using_disabledForIntervals_Labor readingList mybutton&lt;br /&gt;
attr using_disabledForIntervals_Labor room DOIF_Labor&lt;br /&gt;
attr using_disabledForIntervals_Labor setList mybutton:0,1,2&lt;br /&gt;
attr using_disabledForIntervals_Labor webCmd mybutton&lt;br /&gt;
&lt;br /&gt;
setstate using_disabledForIntervals_Labor 2016-12-08 20:26:55 mybutton 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
define using_time_spanpan_Labor DOIF ## 1\&lt;br /&gt;
([$SELF:mybutton] == 1 and ![?13:00-14:00]) \&lt;br /&gt;
   ({Log 1, &amp;quot;Befehl 1&amp;quot;})\&lt;br /&gt;
## 2\&lt;br /&gt;
DOELSEIF ([$SELF:mybutton] == 2 and ![?13:00-14:00])\&lt;br /&gt;
   ({Log 1, &amp;quot;Befehl 2&amp;quot;})&lt;br /&gt;
attr using_time_spanpan_Labor alias Nutzung einer Zeitspanne zur zeitlichen Befehlseinschränkung,&amp;lt;br&amp;gt; die ursprüngliche DOIF Funktionalität&lt;br /&gt;
attr using_time_spanpan_Labor cmdState Befehl 1|Befehl 2&lt;br /&gt;
attr using_time_spanpan_Labor group Labor: state inactive Funktion IsDisabled und disabledForIntervals&lt;br /&gt;
attr using_time_spanpan_Labor readingList mybutton&lt;br /&gt;
attr using_time_spanpan_Labor room DOIF_Labor&lt;br /&gt;
attr using_time_spanpan_Labor setList mybutton:0,1,2&lt;br /&gt;
attr using_time_spanpan_Labor webCmd mybutton&lt;br /&gt;
&lt;br /&gt;
setstate using_time_spanpan_Labor 2016-12-08 23:33:47 mybutton 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
define using_inactive_Labor DOIF ## 1\&lt;br /&gt;
([$SELF:mybutton] == 1) \&lt;br /&gt;
   ({Log 1, &amp;quot;Befehl 1_1 gegen Zurücksetzen des wait geschützt&amp;quot;})\&lt;br /&gt;
   ({Log 1, &amp;quot;Befehl 1_2 gegen Zurücksetzen des wait geschützt&amp;quot;})\&lt;br /&gt;
   ({Log 1, &amp;quot;Befehl 1&amp;quot;})\&lt;br /&gt;
## 2\&lt;br /&gt;
DOELSEIF ([$SELF:mybutton] == 2 and !IsDisabled(&amp;quot;$SELF&amp;quot;)) \&lt;br /&gt;
   ({Log 1, &amp;quot;Befehl 2&amp;quot;})&lt;br /&gt;
attr using_inactive_Labor alias Nutzung von state inactive und IsDisabled-Funktion&amp;lt;br&amp;gt;Zurücksetzen des Wait-Timers verhindern&lt;br /&gt;
attr using_inactive_Labor cmdState inactive,inactive,Befehl 1|Befehl 2&lt;br /&gt;
attr using_inactive_Labor group Labor: state inactive und Funktion IsDisabled&lt;br /&gt;
attr using_inactive_Labor readingList mybutton&lt;br /&gt;
attr using_inactive_Labor room DOIF_Labor&lt;br /&gt;
attr using_inactive_Labor setList mybutton:0,1,2&lt;br /&gt;
attr using_inactive_Labor wait 0,5,5:0&lt;br /&gt;
attr using_inactive_Labor webCmd mybutton&lt;br /&gt;
&lt;br /&gt;
setstate using_inactive_Labor 2016-12-09 07:44:21 mybutton 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
define using_cmd_x_Labor DOIF ## 1\&lt;br /&gt;
([$SELF:mybutton] == 1) \&lt;br /&gt;
   ({Log 1, &amp;quot;Befehl 1_1 gegen Zurücksetzen des wait geschützt&amp;quot;})\&lt;br /&gt;
   ({Log 1, &amp;quot;Befehl 1_2 gegen Zurücksetzen des wait geschützt&amp;quot;})\&lt;br /&gt;
   ({Log 1, &amp;quot;Befehl 1&amp;quot;})\&lt;br /&gt;
## 2\&lt;br /&gt;
DOELSEIF ([$SELF:mybutton] == 2 and [$SELF] !~ &amp;quot;cmd_1_1|cmd_1_2&amp;quot;) \&lt;br /&gt;
   ({Log 1, &amp;quot;Befehl 2&amp;quot;})&lt;br /&gt;
attr using_cmd_x_Labor alias Nutzung der originären DOIF Funktionalität [$SELF] !~  und &amp;quot;cmd_1_1|cmd_1_2&amp;quot;&amp;lt;br&amp;gt; Zurücksetzen des Wait-Timers verhindern&lt;br /&gt;
attr using_cmd_x_Labor group Labor: state inactive und Funktion IsDisabled&lt;br /&gt;
attr using_cmd_x_Labor readingList mybutton&lt;br /&gt;
attr using_cmd_x_Labor room DOIF_Labor&lt;br /&gt;
attr using_cmd_x_Labor setList mybutton:0,1,2&lt;br /&gt;
attr using_cmd_x_Labor wait 0,5,5:0&lt;br /&gt;
attr using_cmd_x_Labor webCmd mybutton&lt;br /&gt;
&lt;br /&gt;
setstate using_cmd_x_Labor 2016-12-09 08:59:00 mybutton 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==weitere Links==&lt;br /&gt;
* [[DOIF]]&lt;br /&gt;
* [[DOIF/Tools und Fehlersuche]]&lt;br /&gt;
* [[DOIF/Tipps zur leichteren Bedienung]] Erstellung, Bearbeitung, Syntaxhervorhebung, Klammerprüfung, Suchen&amp;amp;Ersetzen, uvm. (nicht nur) von DOIF&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:LWith&amp;diff=19226</id>
		<title>Benutzer:LWith</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:LWith&amp;diff=19226"/>
		<updated>2017-01-31T16:58:32Z</updated>

		<summary type="html">&lt;p&gt;LWith: Leere Seite erstellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Diskussion:HM-SEC-WIN_WinMatic&amp;diff=19225</id>
		<title>Diskussion:HM-SEC-WIN WinMatic</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Diskussion:HM-SEC-WIN_WinMatic&amp;diff=19225"/>
		<updated>2017-01-31T16:57:59Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Nutzbare Interfaces zur Ansteuerung? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Nutzbare Interfaces zur Ansteuerung?==&lt;br /&gt;
Als Nicht-HM-User frage ich mich, ob man nur den nicht mehr erhältlichen HM-Lan bzw. den CUL zur Ansteuerung nutzen kann, wie es mir der Artikel vermittelt. Was ist mit den anderen HM-Interfaces wie bspw. HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi, HM-LGW-O-TW-W-EU_Funk-LAN_Gateway usw.? Falls alle Interfaces nutzbar sind, würde ich auf eine Einzelaufzählung verzichten bzw. auf die Artikelseite mit den nutzbaren AES-Interfaces verweisen.&lt;br /&gt;
Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 16:47, 31. Jan. 2017 (CET)&lt;br /&gt;
&lt;br /&gt;
Ich hatte die Seite von HM-SEC-KEY kopiert, den Satz habe ich jetzt entfernt.&lt;br /&gt;
--[[Benutzer:LWith|LWith]] ([[Benutzer Diskussion:LWith|Diskussion]]) 17:57, 31. Jan. 2017 (CET)&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-SEC-WIN_WinMatic&amp;diff=19224</id>
		<title>HM-SEC-WIN WinMatic</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-SEC-WIN_WinMatic&amp;diff=19224"/>
		<updated>2017-01-31T16:52:51Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Hinweise zum Betrieb mit FHEM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Features ==&lt;br /&gt;
Das Gerät dient zum motorgesteuerten Entriegeln, Öffnen (nur Kippen), Schließen und Verriegeln von Fenstern.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Der HM-SEC-WIN Winmatic  verwendet ausschließlich die AES authentifizierte Kommunikation.&lt;br /&gt;
&lt;br /&gt;
Das Pairing sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden. An der WinMatic muss dafür die Anlerntaste (Taste Schließen) betätigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Sicherheitshinweis ===&lt;br /&gt;
Wenn die WinMatic an einem aktiven HMLAN Konfigurator angelernt wurde, kann die entsprechende Tür per FHEM ver- / entriegelt bzw. geöffnet werden. Somit sollte das Netzwerk in dem FHEM läuft entsprechend gesichert sein. (Nicht nach Außen geöffnet, kein unsicheres WLAN usw.)&lt;br /&gt;
&lt;br /&gt;
Die Verwendung eines eigenen [[AES Encryption#Aktivieren.2C_Einrichten.2C_Umgang_in_FHEM|AES Sicherheitsschlüssels]] ist dringend anzuraten, da ansonsten eine WinMatic relativ einfach ferngesteuert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Channels (Kanäle) ==&lt;br /&gt;
=== Channel (Kanal) 01 Winmatic ===&lt;br /&gt;
Der Fensterantrieb wird folgendermaßen angesteuert&lt;br /&gt;
  set winmatic level #1 #2 #3&lt;br /&gt;
Dabei ist&lt;br /&gt;
; #1 : Die Position in %, die anzufahren ist&lt;br /&gt;
; #2 : Die Zeit in Sekunden, bis nach Anfahren der Position aus #1 das Fenster verschlossen und verriegelt wird. Statt der Sekundne kann durch &amp;quot;ignore&amp;quot; endlos angegeben werden.&lt;br /&gt;
; #3 : Geschwindigkeit des Motors in Prozent (0-100) für die Aktion&lt;br /&gt;
&lt;br /&gt;
Schließen geht mit&lt;br /&gt;
  set winmatic level lock&lt;br /&gt;
&lt;br /&gt;
=== Channel (Kanal) 02 Akku ===&lt;br /&gt;
Der Akku hat folgende Readings&lt;br /&gt;
;charge : ob geladen oder entladen wird&lt;br /&gt;
;recentStateType&lt;br /&gt;
;state :der Ladezustrand des Akkus&lt;br /&gt;
&lt;br /&gt;
== Mögliche Zustände ==&lt;br /&gt;
WinMatic hat folgende Schaltzustände:&lt;br /&gt;
;locked : Das Fenster ist geschlossen und verriegelt.&lt;br /&gt;
;unlocked : Das Fenster ist entriegelt.&lt;br /&gt;
;0-100 : Das Fenster ist zu dem Prozentsatz gekippt (im Verhälntnis zum maximalen Kippwinkel)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Anleitung [https://files.elv.com/service/manuals/73472_HM_WinMatic_GE_um.pdf] PDF&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Fenstersteuerung]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Kategorie:Fenstersteuerung&amp;diff=19218</id>
		<title>Kategorie:Fenstersteuerung</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Kategorie:Fenstersteuerung&amp;diff=19218"/>
		<updated>2017-01-31T15:20:33Z</updated>

		<summary type="html">&lt;p&gt;LWith: Leere Seite erstellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-SEC-WIN_WinMatic&amp;diff=19217</id>
		<title>HM-SEC-WIN WinMatic</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-SEC-WIN_WinMatic&amp;diff=19217"/>
		<updated>2017-01-31T15:18:34Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Channel (Kanal) 01 Winmatic */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Features ==&lt;br /&gt;
Das Gerät dient zum motorgesteuerten Entriegeln, Öffnen (nur Kippen), Schließen und Verriegeln von Fenstern.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Der HM-SEC-WIN Winmatic  verwendet ausschließlich die AES authentifizierte Kommunikation und kann mit dem [[HMLAN Konfigurator]] bzw. [[CUL]] gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Das Pairing sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden. An der WinMatic muss dafür die Anlerntaste (Taste Schließen) betätigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Sicherheitshinweis ===&lt;br /&gt;
Wenn die WinMatic an einem aktiven HMLAN Konfigurator angelernt wurde, kann die entsprechende Tür per FHEM ver- / entriegelt bzw. geöffnet werden. Somit sollte das Netzwerk in dem FHEM läuft entsprechend gesichert sein. (Nicht nach Außen geöffnet, kein unsicheres WLAN usw.)&lt;br /&gt;
&lt;br /&gt;
Die Verwendung eines eigenen [[AES Encryption#Aktivieren.2C_Einrichten.2C_Umgang_in_FHEM|AES Sicherheitsschlüssels]] ist dringend anzuraten, da ansonsten eine KeyMatic relativ einfach ferngesteuert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Channels (Kanäle) ==&lt;br /&gt;
=== Channel (Kanal) 01 Winmatic ===&lt;br /&gt;
Der Fensterantrieb wird folgendermaßen angesteuert&lt;br /&gt;
  set winmatic level #1 #2 #3&lt;br /&gt;
Dabei ist&lt;br /&gt;
; #1 : Die Position in %, die anzufahren ist&lt;br /&gt;
; #2 : Die Zeit in Sekunden, bis nach Anfahren der Position aus #1 das Fenster verschlossen und verriegelt wird. Statt der Sekundne kann durch &amp;quot;ignore&amp;quot; endlos angegeben werden.&lt;br /&gt;
; #3 : Geschwindigkeit des Motors in Prozent (0-100) für die Aktion&lt;br /&gt;
&lt;br /&gt;
Schließen geht mit&lt;br /&gt;
  set winmatic level lock&lt;br /&gt;
&lt;br /&gt;
=== Channel (Kanal) 02 Akku ===&lt;br /&gt;
Der Akku hat folgende Readings&lt;br /&gt;
;charge : ob geladen oder entladen wird&lt;br /&gt;
;recentStateType&lt;br /&gt;
;state :der Ladezustrand des Akkus&lt;br /&gt;
&lt;br /&gt;
== Mögliche Zustände ==&lt;br /&gt;
WinMatic hat folgende Schaltzustände:&lt;br /&gt;
;locked : Das Fenster ist geschlossen und verriegelt.&lt;br /&gt;
;unlocked : Das Fenster ist entriegelt.&lt;br /&gt;
;0-100 : Das Fenster ist zu dem Prozentsatz gekippt (im Verhälntnis zum maximalen Kippwinkel)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Anleitung [https://files.elv.com/service/manuals/73472_HM_WinMatic_GE_um.pdf] PDF&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Fenstersteuerung]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-SEC-WIN_WinMatic&amp;diff=19216</id>
		<title>HM-SEC-WIN WinMatic</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-SEC-WIN_WinMatic&amp;diff=19216"/>
		<updated>2017-01-31T15:14:59Z</updated>

		<summary type="html">&lt;p&gt;LWith: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Features ==&lt;br /&gt;
Das Gerät dient zum motorgesteuerten Entriegeln, Öffnen (nur Kippen), Schließen und Verriegeln von Fenstern.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Der HM-SEC-WIN Winmatic  verwendet ausschließlich die AES authentifizierte Kommunikation und kann mit dem [[HMLAN Konfigurator]] bzw. [[CUL]] gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Das Pairing sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden. An der WinMatic muss dafür die Anlerntaste (Taste Schließen) betätigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Sicherheitshinweis ===&lt;br /&gt;
Wenn die WinMatic an einem aktiven HMLAN Konfigurator angelernt wurde, kann die entsprechende Tür per FHEM ver- / entriegelt bzw. geöffnet werden. Somit sollte das Netzwerk in dem FHEM läuft entsprechend gesichert sein. (Nicht nach Außen geöffnet, kein unsicheres WLAN usw.)&lt;br /&gt;
&lt;br /&gt;
Die Verwendung eines eigenen [[AES Encryption#Aktivieren.2C_Einrichten.2C_Umgang_in_FHEM|AES Sicherheitsschlüssels]] ist dringend anzuraten, da ansonsten eine KeyMatic relativ einfach ferngesteuert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Channels (Kanäle) ==&lt;br /&gt;
=== Channel (Kanal) 01 Winmatic ===&lt;br /&gt;
Der Fensterantrieb wird folgendermaßen angesteuert&lt;br /&gt;
  set winmatic level #1 #2 #3&lt;br /&gt;
Dabei ist&lt;br /&gt;
; #1 : Die Position in %, die anzufahren ist&lt;br /&gt;
; #2 : Die Zeit in Sekunden, bis nach Anfahren der Position aus #1 das Fenster verschlossen und verriegelt wird&lt;br /&gt;
; #3 : Geschwindigkeit des Motors in Prozent (0-100) für die Aktion&lt;br /&gt;
&lt;br /&gt;
Schließen geht mit&lt;br /&gt;
  set winmatic level lock&lt;br /&gt;
&lt;br /&gt;
=== Channel (Kanal) 02 Akku ===&lt;br /&gt;
Der Akku hat folgende Readings&lt;br /&gt;
;charge : ob geladen oder entladen wird&lt;br /&gt;
;recentStateType&lt;br /&gt;
;state :der Ladezustrand des Akkus&lt;br /&gt;
&lt;br /&gt;
== Mögliche Zustände ==&lt;br /&gt;
WinMatic hat folgende Schaltzustände:&lt;br /&gt;
;locked : Das Fenster ist geschlossen und verriegelt.&lt;br /&gt;
;unlocked : Das Fenster ist entriegelt.&lt;br /&gt;
;0-100 : Das Fenster ist zu dem Prozentsatz gekippt (im Verhälntnis zum maximalen Kippwinkel)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Anleitung [https://files.elv.com/service/manuals/73472_HM_WinMatic_GE_um.pdf] PDF&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Fenstersteuerung]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-SEC-WIN_WinMatic&amp;diff=19215</id>
		<title>HM-SEC-WIN WinMatic</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-SEC-WIN_WinMatic&amp;diff=19215"/>
		<updated>2017-01-31T14:54:28Z</updated>

		<summary type="html">&lt;p&gt;LWith: Die Seite wurde neu angelegt: „== Features == Das Gerät dient zum motorgesteuerten Entriegeln, Öffnen (nur Kippen), Schließen und Verriegeln von Fenstern.  == Hinweise zum Betrieb mit FHE…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Features ==&lt;br /&gt;
Das Gerät dient zum motorgesteuerten Entriegeln, Öffnen (nur Kippen), Schließen und Verriegeln von Fenstern.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Der HM-SEC-WIN Winmatic  verwendet ausschließlich die AES authentifizierte Kommunikation und kann mit dem [[HMLAN Konfigurator]] bzw. [[CUL]] gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Das Pairing sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden. An der WinMatic muss dafür die Anlerntaste (Taste Schließen) betätigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Sicherheitshinweis ===&lt;br /&gt;
Wenn die WinMatic an einem aktiven HMLAN Konfigurator angelernt wurde, kann die entsprechende Tür per FHEM ver- / entriegelt bzw. geöffnet werden. Somit sollte das Netzwerk in dem FHEM läuft entsprechend gesichert sein. (Nicht nach Außen geöffnet, kein unsicheres WLAN usw.)&lt;br /&gt;
&lt;br /&gt;
Die Verwendung eines eigenen [[AES Encryption#Aktivieren.2C_Einrichten.2C_Umgang_in_FHEM|AES Sicherheitsschlüssels]] ist dringend anzuraten, da ansonsten eine KeyMatic relativ einfach ferngesteuert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Mögliche Zustände ==&lt;br /&gt;
WinMatic hat folgende Schaltzustände:&lt;br /&gt;
&lt;br /&gt;
  locked -&amp;amp;gt; Das Fenster ist geschlossen und verriegelt.&lt;br /&gt;
  unlocked -&amp;amp;gt; Das Fenster ist entriegelt.&lt;br /&gt;
  0-100 Das Fenster ist zu dem Prozentsatz gekippt (im Verhälntnis zum maximalen Kippwinkel)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Anleitung [https://files.elv.com/service/manuals/73472_HM_WinMatic_GE_um.pdf] PDF&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Fenstersteuerung]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-TC-IT-WM-W-EU_Funk-Wandthermostat_AP&amp;diff=18749</id>
		<title>HM-TC-IT-WM-W-EU Funk-Wandthermostat AP</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-TC-IT-WM-W-EU_Funk-Wandthermostat_AP&amp;diff=18749"/>
		<updated>2017-01-22T16:50:46Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Channel (Kanal) 01 _Weather */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=HM-TC-IT-WM-W-EU.jpg&lt;br /&gt;
|Bildbeschreibung=HM-TC-IT-WM-W-EU mit Standard-Einstellungen&lt;br /&gt;
|HWProtocol=[[HomeMatic]]&lt;br /&gt;
|HWType=[[HomeMatic Type Thermostat|thermostat]]&lt;br /&gt;
|HWCategory=[[:Kategorie:Temperatursensoren|Temperatursensoren]] [[:Kategorie:Feuchtesensoren|Feuchtesensoren]]&lt;br /&gt;
|HWComm=868,3 MHz&lt;br /&gt;
|HWChannels=7&lt;br /&gt;
|HWVoltage=3 V&lt;br /&gt;
|HWPowerConsumption=40 mA (max)&lt;br /&gt;
|HWPoweredBy=2 x LR6/Mignon/AA&lt;br /&gt;
|HWSize=ohne Rahmen: 55&amp;amp;#8239;x&amp;amp;#8239;55&amp;amp;#8239;x&amp;amp;#8239;20&amp;amp;nbsp;mm&amp;lt;br /&amp;gt;mit Rahmen: 86&amp;amp;#8239;x&amp;amp;#8239;86&amp;amp;#8239;x&amp;amp;#8239;21,5&amp;amp;nbsp;mm&lt;br /&gt;
|HWDeviceFHEM=[[CUL_HM]]&lt;br /&gt;
&amp;lt;!-- |ModOwner=  --&amp;gt;&lt;br /&gt;
|HWManufacturer=ELV / eQ-3&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;HM-TC-IT-WM-W-EU Funk-Wandthermostat AP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HomeMatic-Wandthermostat Aufputz. Verfügbar seit Februar 2014. Nachfolger des [[HM-CC-TC_Funk-Wandthermostat|HM-CC-TC]].&lt;br /&gt;
&lt;br /&gt;
== Vorbemerkungen ==&lt;br /&gt;
: &#039;&#039;→ Allgemeine Informationen, die alle HomeMatic Thermostate betreffen, sind unter [[HomeMatic Type Thermostat]] zu finden.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;HM-TC-IT-WM-W-EU Funk-Wandthermostat&#039;&#039;&#039; misst die Raumtemperatur und Luftfeuchtigkeit. Er verfügt über individuell einstellbare Wochenprogramme und Programmierung direkt am Gerät. Zusätzlich ist auch eine Boost-Funktion vorhanden (ermöglicht ein schnelles, kurzzeitiges Aufheizen des Heizkörpers). Er verfügt über ein eigenes Anzeigedisplay für Soll- und Isttemperatur sowie Luftfeuchtigkeit. Er kann mittels Klebestreifen irgendwo aufgeklebt werden, soll aber auch in Mehrfachrahmen von Berker, ELSO, Gira, Merten und JUNG passen.&lt;br /&gt;
&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
* Versorgungsspannung: 2 Stck. 1,5 V LR03/Micro/AAA&lt;br /&gt;
* Stromaufnahme (max.): 40 mA&lt;br /&gt;
* Schutzart: IP20&lt;br /&gt;
* Schutzklasse: III&lt;br /&gt;
* Abmessungen (BxHxT ohne Rahmen): 55 x 55 x 20 mm&lt;br /&gt;
* Abmessungen (BxHxT mit Rahmen): 86 x 86 x 21,5 mm&lt;br /&gt;
* Gewicht (ohne Batterien): 74 g&lt;br /&gt;
* Temperaturwahl in Schritten von: 0,5 °C&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zum HM-CC-TC kann der HM-TC-IT-WM-W-EU auch andere HomeMatic-Schaltaktoren (z.B. [[HM-LC-SW1-FM_Schaltaktor_1-fach_UP|HM-LC-SW1-FM]]) über den Channel 07 SwitchTr direkt anlernen, womit z.B. die Steuerung elektrischer Heizungen möglich wird. Der HM-CC-TC konnte direkt nur die HM-CC-VD steuern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Betrieb mit FHEM ==&lt;br /&gt;
&lt;br /&gt;
Zuerst muss das Wandthermostat mit FHEM gepairt werden. &lt;br /&gt;
&lt;br /&gt;
Das [[Pairing (HomeMatic)|Pairing]] sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Danach kann das [[Peering (HomeMatic)|Peering]] mit den Heizkörperthermostaten des betreffenden Raumes stattfinden:&lt;br /&gt;
&lt;br /&gt;
=== Channels (Kanäle) ===&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 01 _Weather ====&lt;br /&gt;
Damit das [[HM-CC-RT-DN Funk-Heizkörperthermostat]] die Temperatur des Wandthermostats übernimmt, muss der Weather Kanal gepeert werden:&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;HM-TC-IT-WM-W-EU-Gerät&amp;gt;_Weather peerChan 0 &amp;lt;HM-CC-RT-DN-Gerät&amp;gt;_Weather single set&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 02 _Climate ====&lt;br /&gt;
Damit der Heizkörperthermostat vom Wandthermostat auch eingestellt werden kann (Soll-Temperatur, Mode etc.), muss der Climate Kanal gepeert werden:&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;HM-TC-IT-WM-W-EU-Gerät&amp;gt;_Climate peerChan 0 &amp;lt;HM-CC-RT-DN-Gerät&amp;gt;_Climate single set&lt;br /&gt;
Dies muss für jedes zu steuernde Heizkörperthermostat wiederholt werden.&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 03 _WindowRec ====&lt;br /&gt;
Mit diesem Kanal lassen sich Fensterkontakte (HM-SEC-SC oder HM-SEC-RHS) peeren, die ihren Fensterstatus (geöffnet/gekippt) an ein oder mehrere Thermostate senden. Die Thermostate stellen anschließend die entsprechende (konfigurierbare) Temperatur ein. Der Temperaturwert kann je Fenster-Sensor unterschiedlich definiert werden. Sind mehrere Fenster gleichzeitig geöffnet, so wird der Thermostat auf die Temperatur des Sensors mit dem geringsten Temperaturwert eingestellt. &lt;br /&gt;
&lt;br /&gt;
Damit der Tür-Fensterkontakt den Thermostat aufwecken kann, muss zuerst der Burst-Modus aktiviert werden, siehe dazu [[HM-SEC-SC_Tür-Fensterkontakt#Problembehebung]].&lt;br /&gt;
&lt;br /&gt;
Das eigentliche Peering mit einem Tür-Fensterkontakt läuft wie folgt ab:&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;HM-Sec-SC&amp;gt; peerChan 0 &amp;lt;HM-TC-IT-WM-W-EU-Gerät&amp;gt;_WindowRec single set&lt;br /&gt;
&lt;br /&gt;
Der Befehl zur Temperatureinstellung des Heizkörperthermostaten für den Zustand &amp;quot;Fenster offen&amp;quot; lautet, wobei &amp;lt;fensterSensor&amp;gt; die Fhem-Kanalbezeichnung für den Fensterkontakt ist und &amp;lt;tc_WindowRec&amp;gt; die Kanalbezeichnung für den entsprechenden Kanal des Heizkörperthermostates, sowie &amp;lt;Temp&amp;gt; die einzustellende Temperatur (ganzzahliger Wert):&lt;br /&gt;
 set &amp;lt;tc_WindowRec&amp;gt; regSet winOpnTemp &amp;lt;Temp&amp;gt; &amp;lt;fensterSensor&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 06 _remote ====&lt;br /&gt;
Dieser Kanal kann an eine Fernbedienung gekoppelt werden. Per Tastendruck kann man einen bestimmten Mode und/oder eine bestimmte Temperatur wählen. Dabei kann die Reaktion auf einen langen oder kurzen Tastendruck gesondert eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Der Befehl zum peeren lautet, wobei &amp;lt;button&amp;gt; die Kanalbezeichnung der Fernbedienung und &amp;lt;tc-remote&amp;gt; die Kanalbezeichnung des Heizkörperthermostates ist:&lt;br /&gt;
&amp;lt;pre&amp;gt;set &amp;lt;button&amp;gt; peerChan 0 &amp;lt;rt-remote&amp;gt; single&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 07 _SwitchTr ====&lt;br /&gt;
Das Peering mit einem Schaltaktor läuft z.B. wie folgt ab:&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;HM-TC-IT-WM-W-EU_SwitchTr&amp;gt; peerChan 0 &amp;lt;HM-LC-SW1-FM&amp;gt; single set&lt;br /&gt;
  set &amp;lt;HM-LC-SW1-FM&amp;gt; regSet shCtOn ltLo &amp;lt;HM-TC-IT-WM-W-EU_SwitchTr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einstellungen ==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Einstellungen werden in **Registern** des HM-TC-IT-WM-W-EU vorgenommen. Das heißt, dass diese Einstellungen im Gerät selbst gespeichert werden, nicht in der Konfigurations-Datei von Fhem.&lt;br /&gt;
&lt;br /&gt;
=== Anzeige ===&lt;br /&gt;
&lt;br /&gt;
Register im Kanal&amp;amp;nbsp;2 &#039;&#039;(_Climate)&#039;&#039; erlauben es zu konfigurieren, welche Daten der HM-TC-IT-WM-W-EU in seinem LC-Display anzeigt.&lt;br /&gt;
&lt;br /&gt;
==== showInfo time|date ====&lt;br /&gt;
&lt;br /&gt;
Wählt aus, ob die &#039;&#039;Uhrzeit&#039;&#039; (&amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt;, Standard-Einstellung) oder das &#039;&#039;Datum&#039;&#039; (&amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;) angezeigt wird. Der folgende Befehl erlaubt es das Datum anzeigen zu lassen:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-TC-IT-WM-W-EU&amp;gt;_Climate regSet showInfo date&lt;br /&gt;
&lt;br /&gt;
==== showSetTemp actTemp|setTemp ====&lt;br /&gt;
&lt;br /&gt;
Wählt aus, ob die &#039;&#039;Ist-Temperatur&#039;&#039; (&amp;lt;code&amp;gt;actTemp&amp;lt;/code&amp;gt;, Standard-Einstellung) oder die &#039;&#039;Soll-Temperatur&#039;&#039; (&amp;lt;code&amp;gt;setTemp&amp;lt;/code&amp;gt;) im Display angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-TC-IT-WM-W-EU&amp;gt;_Climate regSet showSetTemp setTemp&lt;br /&gt;
&lt;br /&gt;
==== showHumidity temp|tempHum ====&lt;br /&gt;
&lt;br /&gt;
Wählt aus, ob dauerhaft die &#039;&#039;Temperatur&#039;&#039; (&amp;lt;code&amp;gt;temp&amp;lt;/code&amp;gt;, Standard-Einstellung) oder &#039;&#039;Temperatur und Luftfeuchtigkeit&#039;&#039; im Wechsel (&amp;lt;code&amp;gt;tempHum&amp;lt;/code&amp;gt;) im Display angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-TC-IT-WM-W-EU&amp;gt;_Climate regSet showHumidity tempHum&lt;br /&gt;
&lt;br /&gt;
=== Tastensperre ===&lt;br /&gt;
&lt;br /&gt;
Um zu verhindern, dass der Modus oder die Temperatur per Tasten bzw. Drehrad am HM-TC-IT-WM-W-EU verändert wird, kann eine Tastensperre gesetzt werden. Dies erfolgt mittels des Befehls:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-TC-IT-WM-W-EU&amp;gt; regSet btnLock on&lt;br /&gt;
&lt;br /&gt;
Rückgängig machen geht per:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-TC-IT-WM-W-EU&amp;gt; regSet btnLock off&lt;br /&gt;
&lt;br /&gt;
Diese Tastensperre kann man aber am Thermostat durch eine Tastenkombination wieder zurücksetzen. Um sie nur per Fhem rücksetzen zu können, muss&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-TC-IT-WM-W-EU&amp;gt; regSet globalBtnLock on&lt;br /&gt;
&lt;br /&gt;
abgesetzt werden. Rückgängig wieder per:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-TC-IT-WM-W-EU&amp;gt; regSet globalBtnLock off&lt;br /&gt;
&lt;br /&gt;
=== Temperaturlisten ===&lt;br /&gt;
&lt;br /&gt;
Die Temperaturlisten des HM-TC-IT-WM-W-EU werden identisch zu anderern HomeMatic Thermostaten verwaltet, siehe [[HomeMatic Type Thermostat#Temperaturlisten|HomeMatic Type Thermostat]]. Beim HM-TC-IT-WM-W-EU ist der Kanal&amp;amp;nbsp;2 &#039;&#039;(_Climate)&#039;&#039; für die Temperaturlisten zuständig.&lt;br /&gt;
&lt;br /&gt;
== Fhem-Log ==&lt;br /&gt;
=== Event monitor ===&lt;br /&gt;
&lt;br /&gt;
Hier habe ich einmal die Wunschtemperatur erhöht, damit auch was passiert:&lt;br /&gt;
&lt;br /&gt;
  2014-04-09 09:35:11 CUL_HM KH_Bad_Therm CMDs_pending&lt;br /&gt;
  2014-04-09 09:35:11 CUL_HM KH_Bad_Therm_Climate set_desired-temp 18.0&lt;br /&gt;
  2014-04-09 09:35:11 CUL_HM KH_Bad_Therm CMDs_done&lt;br /&gt;
&lt;br /&gt;
Bei mir ist es so, das der SwitchTr Kanal nur mit dem gepeerten Device spricht, hier ein HM-LC-SW1-FM:&lt;br /&gt;
&lt;br /&gt;
  2014-04-09 09:35:17 CUL_HM KH_Bad_Heizung trig_KH_Bad_Therm_SwitchTr: 200&lt;br /&gt;
  2014-04-09 09:35:17 CUL_HM KH_Bad_Heizung trigLast: KH_Bad_Therm_SwitchTr :200&lt;br /&gt;
&lt;br /&gt;
Der hat auch prompt reagiert und die Heizung eingeschaltet:&lt;br /&gt;
&lt;br /&gt;
  2014-04-09 09:35:17 CUL_HM KH_Bad_Heizung level: 100&lt;br /&gt;
  2014-04-09 09:35:17 CUL_HM KH_Bad_Heizung pct: 100&lt;br /&gt;
  2014-04-09 09:35:17 CUL_HM KH_Bad_Heizung deviceMsg: on (to KH_Bad_Therm)&lt;br /&gt;
  2014-04-09 09:35:17 CUL_HM KH_Bad_Heizung on&lt;br /&gt;
  2014-04-09 09:35:17 CUL_HM KH_Bad_Heizung timedOn: off&lt;br /&gt;
&lt;br /&gt;
und noch ein wenig Geplauder der vorhandenen Kanäle:&lt;br /&gt;
&lt;br /&gt;
  2014-04-09 09:36:39 CUL_HM KH_Bad_Therm_Climate measured-temp: 16.0&lt;br /&gt;
  2014-04-09 09:36:39 CUL_HM KH_Bad_Therm_Climate desired-temp: 18.0&lt;br /&gt;
  2014-04-09 09:36:39 CUL_HM KH_Bad_Therm_Climate humidity: 50&lt;br /&gt;
  2014-04-09 09:36:39 CUL_HM KH_Bad_Therm_Climate T: 16.0 desired: 18.0&lt;br /&gt;
  2014-04-09 09:36:49 CUL_HM KH_Bad_Therm battery: ok&lt;br /&gt;
  2014-04-09 09:36:49 CUL_HM KH_Bad_Therm batteryLevel: 3&lt;br /&gt;
  2014-04-09 09:36:49 CUL_HM KH_Bad_Therm measured-temp: 16.0&lt;br /&gt;
  2014-04-09 09:36:49 CUL_HM KH_Bad_Therm desired-temp: 18.0&lt;br /&gt;
  2014-04-09 09:36:49 CUL_HM KH_Bad_Therm_Climate measured-temp: 16.0&lt;br /&gt;
  2014-04-09 09:36:49 CUL_HM KH_Bad_Therm_Climate desired-temp: 18.0&lt;br /&gt;
  2014-04-09 09:36:49 CUL_HM KH_Bad_Therm_Climate mode: auto&lt;br /&gt;
  2014-04-09 09:36:49 CUL_HM KH_Bad_Therm_Climate T: 16.0 desired: 18.0&lt;br /&gt;
  2014-04-09 09:36:59 CUL_HM KH_Bad_Therm_Weather temperature: 16.0&lt;br /&gt;
  2014-04-09 09:36:59 CUL_HM KH_Bad_Therm_Weather humidity: 50&lt;br /&gt;
  2014-04-09 09:36:59 CUL_HM KH_Bad_Therm_Weather T: 16.0 H: 50&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Firmware Update ==&lt;br /&gt;
Updates für den HM-TC-IT-WM-W-EU können von der eQ-3 Webseite heruntergeladen werden. Genauere Informationen gibt es unter [[HomeMatic_Firmware_Update]]. Das Thermostat wird in den Updatemodus gebracht, indem beide äußeren Tasten gedrückt werden, während die Batterien eingesetzt werden. Das Display zeigt &amp;quot;FUP&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Bei der Firmware 1.2 und dem Kanal Climate funktioniert die Einstellung der Hysterese über das Register hyst2point nicht. Der Eintrag wird ignoriert. &lt;br /&gt;
&lt;br /&gt;
Siehe auch Bericht im [http://www.elv.de/topic/hystereseeinstellung-bei-hm-tc-it-wm-w-eu-firmware-1-2-wird-ignoriert.html Forum von ELV]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/pdf_produkte/HM-TC-IT-WM-W-EU_UM_GE_eQ-3_web.pdf Manual]&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/pdf_produkte/Funk-Wandthermostat_132030A0_Produktdatenblatt_V1.2.pdf Produktdatenblatt] &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Feuchtesensoren]]&lt;br /&gt;
[[Kategorie:Temperatursensoren]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Firmware_Update&amp;diff=17888</id>
		<title>HomeMatic Firmware Update</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Firmware_Update&amp;diff=17888"/>
		<updated>2016-12-19T09:41:13Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Mögliche Probleme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Seit 2014 ist es möglich, bei einigen [[HomeMatic]] Komponenten selbst Firmware Updates durchzuführen. Vorher ging das nur per CCU oder durch Einsenden des Gerätes an ELV.&lt;br /&gt;
Dabei gibt es verschiedene Möglichkeiten das Firmware Update durchzuführen. Um in Fhem die aktuelle Firmware nach dem Update angezeigt zu bekommen, ist ein erneutes Pairen mit Fhem notwendig. Es muss aber nicht gelöscht oder zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
== Varianten für Firmwareupdates ==&lt;br /&gt;
=== Firmware Update mit CUL/HM-CFG-USB/HMUARTLGW unter FHEM ===&lt;br /&gt;
FW Updates sind in FHEM möglich. Benötigt wird dafür ein [[CUL]] oder ein [[HM-CFG-USB USB Konfigurations-Adapter|HM-CFG-USB]] oder ein [[HMUARTLGW]]. Mit einem [[HMLAN]] ist ein Update nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Vor dem Update ist sicherzustellen, dass das korrekte IO für das Device genutzt wird (falls mehrere IOs im System zu Verfügung stehen). Siehe Attribut IODev und IOgrp bei der Verwendung einer [[Virtueller Controller VCCU|VCCU]]. Ein HMLAN kann mit dem Befehl: &amp;lt;code&amp;gt;set &amp;lt;HMLAN Name&amp;gt; close&amp;lt;/code&amp;gt; temporär ausgeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Um das Update durchführen zu können, wird die in dem entsprechenden Zip/tgz-File vorhandene .eq3-Datei benötigt. Bitte genau darauf achten, dass nicht versehentlich eine falsches Firmware-Datei verwendet wird. Der Vorgang selbst erfolgt mittels folgendem Befehl:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; fwUpdate &amp;lt;filename&amp;gt; &amp;lt;nowiki&amp;gt;[&amp;lt;time&amp;gt;]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;filename&amp;gt; ist der Name der .eq3 Datei inklusive absolutem oder relativem Pfad zu fhem-Root.&lt;br /&gt;
Die Angabe von [&amp;lt;time&amp;gt;] ist optional. Es ist die Zeit in Sekunden, die FHEM wartet, bis das Device in den Bootloader-Modus versetzt wird. Bei den meisten Devices ist die Zeit nicht notwendig, da FHEM das Gerät selbst in den Bootloader-Mode versetzen kann.&lt;br /&gt;
&lt;br /&gt;
Bei einigen älteren FW-Versionen wie z.B. bei den [[HM-CC-RT-DN]] v1.0 geht das allerdings nicht automatisch. Um den Flashvorgang zu starten, müssen hier noch die Batterien entfernt werden und beim wiedereinlegen die beiden äußeren Knöpfe gedrückt werden. Jene Zeit, die man für eben diese Aktion benötigt, wird hier eingegeben. &lt;br /&gt;
&lt;br /&gt;
Wichtig: während des Updates können keine weiteren Nachrichten in FHEM von Homematic verarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Da nach dem Update immer noch die alte FW-Version in FHEM steht, kann man entweder bei einigen Geräten die Version mit&lt;br /&gt;
:&amp;lt;code&amp;gt; set &amp;lt;device&amp;gt; getVersion &amp;lt;/code&amp;gt;&lt;br /&gt;
auslesen oder wenn das Kommando wie z.B. bei den oben genannten Heizkörperventilen nicht zur Verfügung steht, genügt es, am Gerät selbst die Anlerntaste zu drücken (was am Beispiel der RTs bedeutet, dass die Boost-Taste für mindestens drei Sekunden gedrückt werden  muss). Nach der Aktualisierung der Firmware-Information in Fhem, muss die [[Konfiguration]] noch gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Update mit CUL/HM-CFG-USB unter Linux ===&lt;br /&gt;
Für Linux hat mgernoth ein Updatetool erstellt.&lt;br /&gt;
&lt;br /&gt;
Zunächst muss sichergestellt werden, dass alle benötigten Pakete installiert sind. Um das Tool zu installieren und auszuführen, müssen die folgenden Pakete mit den gezeigten Befehlen installiert werden. Unter Debian:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libusb-1.0-0-dev git build-essential&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Unter OpenSuse 13.2 64 Bit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo zypper install libusb-1.0-0-dev git &lt;br /&gt;
sudo zypper install --type pattern devel_basis&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als nächstes wird der Sourcecode für das Tool heruntergeladen (vorher z.B. in den Pfad &amp;lt;code&amp;gt;/usr/src&amp;lt;/code&amp;gt; wechseln):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git://git.zerfleddert.de/hmcfgusb&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Und mit den Anweisungen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hmcfgusb&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
wird daraus eine ausführbare Datei erstellt.&lt;br /&gt;
&lt;br /&gt;
Weiterhin muss die nötige Firmware heruntergeladen und entpackt werden. Die offiziellen Updates gibt es unter [http://www.eq-3.de/downloads.html eq-3 Downloads]. Die Befehle, um beispielsweise die benötigte Datei für die Firmware Version 1.4 des HM-CC-RT-DN zu erhalten lauten:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget http://www.eq-3.de/Downloads/Software/Firmware/hm_cc_rt_dn_update_V1_4_001_141020.tgz&lt;br /&gt;
tar xvzf hm_cc_rt_dn_update_V1_4_001_141020.tgz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Zu guter Letzt muss noch das Tool mit einigen Parametern und der Seriennummer des HomeMatic Devices aufgerufen werden. Für ein Update mit einem CUL (&amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; ist in diesem Beispiel die Adresse des CULs) muss folgendes eingegeben werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./flash-ota -c /dev/ttyACM0 -f &amp;lt;FirmwareImageName&amp;gt;.eq3 -s &amp;lt;DeviceSerialNo&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Für ein Update mit einem COC muss folgendes eingegeben werden (/dev/ttyAMA0):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./flash-ota -c /dev/ttyAMA0 -f &amp;lt;FirmwareImageName&amp;gt;.eq3 -s &amp;lt;DeviceSerialNo&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Für ein Update mit HM-CFG-USB&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./flash-ota -f &amp;lt;FirmwareImageName&amp;gt;.eq3 -s &amp;lt;DeviceSerialNo&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nun muss nur noch das HomeMatic Gerät in den Update-Modus versetzt werden. Wie das geht, steht in der jeweils mit der Firmwaredatei gelieferten &amp;quot;readme&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Update mit HM-CFG-USB unter Windows ===&lt;br /&gt;
Für ein Firmwareupdate unter Windows wird das &amp;quot;HomeMatic Firmware Update Tool&amp;quot; von eq-3 benötigt: [http://www.eq-3.de/downloads.html eQ-3 Downloads]. Zur Zeit ist das Update damit nur mit dem HM-CFG-USB-2 möglich, nicht aber mit dem HM-CFG-LAN oder dem HM-CFG-USB der ersten Generation.&lt;br /&gt;
&lt;br /&gt;
Nach dem Start muss die Seriennummer des HomeMatic-Device eingegeben und die Firmware-Datei ausgewählt werden. Dann wird das Update-Tool durch einen Klick auf den entsprechenden Button in &amp;quot;Bereitschaft&amp;quot; gesetzt und anschließend muss das HomeMatic-Gerät in den Update-Modus versetzt werden. Bei Unterputz-Geräten ist das eventuell gar nicht so einfach, man kann in diesem Fall aber von FHEM aus dem Gerät ein Kommando schicken um es in den Bootloader Modus zu bringen. Dies geht mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; fwUpdate onlyEnterBootLoader&amp;lt;/code&amp;gt;&lt;br /&gt;
Direkt danach sollte das Update Tool mit seiner Arbeit beginnen.&lt;br /&gt;
&lt;br /&gt;
Falls das Update-Tool beim Auswählen der Firmware-Datei abstürzt (&amp;quot;Home Matic Firmware Update Tool funktioniert nicht mehr&amp;quot;), dann stimmt wahrscheinlich etwas mit der Firmware-Datei nicht. Die Datei darf nicht ausgepackt, sondern muss als &amp;quot;.tar.gz&amp;quot;-Datei, so wie sie heruntergeladen wurde, benutzt werden. Es kann Probleme geben, wenn die Datei mit dem Internet Explorer heruntergeladen wurde. Am einfachsten ist es, die Datei mit einem anderen Browser herunterzuladen.&lt;br /&gt;
&lt;br /&gt;
== Mögliche Probleme ==&lt;br /&gt;
Lässt sich die Firmware nicht OTA auf das HomeMatic-Device flashen, kann dies folgende Ursachen haben:&lt;br /&gt;
* Die Fhem-Software ist nicht auf dem neuesten Stand. Bitte vorher ein &#039;&#039;update&#039;&#039; durchführen.&lt;br /&gt;
* &#039;&#039;&#039;Entfernung&#039;&#039;&#039; zwischen Sender und Empfänger &#039;&#039;&#039;zu klein&#039;&#039;&#039;. 1,5 bis 2 m Abstand sollten beide Geräte zueinander mindestens haben.&lt;br /&gt;
* &#039;&#039;&#039;Entfernung&#039;&#039;&#039; zwischen Sender und Empfänger &#039;&#039;&#039;zu groß&#039;&#039;&#039;. Überprüfen Sie die RSSI-Werte des zu flashenden Device. Schlechter als - 70 sollten sie nicht sein (also keine - 75 oder noch kleiner). Ansonsten muss der Abstand für die Dauer des Flashens verringert werden.&lt;br /&gt;
* Durch wiederholte Firmware-Updates oder Update-Versuche hat die [[1% Regel]] zugeschlagen. Der dort genannte Notbehelf (Funkschnittstelle kurz stromlos machen) schafft Abhilfe.&lt;br /&gt;
&lt;br /&gt;
== Tool zur Firmware Versionsprüfung ==&lt;br /&gt;
[[Datei:HM-FWUpdate-eQ3.png|mini|400px|right|Beispiel einer Liste der relevanten Firmware Updates&amp;lt;br /&amp;gt;&#039;&#039;&#039;Legende:&#039;&#039;&#039;&amp;lt;br /&amp;gt;1 - Link auf die eQ-3 Download-Seite &amp;lt;br /&amp;gt;2 - Link auf die Details des HTTPMOD Device &amp;lt;br /&amp;gt;3 - Link auf die Details des HomeMatic Device &amp;lt;br /&amp;gt;4 - (Download) Link auf die Firmware Datei &amp;lt;br /&amp;gt;5 - &amp;quot;reread&amp;quot;: Aktualisierung dieser Liste auslösen]]&lt;br /&gt;
Im Fhem-Forum wurden unter dem Titel {{Link2Forum|Topic=47729|LinkText=...Firmware Versionsprüfung}} die erforderlichen Definitionen für ein [[HTTPMOD]]-Device vorgestellt, das &lt;br /&gt;
* für alle HomeMatic Devices der aktuellen Fhem-Umgebung&lt;br /&gt;
* die derzeit benutzte Firmware Version mit&lt;br /&gt;
* einem evtl. auf der eQ-3 Seite verfügbaren Update vergleicht und&lt;br /&gt;
* alle für die aktuelle Installation relevanten Updates in einer Übersicht (siehe Screenshot) darstellt und&lt;br /&gt;
* einmal täglich (alle 86400 Sekunden) automatisch ausgeführt wird; dieses Intervall sollte nicht verkürzt, sondern eher verlängert werden. Im Bedarfsfall kann durch anklicken von &#039;&#039;&#039;&#039;&#039;reread&#039;&#039;&#039;&#039;&#039; eine sofortige Aktualisierung ausgelöst werden.&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollte eine alte (vor dem 15.3.2016) Version dieser Definitionen bereits in Benutzung sein (zu erkennen am Vorhandensein von &#039;&#039;&amp;lt;nowiki&amp;gt;reading0[2|3|4|5]*&amp;lt;/nowiki&amp;gt;&#039;&#039;-Attributen), dann wird empfohlen, das Device mit &amp;lt;code&amp;gt;delete eq3&amp;lt;/code&amp;gt; zunächst komplett zu löschen und anschließend neu anzulegen.}}&lt;br /&gt;
Die unten aufgeführten erforderlichen Anweisungen zur Erstellung dieser Übersicht sind&lt;br /&gt;
* im wesentlichen über das Webinterface eingebbar (können aber auch &amp;quot;en bloc&amp;quot; in die fhem.cfg eingetragen werden - auch wenn das eigentlich nicht empfohlen ist)&lt;br /&gt;
* der umfangreiche Perl-Code für das Attribut &#039;&#039;userReadings&#039;&#039; ist dargestellt für die Eingabe über das [[FHEMWEB|Webinterface]]&lt;br /&gt;
* für das Attribut &#039;&#039;stateFormat&#039;&#039; ist die mehrzeilige Eingabe (zumindest derzeit, März 2016) nicht unterstützt, daher wurde der Code in eine Subroutine ausgelagert&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;{{Randnotiz|RNTyp=r|RNText=&#039;&#039;&#039;Wichtige Änderungen:&#039;&#039;&#039;&lt;br /&gt;
22.05.2016 - &#039;&#039;reading01Regex&#039;&#039; und &#039;&#039;reading01Format&#039;&#039; angepasst (eQ-3)&lt;br /&gt;
}}&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Basis-Definitionen für Device eq3 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define eq3 HTTPMOD http://www.eq-3.de/service/downloads.html 86400&lt;br /&gt;
attr eq3 userattr enableControlSet event-on-change-reading event-on-update-reading reading01AutoNumLen reading01Format reading01Name reading01RegOpt reading01RegOpt:s,i,g reading01Regex readingMaxAge readingMaxAgeReplacementMode readingMaxAgeReplacementMode:text,expression,delete requestData.* showError showMatched stateFormat userReadings webCmd&lt;br /&gt;
attr eq3 enableControlSet 1&lt;br /&gt;
attr eq3 event-on-change-reading .*&lt;br /&gt;
attr eq3 event-on-update-reading LAST_ERROR,MATCHED_READINGS&lt;br /&gt;
attr eq3 reading01AutoNumLen 2&lt;br /&gt;
attr eq3 reading01Format http://www.eq-3.de/%s&lt;br /&gt;
attr eq3 reading01Name fw_link&lt;br /&gt;
attr eq3 reading01RegOpt g&lt;br /&gt;
attr eq3 reading01Regex &amp;lt;a.href=&amp;quot;(Downloads\/Software\/Firmware\/[^&amp;quot;]+)&lt;br /&gt;
attr eq3 readingMaxAge 10&lt;br /&gt;
attr eq3 readingMaxAgeReplacementMode delete&lt;br /&gt;
attr eq3 requestData.* suchtext=&amp;amp;suche_in=2&amp;amp;downloadart=11&lt;br /&gt;
attr eq3 room eq3&lt;br /&gt;
attr eq3 showError 1&lt;br /&gt;
attr eq3 showMatched 1&lt;br /&gt;
attr eq3 stateFormat {eq3StateFormat}&lt;br /&gt;
attr eq3 webCmd reread&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definition/Code für Attribut userReadings ===&lt;br /&gt;
Der &amp;quot;Zugang&amp;quot; zur Eingabe des Attributs &#039;&#039;stateFormat&#039;&#039; erfolgt über die Details des Device &#039;&#039;&#039;eq3&#039;&#039;&#039; (URL: ...8083/fhem?detail=eq3).&lt;br /&gt;
[[Datei:HM-FWUpdate-eQ3-userReadings.png|mini|640px|left|&amp;quot;Der Weg&amp;quot; zur Eingabe von &#039;&#039;userReadings&#039;&#039;; durch Klick in das Eingabefeld öffnet sich ein separates Fenster.]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;Der Perl-Code, der für das Attribut &#039;&#039;userReadings&#039;&#039; eingegeben werden muss:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
newFwForDevices:MATCHED_READINGS:.* {&lt;br /&gt;
  my $ret = &amp;quot;&amp;quot;;&lt;br /&gt;
  my @data;&lt;br /&gt;
  my @eq3FwList = map{@data = ReadingsVal(&amp;quot;eq3&amp;quot;,&amp;quot;fw_link-&amp;quot;.$_,&amp;quot;?&amp;quot;) =~ m/Firmware\/(.*?)_update_V([\d_]+)_(\d\d)(\d\d)(\d\d)/; &lt;br /&gt;
            $data[0] =~ s/_/-/g;&lt;br /&gt;
            sprintf(&amp;quot;%s:%s:%s.%s.%s:%s&amp;quot;,$data[0],$data[1],$data[4],$data[3],&amp;quot;20&amp;quot;.$data[2],$_);&lt;br /&gt;
            } ReadingsVal(&amp;quot;eq3&amp;quot;,&amp;quot;MATCHED_READINGS&amp;quot;,&amp;quot;?&amp;quot;) =~ m/fw_link-(\d\d)/g;&lt;br /&gt;
            &lt;br /&gt;
  foreach my $dev (devspec2array(&amp;quot;TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)&amp;quot;)) {&lt;br /&gt;
    my $md = AttrVal($dev,&amp;quot;model&amp;quot;,&amp;quot;?&amp;quot;);&lt;br /&gt;
    my $v = AttrVal($dev,&amp;quot;firmware&amp;quot;,&amp;quot;0.0&amp;quot;);&lt;br /&gt;
    my ($h,$l) = split(&#039;\.&#039;,$v);&lt;br /&gt;
    foreach my $newFw (grep m/^${md}:/i,@eq3FwList) {&lt;br /&gt;
      my ($nh,$nl,$no,$date,$idx) = $newFw =~ m/^[^:]+:(\d+)_(\d+)_?(\d*):([^:]+):(\d\d)$/;&lt;br /&gt;
      if(($nh &amp;gt; $h) || (($nh == $h) &amp;amp;&amp;amp; ($nl &amp;gt; $l))) {&lt;br /&gt;
        $ret .= &amp;quot;,&amp;quot; if($ret ne &amp;quot;&amp;quot;);&lt;br /&gt;
        $ret .= $dev.&amp;quot; (&amp;quot;.$md.&amp;quot; | fw_&amp;quot;.$v.&amp;quot; =&amp;gt; fw&amp;quot;.$idx.&amp;quot;_&amp;quot;.$nh.&amp;quot;.&amp;quot;.$nl.($no?sprintf(&amp;quot;.%d&amp;quot;,$no):&amp;quot;&amp;quot;).&amp;quot; | &amp;quot;.$date.&amp;quot;)&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return ($ret eq &amp;quot;&amp;quot;)?&amp;quot;no fw-updates needed!&amp;quot;:$ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definition/Code für Attribut stateFormat ===&lt;br /&gt;
Da der Code für &#039;&#039;stateFormat&#039;&#039; recht umfangreich ist, wäre er als Einzeiler kaum sinnvoll zu verwalten, würde also ohnehin meistens über einen externen Editor bearbeitet werden. Daher wurde er als eigene (Sub-)Routine mit dem Namen &#039;&#039;eq3StateFormat&#039;&#039; in (z.B.) [[99_myUtils anlegen|99_myUtils]] ausgelagert:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub eq3StateFormat() {&lt;br /&gt;
  my $name = &amp;quot;eq3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my $ret =&amp;quot;&amp;quot;;&lt;br /&gt;
  my $lastCheck = ReadingsTimestamp($name,&amp;quot;MATCHED_READINGS&amp;quot;,&amp;quot;???&amp;quot;);&lt;br /&gt;
  $ret .= &#039;&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&#039;;   &lt;br /&gt;
  $ret .= &#039;last &amp;lt;a title=&amp;quot;eq3-downloads&amp;quot; href=&amp;quot;http://www.eq-3.de/downloads.html&amp;quot;&amp;gt;homematic&amp;lt;/a&amp;gt;-fw-check =&amp;gt; &#039;.$lastCheck;    &lt;br /&gt;
  $ret .= &#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;;    &lt;br /&gt;
  $ret .= &#039;&amp;lt;pre&amp;gt;&#039;;   &lt;br /&gt;
  $ret .= &amp;quot;| device                  | model                   | old_fw | new_fw | release    |\n&amp;quot;;  &lt;br /&gt;
  $ret .= &amp;quot;------------------------------------------------------------------------------------\n&amp;quot;;  &lt;br /&gt;
  my $check = ReadingsVal($name,&amp;quot;newFwForDevices&amp;quot;,&amp;quot;???&amp;quot;);    &lt;br /&gt;
  if($check eq &amp;quot;no fw-updates needed!&amp;quot;) {        &lt;br /&gt;
    $ret .= &#039;| &#039;.$check.&#039;                                                            |&#039;;     &lt;br /&gt;
  } else {         &lt;br /&gt;
    my @devices = split(&#039;,&#039;,$check);         &lt;br /&gt;
    foreach my $devStr (@devices) {&lt;br /&gt;
      my ($dev,$md,$ofw,$idx,$nfw,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\sfw_(\d+\.\d+)\s=&amp;gt;\sfw(\d\d)_([\d\.]+)\s\|\s([^\)]+)\)$/;          &lt;br /&gt;
      my $link = ReadingsVal($name,&amp;quot;fw_link-&amp;quot;.$idx,&amp;quot;???&amp;quot;);           &lt;br /&gt;
      $ret .= &#039;| &#039;;          &lt;br /&gt;
      $ret .= &#039;&amp;lt;a href=&amp;quot;/fhem?detail=&#039;.$dev.&#039;&amp;quot;&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%-23s&amp;quot;,$dev);             &lt;br /&gt;
      $ret .= &#039;&amp;lt;/a&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= &#039;&amp;lt;b&#039;.(($md eq &amp;quot;?&amp;quot;)?&#039; title=&amp;quot;missing attribute model =&amp;gt; set device in teach mode to receive missing data&amp;quot; style=&amp;quot;color:yellow&amp;quot;&#039;:&#039; style=&amp;quot;color:lightgray&amp;quot;&#039;).&#039;&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%-23s&amp;quot;,$md);          &lt;br /&gt;
      $ret .= &#039;&amp;lt;/b&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= &#039;&amp;lt;b&#039;.(($ofw eq &amp;quot;0.0&amp;quot;)?&#039; title=&amp;quot;missing attribute firmware =&amp;gt; set device in teach mode to receive missing data&amp;quot; style=&amp;quot;color:yellow&amp;quot;&#039;:&#039; style=&amp;quot;color:lightgray&amp;quot;&#039;).&#039;&amp;gt;&#039;;              &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%6s&amp;quot;,$ofw);           &lt;br /&gt;
      $ret .= &#039;&amp;lt;/b&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= &#039;&amp;lt;a title=&amp;quot;eq3-firmware.tgz&amp;quot; href=&amp;quot;&#039;.$link.&#039;&amp;quot;&amp;gt;&#039;;           &lt;br /&gt;
      $ret .= &#039;&amp;lt;b style=&amp;quot;color:red&amp;quot;&amp;gt;&#039;;           &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%6s&amp;quot;,$nfw);           &lt;br /&gt;
      $ret .= &#039;&amp;lt;/b&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &#039;&amp;lt;/a&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%-10s&amp;quot;,$date);            &lt;br /&gt;
      $ret .= &amp;quot; |\n&amp;quot;;        &lt;br /&gt;
    }   &lt;br /&gt;
  }  &lt;br /&gt;
  $ret .= &#039;&amp;lt;/pre&amp;gt;&#039;;  &lt;br /&gt;
  $ret .= &#039;&amp;lt;/div&amp;gt;&#039;;  &lt;br /&gt;
  return $ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sondersituationen ===&lt;br /&gt;
[[Datei:HM-FWUpdate-eQ3-check.png|mini|455px|right|Fehlerbedingung: Attribut &#039;&#039;firmware&#039;&#039; nicht gesetzt]]&lt;br /&gt;
Das Tool überprüft gleichzeitig auch bestimmte Rahmenbedingungen, so z.B., ob bei allen HomeMatic Devices die Attribute &#039;&#039;model&#039;&#039; und &#039;&#039;firmware&#039;&#039; gesetzt sind. Sollte das nicht der Fall sein, wird das Device in der Liste &lt;br /&gt;
* mit einem gelben &amp;quot;old_fw&amp;quot; Wert von 0.0 geführt; befindet sich der Mauszeiger über dem &amp;quot;0.0&amp;quot;, wird der Hinweistext &#039;&#039;missing attribute firmware =&amp;gt; set device in teach mode to receive missing data&#039;&#039; angezeigt (siehe Beispiel im Screenshot)&lt;br /&gt;
* mit einem gelben {{Taste|?}} in der Spalte &amp;quot;model&amp;quot; angezeigt; befindet sich der Mauszeiger über dem &amp;quot;?&amp;quot;, wird der Hinweistext &#039;&#039;missing attribute model =&amp;gt; set device in teach mode to receive missing data&#039;&#039; angezeigt&lt;br /&gt;
In diesem Fall sollte bei dem betreffenden Gerät versucht werden, mit &#039;&#039;getConfig&#039;&#039; die Daten zu aktualisieren bzw. vervollständigen.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus ist zu beachten, dass die Firmware-Version in den HomeMatic Geräten zwei&amp;quot;teilig&amp;quot; (Version.Release) abgelegt ist, die Firmware Update-Dateien jedoch drei&amp;quot;teilige&amp;quot; Versionskennungen (Version_Release_???) haben. Für den Vergleich, ob neue Firmware verfügbar ist, kann natürlich nur die zweiteilige Kennung verwendet werden, eine Änderung im dritten Teil der Versionskennung kann daher nicht automatisch erkannt werden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.eq-3.de/downloads.html Firmware Download] Seite von eq-3&lt;br /&gt;
* Forenthread zur {{Link2Forum|Topic=47729|LinkText=&amp;quot;Firmware Versionsprüfung&amp;quot;}}&lt;br /&gt;
* [http://git.zerfleddert.de/hmcfgusb/ Firmware Update Tool] von mgernoth&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Firmware_Update&amp;diff=17887</id>
		<title>HomeMatic Firmware Update</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Firmware_Update&amp;diff=17887"/>
		<updated>2016-12-19T09:37:49Z</updated>

		<summary type="html">&lt;p&gt;LWith: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Seit 2014 ist es möglich, bei einigen [[HomeMatic]] Komponenten selbst Firmware Updates durchzuführen. Vorher ging das nur per CCU oder durch Einsenden des Gerätes an ELV.&lt;br /&gt;
Dabei gibt es verschiedene Möglichkeiten das Firmware Update durchzuführen. Um in Fhem die aktuelle Firmware nach dem Update angezeigt zu bekommen, ist ein erneutes Pairen mit Fhem notwendig. Es muss aber nicht gelöscht oder zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
== Varianten für Firmwareupdates ==&lt;br /&gt;
=== Firmware Update mit CUL/HM-CFG-USB/HMUARTLGW unter FHEM ===&lt;br /&gt;
FW Updates sind in FHEM möglich. Benötigt wird dafür ein [[CUL]] oder ein [[HM-CFG-USB USB Konfigurations-Adapter|HM-CFG-USB]] oder ein [[HMUARTLGW]]. Mit einem [[HMLAN]] ist ein Update nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Vor dem Update ist sicherzustellen, dass das korrekte IO für das Device genutzt wird (falls mehrere IOs im System zu Verfügung stehen). Siehe Attribut IODev und IOgrp bei der Verwendung einer [[Virtueller Controller VCCU|VCCU]]. Ein HMLAN kann mit dem Befehl: &amp;lt;code&amp;gt;set &amp;lt;HMLAN Name&amp;gt; close&amp;lt;/code&amp;gt; temporär ausgeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Um das Update durchführen zu können, wird die in dem entsprechenden Zip/tgz-File vorhandene .eq3-Datei benötigt. Bitte genau darauf achten, dass nicht versehentlich eine falsches Firmware-Datei verwendet wird. Der Vorgang selbst erfolgt mittels folgendem Befehl:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; fwUpdate &amp;lt;filename&amp;gt; &amp;lt;nowiki&amp;gt;[&amp;lt;time&amp;gt;]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;filename&amp;gt; ist der Name der .eq3 Datei inklusive absolutem oder relativem Pfad zu fhem-Root.&lt;br /&gt;
Die Angabe von [&amp;lt;time&amp;gt;] ist optional. Es ist die Zeit in Sekunden, die FHEM wartet, bis das Device in den Bootloader-Modus versetzt wird. Bei den meisten Devices ist die Zeit nicht notwendig, da FHEM das Gerät selbst in den Bootloader-Mode versetzen kann.&lt;br /&gt;
&lt;br /&gt;
Bei einigen älteren FW-Versionen wie z.B. bei den [[HM-CC-RT-DN]] v1.0 geht das allerdings nicht automatisch. Um den Flashvorgang zu starten, müssen hier noch die Batterien entfernt werden und beim wiedereinlegen die beiden äußeren Knöpfe gedrückt werden. Jene Zeit, die man für eben diese Aktion benötigt, wird hier eingegeben. &lt;br /&gt;
&lt;br /&gt;
Wichtig: während des Updates können keine weiteren Nachrichten in FHEM von Homematic verarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Da nach dem Update immer noch die alte FW-Version in FHEM steht, kann man entweder bei einigen Geräten die Version mit&lt;br /&gt;
:&amp;lt;code&amp;gt; set &amp;lt;device&amp;gt; getVersion &amp;lt;/code&amp;gt;&lt;br /&gt;
auslesen oder wenn das Kommando wie z.B. bei den oben genannten Heizkörperventilen nicht zur Verfügung steht, genügt es, am Gerät selbst die Anlerntaste zu drücken (was am Beispiel der RTs bedeutet, dass die Boost-Taste für mindestens drei Sekunden gedrückt werden  muss). Nach der Aktualisierung der Firmware-Information in Fhem, muss die [[Konfiguration]] noch gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Update mit CUL/HM-CFG-USB unter Linux ===&lt;br /&gt;
Für Linux hat mgernoth ein Updatetool erstellt.&lt;br /&gt;
&lt;br /&gt;
Zunächst muss sichergestellt werden, dass alle benötigten Pakete installiert sind. Um das Tool zu installieren und auszuführen, müssen die folgenden Pakete mit den gezeigten Befehlen installiert werden. Unter Debian:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libusb-1.0-0-dev git build-essential&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Unter OpenSuse 13.2 64 Bit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo zypper install libusb-1.0-0-dev git &lt;br /&gt;
sudo zypper install --type pattern devel_basis&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als nächstes wird der Sourcecode für das Tool heruntergeladen (vorher z.B. in den Pfad &amp;lt;code&amp;gt;/usr/src&amp;lt;/code&amp;gt; wechseln):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git://git.zerfleddert.de/hmcfgusb&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Und mit den Anweisungen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hmcfgusb&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
wird daraus eine ausführbare Datei erstellt.&lt;br /&gt;
&lt;br /&gt;
Weiterhin muss die nötige Firmware heruntergeladen und entpackt werden. Die offiziellen Updates gibt es unter [http://www.eq-3.de/downloads.html eq-3 Downloads]. Die Befehle, um beispielsweise die benötigte Datei für die Firmware Version 1.4 des HM-CC-RT-DN zu erhalten lauten:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget http://www.eq-3.de/Downloads/Software/Firmware/hm_cc_rt_dn_update_V1_4_001_141020.tgz&lt;br /&gt;
tar xvzf hm_cc_rt_dn_update_V1_4_001_141020.tgz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Zu guter Letzt muss noch das Tool mit einigen Parametern und der Seriennummer des HomeMatic Devices aufgerufen werden. Für ein Update mit einem CUL (&amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; ist in diesem Beispiel die Adresse des CULs) muss folgendes eingegeben werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./flash-ota -c /dev/ttyACM0 -f &amp;lt;FirmwareImageName&amp;gt;.eq3 -s &amp;lt;DeviceSerialNo&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Für ein Update mit einem COC muss folgendes eingegeben werden (/dev/ttyAMA0):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./flash-ota -c /dev/ttyAMA0 -f &amp;lt;FirmwareImageName&amp;gt;.eq3 -s &amp;lt;DeviceSerialNo&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Für ein Update mit HM-CFG-USB&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./flash-ota -f &amp;lt;FirmwareImageName&amp;gt;.eq3 -s &amp;lt;DeviceSerialNo&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nun muss nur noch das HomeMatic Gerät in den Update-Modus versetzt werden. Wie das geht, steht in der jeweils mit der Firmwaredatei gelieferten &amp;quot;readme&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Update mit HM-CFG-USB unter Windows ===&lt;br /&gt;
Für ein Firmwareupdate unter Windows wird das &amp;quot;HomeMatic Firmware Update Tool&amp;quot; von eq-3 benötigt: [http://www.eq-3.de/downloads.html eQ-3 Downloads]. Zur Zeit ist das Update damit nur mit dem HM-CFG-USB-2 möglich, nicht aber mit dem HM-CFG-LAN oder dem HM-CFG-USB der ersten Generation.&lt;br /&gt;
&lt;br /&gt;
Nach dem Start muss die Seriennummer des HomeMatic-Device eingegeben und die Firmware-Datei ausgewählt werden. Dann wird das Update-Tool durch einen Klick auf den entsprechenden Button in &amp;quot;Bereitschaft&amp;quot; gesetzt und anschließend muss das HomeMatic-Gerät in den Update-Modus versetzt werden. Bei Unterputz-Geräten ist das eventuell gar nicht so einfach, man kann in diesem Fall aber von FHEM aus dem Gerät ein Kommando schicken um es in den Bootloader Modus zu bringen. Dies geht mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; fwUpdate onlyEnterBootLoader&amp;lt;/code&amp;gt;&lt;br /&gt;
Direkt danach sollte das Update Tool mit seiner Arbeit beginnen.&lt;br /&gt;
&lt;br /&gt;
Falls das Update-Tool beim Auswählen der Firmware-Datei abstürzt (&amp;quot;Home Matic Firmware Update Tool funktioniert nicht mehr&amp;quot;), dann stimmt wahrscheinlich etwas mit der Firmware-Datei nicht. Die Datei darf nicht ausgepackt, sondern muss als &amp;quot;.tar.gz&amp;quot;-Datei, so wie sie heruntergeladen wurde, benutzt werden. Es kann Probleme geben, wenn die Datei mit dem Internet Explorer heruntergeladen wurde. Am einfachsten ist es, die Datei mit einem anderen Browser herunterzuladen.&lt;br /&gt;
&lt;br /&gt;
== Mögliche Probleme ==&lt;br /&gt;
Lässt sich die Firmware nicht OTA auf das HomeMatic-Device flashen, kann dies folgende Ursachen haben:&lt;br /&gt;
* Die Fhem-Software ist nicht auf dem neuesten Stand. Bitte vorher ein &#039;&#039;update&#039;&#039; durchführen.&lt;br /&gt;
* &#039;&#039;&#039;Entfernung&#039;&#039;&#039; zwischen Sender und Empfänger &#039;&#039;&#039;zu klein&#039;&#039;&#039;. 1,5 bis 2 m Abstand sollten beide Geräte zueinander mindestens haben.&lt;br /&gt;
* &#039;&#039;&#039;Entfernung&#039;&#039;&#039; zwischen Sender und Empfänger &#039;&#039;&#039;zu groß&#039;&#039;&#039;. Überprüfen Sie die RSSI-Werte des zu flashenden Device. Schlechter als - 70 sollten sie nicht sein (also keine - 75 oder noch kleiner). Ansonsten muss der Abstand für die Dauer des Flashens verringert werden.&lt;br /&gt;
&lt;br /&gt;
== Tool zur Firmware Versionsprüfung ==&lt;br /&gt;
[[Datei:HM-FWUpdate-eQ3.png|mini|400px|right|Beispiel einer Liste der relevanten Firmware Updates&amp;lt;br /&amp;gt;&#039;&#039;&#039;Legende:&#039;&#039;&#039;&amp;lt;br /&amp;gt;1 - Link auf die eQ-3 Download-Seite &amp;lt;br /&amp;gt;2 - Link auf die Details des HTTPMOD Device &amp;lt;br /&amp;gt;3 - Link auf die Details des HomeMatic Device &amp;lt;br /&amp;gt;4 - (Download) Link auf die Firmware Datei &amp;lt;br /&amp;gt;5 - &amp;quot;reread&amp;quot;: Aktualisierung dieser Liste auslösen]]&lt;br /&gt;
Im Fhem-Forum wurden unter dem Titel {{Link2Forum|Topic=47729|LinkText=...Firmware Versionsprüfung}} die erforderlichen Definitionen für ein [[HTTPMOD]]-Device vorgestellt, das &lt;br /&gt;
* für alle HomeMatic Devices der aktuellen Fhem-Umgebung&lt;br /&gt;
* die derzeit benutzte Firmware Version mit&lt;br /&gt;
* einem evtl. auf der eQ-3 Seite verfügbaren Update vergleicht und&lt;br /&gt;
* alle für die aktuelle Installation relevanten Updates in einer Übersicht (siehe Screenshot) darstellt und&lt;br /&gt;
* einmal täglich (alle 86400 Sekunden) automatisch ausgeführt wird; dieses Intervall sollte nicht verkürzt, sondern eher verlängert werden. Im Bedarfsfall kann durch anklicken von &#039;&#039;&#039;&#039;&#039;reread&#039;&#039;&#039;&#039;&#039; eine sofortige Aktualisierung ausgelöst werden.&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollte eine alte (vor dem 15.3.2016) Version dieser Definitionen bereits in Benutzung sein (zu erkennen am Vorhandensein von &#039;&#039;&amp;lt;nowiki&amp;gt;reading0[2|3|4|5]*&amp;lt;/nowiki&amp;gt;&#039;&#039;-Attributen), dann wird empfohlen, das Device mit &amp;lt;code&amp;gt;delete eq3&amp;lt;/code&amp;gt; zunächst komplett zu löschen und anschließend neu anzulegen.}}&lt;br /&gt;
Die unten aufgeführten erforderlichen Anweisungen zur Erstellung dieser Übersicht sind&lt;br /&gt;
* im wesentlichen über das Webinterface eingebbar (können aber auch &amp;quot;en bloc&amp;quot; in die fhem.cfg eingetragen werden - auch wenn das eigentlich nicht empfohlen ist)&lt;br /&gt;
* der umfangreiche Perl-Code für das Attribut &#039;&#039;userReadings&#039;&#039; ist dargestellt für die Eingabe über das [[FHEMWEB|Webinterface]]&lt;br /&gt;
* für das Attribut &#039;&#039;stateFormat&#039;&#039; ist die mehrzeilige Eingabe (zumindest derzeit, März 2016) nicht unterstützt, daher wurde der Code in eine Subroutine ausgelagert&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;{{Randnotiz|RNTyp=r|RNText=&#039;&#039;&#039;Wichtige Änderungen:&#039;&#039;&#039;&lt;br /&gt;
22.05.2016 - &#039;&#039;reading01Regex&#039;&#039; und &#039;&#039;reading01Format&#039;&#039; angepasst (eQ-3)&lt;br /&gt;
}}&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Basis-Definitionen für Device eq3 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define eq3 HTTPMOD http://www.eq-3.de/service/downloads.html 86400&lt;br /&gt;
attr eq3 userattr enableControlSet event-on-change-reading event-on-update-reading reading01AutoNumLen reading01Format reading01Name reading01RegOpt reading01RegOpt:s,i,g reading01Regex readingMaxAge readingMaxAgeReplacementMode readingMaxAgeReplacementMode:text,expression,delete requestData.* showError showMatched stateFormat userReadings webCmd&lt;br /&gt;
attr eq3 enableControlSet 1&lt;br /&gt;
attr eq3 event-on-change-reading .*&lt;br /&gt;
attr eq3 event-on-update-reading LAST_ERROR,MATCHED_READINGS&lt;br /&gt;
attr eq3 reading01AutoNumLen 2&lt;br /&gt;
attr eq3 reading01Format http://www.eq-3.de/%s&lt;br /&gt;
attr eq3 reading01Name fw_link&lt;br /&gt;
attr eq3 reading01RegOpt g&lt;br /&gt;
attr eq3 reading01Regex &amp;lt;a.href=&amp;quot;(Downloads\/Software\/Firmware\/[^&amp;quot;]+)&lt;br /&gt;
attr eq3 readingMaxAge 10&lt;br /&gt;
attr eq3 readingMaxAgeReplacementMode delete&lt;br /&gt;
attr eq3 requestData.* suchtext=&amp;amp;suche_in=2&amp;amp;downloadart=11&lt;br /&gt;
attr eq3 room eq3&lt;br /&gt;
attr eq3 showError 1&lt;br /&gt;
attr eq3 showMatched 1&lt;br /&gt;
attr eq3 stateFormat {eq3StateFormat}&lt;br /&gt;
attr eq3 webCmd reread&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definition/Code für Attribut userReadings ===&lt;br /&gt;
Der &amp;quot;Zugang&amp;quot; zur Eingabe des Attributs &#039;&#039;stateFormat&#039;&#039; erfolgt über die Details des Device &#039;&#039;&#039;eq3&#039;&#039;&#039; (URL: ...8083/fhem?detail=eq3).&lt;br /&gt;
[[Datei:HM-FWUpdate-eQ3-userReadings.png|mini|640px|left|&amp;quot;Der Weg&amp;quot; zur Eingabe von &#039;&#039;userReadings&#039;&#039;; durch Klick in das Eingabefeld öffnet sich ein separates Fenster.]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;Der Perl-Code, der für das Attribut &#039;&#039;userReadings&#039;&#039; eingegeben werden muss:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
newFwForDevices:MATCHED_READINGS:.* {&lt;br /&gt;
  my $ret = &amp;quot;&amp;quot;;&lt;br /&gt;
  my @data;&lt;br /&gt;
  my @eq3FwList = map{@data = ReadingsVal(&amp;quot;eq3&amp;quot;,&amp;quot;fw_link-&amp;quot;.$_,&amp;quot;?&amp;quot;) =~ m/Firmware\/(.*?)_update_V([\d_]+)_(\d\d)(\d\d)(\d\d)/; &lt;br /&gt;
            $data[0] =~ s/_/-/g;&lt;br /&gt;
            sprintf(&amp;quot;%s:%s:%s.%s.%s:%s&amp;quot;,$data[0],$data[1],$data[4],$data[3],&amp;quot;20&amp;quot;.$data[2],$_);&lt;br /&gt;
            } ReadingsVal(&amp;quot;eq3&amp;quot;,&amp;quot;MATCHED_READINGS&amp;quot;,&amp;quot;?&amp;quot;) =~ m/fw_link-(\d\d)/g;&lt;br /&gt;
            &lt;br /&gt;
  foreach my $dev (devspec2array(&amp;quot;TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)&amp;quot;)) {&lt;br /&gt;
    my $md = AttrVal($dev,&amp;quot;model&amp;quot;,&amp;quot;?&amp;quot;);&lt;br /&gt;
    my $v = AttrVal($dev,&amp;quot;firmware&amp;quot;,&amp;quot;0.0&amp;quot;);&lt;br /&gt;
    my ($h,$l) = split(&#039;\.&#039;,$v);&lt;br /&gt;
    foreach my $newFw (grep m/^${md}:/i,@eq3FwList) {&lt;br /&gt;
      my ($nh,$nl,$no,$date,$idx) = $newFw =~ m/^[^:]+:(\d+)_(\d+)_?(\d*):([^:]+):(\d\d)$/;&lt;br /&gt;
      if(($nh &amp;gt; $h) || (($nh == $h) &amp;amp;&amp;amp; ($nl &amp;gt; $l))) {&lt;br /&gt;
        $ret .= &amp;quot;,&amp;quot; if($ret ne &amp;quot;&amp;quot;);&lt;br /&gt;
        $ret .= $dev.&amp;quot; (&amp;quot;.$md.&amp;quot; | fw_&amp;quot;.$v.&amp;quot; =&amp;gt; fw&amp;quot;.$idx.&amp;quot;_&amp;quot;.$nh.&amp;quot;.&amp;quot;.$nl.($no?sprintf(&amp;quot;.%d&amp;quot;,$no):&amp;quot;&amp;quot;).&amp;quot; | &amp;quot;.$date.&amp;quot;)&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return ($ret eq &amp;quot;&amp;quot;)?&amp;quot;no fw-updates needed!&amp;quot;:$ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definition/Code für Attribut stateFormat ===&lt;br /&gt;
Da der Code für &#039;&#039;stateFormat&#039;&#039; recht umfangreich ist, wäre er als Einzeiler kaum sinnvoll zu verwalten, würde also ohnehin meistens über einen externen Editor bearbeitet werden. Daher wurde er als eigene (Sub-)Routine mit dem Namen &#039;&#039;eq3StateFormat&#039;&#039; in (z.B.) [[99_myUtils anlegen|99_myUtils]] ausgelagert:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub eq3StateFormat() {&lt;br /&gt;
  my $name = &amp;quot;eq3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my $ret =&amp;quot;&amp;quot;;&lt;br /&gt;
  my $lastCheck = ReadingsTimestamp($name,&amp;quot;MATCHED_READINGS&amp;quot;,&amp;quot;???&amp;quot;);&lt;br /&gt;
  $ret .= &#039;&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&#039;;   &lt;br /&gt;
  $ret .= &#039;last &amp;lt;a title=&amp;quot;eq3-downloads&amp;quot; href=&amp;quot;http://www.eq-3.de/downloads.html&amp;quot;&amp;gt;homematic&amp;lt;/a&amp;gt;-fw-check =&amp;gt; &#039;.$lastCheck;    &lt;br /&gt;
  $ret .= &#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;;    &lt;br /&gt;
  $ret .= &#039;&amp;lt;pre&amp;gt;&#039;;   &lt;br /&gt;
  $ret .= &amp;quot;| device                  | model                   | old_fw | new_fw | release    |\n&amp;quot;;  &lt;br /&gt;
  $ret .= &amp;quot;------------------------------------------------------------------------------------\n&amp;quot;;  &lt;br /&gt;
  my $check = ReadingsVal($name,&amp;quot;newFwForDevices&amp;quot;,&amp;quot;???&amp;quot;);    &lt;br /&gt;
  if($check eq &amp;quot;no fw-updates needed!&amp;quot;) {        &lt;br /&gt;
    $ret .= &#039;| &#039;.$check.&#039;                                                            |&#039;;     &lt;br /&gt;
  } else {         &lt;br /&gt;
    my @devices = split(&#039;,&#039;,$check);         &lt;br /&gt;
    foreach my $devStr (@devices) {&lt;br /&gt;
      my ($dev,$md,$ofw,$idx,$nfw,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\sfw_(\d+\.\d+)\s=&amp;gt;\sfw(\d\d)_([\d\.]+)\s\|\s([^\)]+)\)$/;          &lt;br /&gt;
      my $link = ReadingsVal($name,&amp;quot;fw_link-&amp;quot;.$idx,&amp;quot;???&amp;quot;);           &lt;br /&gt;
      $ret .= &#039;| &#039;;          &lt;br /&gt;
      $ret .= &#039;&amp;lt;a href=&amp;quot;/fhem?detail=&#039;.$dev.&#039;&amp;quot;&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%-23s&amp;quot;,$dev);             &lt;br /&gt;
      $ret .= &#039;&amp;lt;/a&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= &#039;&amp;lt;b&#039;.(($md eq &amp;quot;?&amp;quot;)?&#039; title=&amp;quot;missing attribute model =&amp;gt; set device in teach mode to receive missing data&amp;quot; style=&amp;quot;color:yellow&amp;quot;&#039;:&#039; style=&amp;quot;color:lightgray&amp;quot;&#039;).&#039;&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%-23s&amp;quot;,$md);          &lt;br /&gt;
      $ret .= &#039;&amp;lt;/b&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= &#039;&amp;lt;b&#039;.(($ofw eq &amp;quot;0.0&amp;quot;)?&#039; title=&amp;quot;missing attribute firmware =&amp;gt; set device in teach mode to receive missing data&amp;quot; style=&amp;quot;color:yellow&amp;quot;&#039;:&#039; style=&amp;quot;color:lightgray&amp;quot;&#039;).&#039;&amp;gt;&#039;;              &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%6s&amp;quot;,$ofw);           &lt;br /&gt;
      $ret .= &#039;&amp;lt;/b&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= &#039;&amp;lt;a title=&amp;quot;eq3-firmware.tgz&amp;quot; href=&amp;quot;&#039;.$link.&#039;&amp;quot;&amp;gt;&#039;;           &lt;br /&gt;
      $ret .= &#039;&amp;lt;b style=&amp;quot;color:red&amp;quot;&amp;gt;&#039;;           &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%6s&amp;quot;,$nfw);           &lt;br /&gt;
      $ret .= &#039;&amp;lt;/b&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &#039;&amp;lt;/a&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%-10s&amp;quot;,$date);            &lt;br /&gt;
      $ret .= &amp;quot; |\n&amp;quot;;        &lt;br /&gt;
    }   &lt;br /&gt;
  }  &lt;br /&gt;
  $ret .= &#039;&amp;lt;/pre&amp;gt;&#039;;  &lt;br /&gt;
  $ret .= &#039;&amp;lt;/div&amp;gt;&#039;;  &lt;br /&gt;
  return $ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sondersituationen ===&lt;br /&gt;
[[Datei:HM-FWUpdate-eQ3-check.png|mini|455px|right|Fehlerbedingung: Attribut &#039;&#039;firmware&#039;&#039; nicht gesetzt]]&lt;br /&gt;
Das Tool überprüft gleichzeitig auch bestimmte Rahmenbedingungen, so z.B., ob bei allen HomeMatic Devices die Attribute &#039;&#039;model&#039;&#039; und &#039;&#039;firmware&#039;&#039; gesetzt sind. Sollte das nicht der Fall sein, wird das Device in der Liste &lt;br /&gt;
* mit einem gelben &amp;quot;old_fw&amp;quot; Wert von 0.0 geführt; befindet sich der Mauszeiger über dem &amp;quot;0.0&amp;quot;, wird der Hinweistext &#039;&#039;missing attribute firmware =&amp;gt; set device in teach mode to receive missing data&#039;&#039; angezeigt (siehe Beispiel im Screenshot)&lt;br /&gt;
* mit einem gelben {{Taste|?}} in der Spalte &amp;quot;model&amp;quot; angezeigt; befindet sich der Mauszeiger über dem &amp;quot;?&amp;quot;, wird der Hinweistext &#039;&#039;missing attribute model =&amp;gt; set device in teach mode to receive missing data&#039;&#039; angezeigt&lt;br /&gt;
In diesem Fall sollte bei dem betreffenden Gerät versucht werden, mit &#039;&#039;getConfig&#039;&#039; die Daten zu aktualisieren bzw. vervollständigen.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus ist zu beachten, dass die Firmware-Version in den HomeMatic Geräten zwei&amp;quot;teilig&amp;quot; (Version.Release) abgelegt ist, die Firmware Update-Dateien jedoch drei&amp;quot;teilige&amp;quot; Versionskennungen (Version_Release_???) haben. Für den Vergleich, ob neue Firmware verfügbar ist, kann natürlich nur die zweiteilige Kennung verwendet werden, eine Änderung im dritten Teil der Versionskennung kann daher nicht automatisch erkannt werden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.eq-3.de/downloads.html Firmware Download] Seite von eq-3&lt;br /&gt;
* Forenthread zur {{Link2Forum|Topic=47729|LinkText=&amp;quot;Firmware Versionsprüfung&amp;quot;}}&lt;br /&gt;
* [http://git.zerfleddert.de/hmcfgusb/ Firmware Update Tool] von mgernoth&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Firmware_Update&amp;diff=17886</id>
		<title>HomeMatic Firmware Update</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Firmware_Update&amp;diff=17886"/>
		<updated>2016-12-19T09:37:15Z</updated>

		<summary type="html">&lt;p&gt;LWith: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Seit 2014 ist es möglich, bei einigen [[HomeMatic]] Komponenten selbst Firmware Updates durchzuführen. Vorher ging das nur per CCU oder durch Einsenden des Gerätes an ELV.&lt;br /&gt;
Dabei gibt es verschiedene Möglichkeiten das Firmware Update durchzuführen. Um in Fhem die aktuelle Firmware nach dem Update angezeigt zu bekommen, ist ein erneutes Pairen mit Fhem notwendig. Es muss aber nicht gelöscht oder zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
== Varianten für Firmwareupdates ==&lt;br /&gt;
=== Firmware Update mit CUL/HM-CFG-USB/HMUARTLGW unter FHEM ===&lt;br /&gt;
FW Updates sind in FHEM möglich. Benötigt wird dafür ein [[CUL]] oder ein [[HM-CFG-USB USB Konfigurations-Adapter|HM-CFG-USB]] oder ein [[HMUARTLGW]]. Mit einem [[HMLAN]] ist ein Update nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Vor dem Update ist sicherzustellen, dass das korrekte IO für das Device genutzt wird (falls mehrere IOs im System zu Verfügung stehen). Siehe Attribut IODev und IOgrp bei der Verwendung einer [[Virtueller Controller VCCU|VCCU]]. Ein HMLAN kann mit dem Befehl :&amp;lt;code&amp;gt;set &amp;lt;HMLAN Name&amp;gt; close&amp;lt;/code&amp;gt; temporär ausgeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Um das Update durchführen zu können, wird die in dem entsprechenden Zip/tgz-File vorhandene .eq3-Datei benötigt. Bitte genau darauf achten, dass nicht versehentlich eine falsches Firmware-Datei verwendet wird. Der Vorgang selbst erfolgt mittels folgendem Befehl:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; fwUpdate &amp;lt;filename&amp;gt; &amp;lt;nowiki&amp;gt;[&amp;lt;time&amp;gt;]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;filename&amp;gt; ist der Name der .eq3 Datei inklusive absolutem oder relativem Pfad zu fhem-Root.&lt;br /&gt;
Die Angabe von [&amp;lt;time&amp;gt;] ist optional. Es ist die Zeit in Sekunden, die FHEM wartet, bis das Device in den Bootloader-Modus versetzt wird. Bei den meisten Devices ist die Zeit nicht notwendig, da FHEM das Gerät selbst in den Bootloader-Mode versetzen kann.&lt;br /&gt;
&lt;br /&gt;
Bei einigen älteren FW-Versionen wie z.B. bei den [[HM-CC-RT-DN]] v1.0 geht das allerdings nicht automatisch. Um den Flashvorgang zu starten, müssen hier noch die Batterien entfernt werden und beim wiedereinlegen die beiden äußeren Knöpfe gedrückt werden. Jene Zeit, die man für eben diese Aktion benötigt, wird hier eingegeben. &lt;br /&gt;
&lt;br /&gt;
Wichtig: während des Updates können keine weiteren Nachrichten in FHEM von Homematic verarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Da nach dem Update immer noch die alte FW-Version in FHEM steht, kann man entweder bei einigen Geräten die Version mit&lt;br /&gt;
:&amp;lt;code&amp;gt; set &amp;lt;device&amp;gt; getVersion &amp;lt;/code&amp;gt;&lt;br /&gt;
auslesen oder wenn das Kommando wie z.B. bei den oben genannten Heizkörperventilen nicht zur Verfügung steht, genügt es, am Gerät selbst die Anlerntaste zu drücken (was am Beispiel der RTs bedeutet, dass die Boost-Taste für mindestens drei Sekunden gedrückt werden  muss). Nach der Aktualisierung der Firmware-Information in Fhem, muss die [[Konfiguration]] noch gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Update mit CUL/HM-CFG-USB unter Linux ===&lt;br /&gt;
Für Linux hat mgernoth ein Updatetool erstellt.&lt;br /&gt;
&lt;br /&gt;
Zunächst muss sichergestellt werden, dass alle benötigten Pakete installiert sind. Um das Tool zu installieren und auszuführen, müssen die folgenden Pakete mit den gezeigten Befehlen installiert werden. Unter Debian:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libusb-1.0-0-dev git build-essential&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Unter OpenSuse 13.2 64 Bit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo zypper install libusb-1.0-0-dev git &lt;br /&gt;
sudo zypper install --type pattern devel_basis&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als nächstes wird der Sourcecode für das Tool heruntergeladen (vorher z.B. in den Pfad &amp;lt;code&amp;gt;/usr/src&amp;lt;/code&amp;gt; wechseln):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git://git.zerfleddert.de/hmcfgusb&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Und mit den Anweisungen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hmcfgusb&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
wird daraus eine ausführbare Datei erstellt.&lt;br /&gt;
&lt;br /&gt;
Weiterhin muss die nötige Firmware heruntergeladen und entpackt werden. Die offiziellen Updates gibt es unter [http://www.eq-3.de/downloads.html eq-3 Downloads]. Die Befehle, um beispielsweise die benötigte Datei für die Firmware Version 1.4 des HM-CC-RT-DN zu erhalten lauten:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget http://www.eq-3.de/Downloads/Software/Firmware/hm_cc_rt_dn_update_V1_4_001_141020.tgz&lt;br /&gt;
tar xvzf hm_cc_rt_dn_update_V1_4_001_141020.tgz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Zu guter Letzt muss noch das Tool mit einigen Parametern und der Seriennummer des HomeMatic Devices aufgerufen werden. Für ein Update mit einem CUL (&amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; ist in diesem Beispiel die Adresse des CULs) muss folgendes eingegeben werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./flash-ota -c /dev/ttyACM0 -f &amp;lt;FirmwareImageName&amp;gt;.eq3 -s &amp;lt;DeviceSerialNo&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Für ein Update mit einem COC muss folgendes eingegeben werden (/dev/ttyAMA0):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./flash-ota -c /dev/ttyAMA0 -f &amp;lt;FirmwareImageName&amp;gt;.eq3 -s &amp;lt;DeviceSerialNo&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Für ein Update mit HM-CFG-USB&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./flash-ota -f &amp;lt;FirmwareImageName&amp;gt;.eq3 -s &amp;lt;DeviceSerialNo&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nun muss nur noch das HomeMatic Gerät in den Update-Modus versetzt werden. Wie das geht, steht in der jeweils mit der Firmwaredatei gelieferten &amp;quot;readme&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Update mit HM-CFG-USB unter Windows ===&lt;br /&gt;
Für ein Firmwareupdate unter Windows wird das &amp;quot;HomeMatic Firmware Update Tool&amp;quot; von eq-3 benötigt: [http://www.eq-3.de/downloads.html eQ-3 Downloads]. Zur Zeit ist das Update damit nur mit dem HM-CFG-USB-2 möglich, nicht aber mit dem HM-CFG-LAN oder dem HM-CFG-USB der ersten Generation.&lt;br /&gt;
&lt;br /&gt;
Nach dem Start muss die Seriennummer des HomeMatic-Device eingegeben und die Firmware-Datei ausgewählt werden. Dann wird das Update-Tool durch einen Klick auf den entsprechenden Button in &amp;quot;Bereitschaft&amp;quot; gesetzt und anschließend muss das HomeMatic-Gerät in den Update-Modus versetzt werden. Bei Unterputz-Geräten ist das eventuell gar nicht so einfach, man kann in diesem Fall aber von FHEM aus dem Gerät ein Kommando schicken um es in den Bootloader Modus zu bringen. Dies geht mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; fwUpdate onlyEnterBootLoader&amp;lt;/code&amp;gt;&lt;br /&gt;
Direkt danach sollte das Update Tool mit seiner Arbeit beginnen.&lt;br /&gt;
&lt;br /&gt;
Falls das Update-Tool beim Auswählen der Firmware-Datei abstürzt (&amp;quot;Home Matic Firmware Update Tool funktioniert nicht mehr&amp;quot;), dann stimmt wahrscheinlich etwas mit der Firmware-Datei nicht. Die Datei darf nicht ausgepackt, sondern muss als &amp;quot;.tar.gz&amp;quot;-Datei, so wie sie heruntergeladen wurde, benutzt werden. Es kann Probleme geben, wenn die Datei mit dem Internet Explorer heruntergeladen wurde. Am einfachsten ist es, die Datei mit einem anderen Browser herunterzuladen.&lt;br /&gt;
&lt;br /&gt;
== Mögliche Probleme ==&lt;br /&gt;
Lässt sich die Firmware nicht OTA auf das HomeMatic-Device flashen, kann dies folgende Ursachen haben:&lt;br /&gt;
* Die Fhem-Software ist nicht auf dem neuesten Stand. Bitte vorher ein &#039;&#039;update&#039;&#039; durchführen.&lt;br /&gt;
* &#039;&#039;&#039;Entfernung&#039;&#039;&#039; zwischen Sender und Empfänger &#039;&#039;&#039;zu klein&#039;&#039;&#039;. 1,5 bis 2 m Abstand sollten beide Geräte zueinander mindestens haben.&lt;br /&gt;
* &#039;&#039;&#039;Entfernung&#039;&#039;&#039; zwischen Sender und Empfänger &#039;&#039;&#039;zu groß&#039;&#039;&#039;. Überprüfen Sie die RSSI-Werte des zu flashenden Device. Schlechter als - 70 sollten sie nicht sein (also keine - 75 oder noch kleiner). Ansonsten muss der Abstand für die Dauer des Flashens verringert werden.&lt;br /&gt;
&lt;br /&gt;
== Tool zur Firmware Versionsprüfung ==&lt;br /&gt;
[[Datei:HM-FWUpdate-eQ3.png|mini|400px|right|Beispiel einer Liste der relevanten Firmware Updates&amp;lt;br /&amp;gt;&#039;&#039;&#039;Legende:&#039;&#039;&#039;&amp;lt;br /&amp;gt;1 - Link auf die eQ-3 Download-Seite &amp;lt;br /&amp;gt;2 - Link auf die Details des HTTPMOD Device &amp;lt;br /&amp;gt;3 - Link auf die Details des HomeMatic Device &amp;lt;br /&amp;gt;4 - (Download) Link auf die Firmware Datei &amp;lt;br /&amp;gt;5 - &amp;quot;reread&amp;quot;: Aktualisierung dieser Liste auslösen]]&lt;br /&gt;
Im Fhem-Forum wurden unter dem Titel {{Link2Forum|Topic=47729|LinkText=...Firmware Versionsprüfung}} die erforderlichen Definitionen für ein [[HTTPMOD]]-Device vorgestellt, das &lt;br /&gt;
* für alle HomeMatic Devices der aktuellen Fhem-Umgebung&lt;br /&gt;
* die derzeit benutzte Firmware Version mit&lt;br /&gt;
* einem evtl. auf der eQ-3 Seite verfügbaren Update vergleicht und&lt;br /&gt;
* alle für die aktuelle Installation relevanten Updates in einer Übersicht (siehe Screenshot) darstellt und&lt;br /&gt;
* einmal täglich (alle 86400 Sekunden) automatisch ausgeführt wird; dieses Intervall sollte nicht verkürzt, sondern eher verlängert werden. Im Bedarfsfall kann durch anklicken von &#039;&#039;&#039;&#039;&#039;reread&#039;&#039;&#039;&#039;&#039; eine sofortige Aktualisierung ausgelöst werden.&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollte eine alte (vor dem 15.3.2016) Version dieser Definitionen bereits in Benutzung sein (zu erkennen am Vorhandensein von &#039;&#039;&amp;lt;nowiki&amp;gt;reading0[2|3|4|5]*&amp;lt;/nowiki&amp;gt;&#039;&#039;-Attributen), dann wird empfohlen, das Device mit &amp;lt;code&amp;gt;delete eq3&amp;lt;/code&amp;gt; zunächst komplett zu löschen und anschließend neu anzulegen.}}&lt;br /&gt;
Die unten aufgeführten erforderlichen Anweisungen zur Erstellung dieser Übersicht sind&lt;br /&gt;
* im wesentlichen über das Webinterface eingebbar (können aber auch &amp;quot;en bloc&amp;quot; in die fhem.cfg eingetragen werden - auch wenn das eigentlich nicht empfohlen ist)&lt;br /&gt;
* der umfangreiche Perl-Code für das Attribut &#039;&#039;userReadings&#039;&#039; ist dargestellt für die Eingabe über das [[FHEMWEB|Webinterface]]&lt;br /&gt;
* für das Attribut &#039;&#039;stateFormat&#039;&#039; ist die mehrzeilige Eingabe (zumindest derzeit, März 2016) nicht unterstützt, daher wurde der Code in eine Subroutine ausgelagert&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;{{Randnotiz|RNTyp=r|RNText=&#039;&#039;&#039;Wichtige Änderungen:&#039;&#039;&#039;&lt;br /&gt;
22.05.2016 - &#039;&#039;reading01Regex&#039;&#039; und &#039;&#039;reading01Format&#039;&#039; angepasst (eQ-3)&lt;br /&gt;
}}&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Basis-Definitionen für Device eq3 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define eq3 HTTPMOD http://www.eq-3.de/service/downloads.html 86400&lt;br /&gt;
attr eq3 userattr enableControlSet event-on-change-reading event-on-update-reading reading01AutoNumLen reading01Format reading01Name reading01RegOpt reading01RegOpt:s,i,g reading01Regex readingMaxAge readingMaxAgeReplacementMode readingMaxAgeReplacementMode:text,expression,delete requestData.* showError showMatched stateFormat userReadings webCmd&lt;br /&gt;
attr eq3 enableControlSet 1&lt;br /&gt;
attr eq3 event-on-change-reading .*&lt;br /&gt;
attr eq3 event-on-update-reading LAST_ERROR,MATCHED_READINGS&lt;br /&gt;
attr eq3 reading01AutoNumLen 2&lt;br /&gt;
attr eq3 reading01Format http://www.eq-3.de/%s&lt;br /&gt;
attr eq3 reading01Name fw_link&lt;br /&gt;
attr eq3 reading01RegOpt g&lt;br /&gt;
attr eq3 reading01Regex &amp;lt;a.href=&amp;quot;(Downloads\/Software\/Firmware\/[^&amp;quot;]+)&lt;br /&gt;
attr eq3 readingMaxAge 10&lt;br /&gt;
attr eq3 readingMaxAgeReplacementMode delete&lt;br /&gt;
attr eq3 requestData.* suchtext=&amp;amp;suche_in=2&amp;amp;downloadart=11&lt;br /&gt;
attr eq3 room eq3&lt;br /&gt;
attr eq3 showError 1&lt;br /&gt;
attr eq3 showMatched 1&lt;br /&gt;
attr eq3 stateFormat {eq3StateFormat}&lt;br /&gt;
attr eq3 webCmd reread&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definition/Code für Attribut userReadings ===&lt;br /&gt;
Der &amp;quot;Zugang&amp;quot; zur Eingabe des Attributs &#039;&#039;stateFormat&#039;&#039; erfolgt über die Details des Device &#039;&#039;&#039;eq3&#039;&#039;&#039; (URL: ...8083/fhem?detail=eq3).&lt;br /&gt;
[[Datei:HM-FWUpdate-eQ3-userReadings.png|mini|640px|left|&amp;quot;Der Weg&amp;quot; zur Eingabe von &#039;&#039;userReadings&#039;&#039;; durch Klick in das Eingabefeld öffnet sich ein separates Fenster.]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;Der Perl-Code, der für das Attribut &#039;&#039;userReadings&#039;&#039; eingegeben werden muss:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
newFwForDevices:MATCHED_READINGS:.* {&lt;br /&gt;
  my $ret = &amp;quot;&amp;quot;;&lt;br /&gt;
  my @data;&lt;br /&gt;
  my @eq3FwList = map{@data = ReadingsVal(&amp;quot;eq3&amp;quot;,&amp;quot;fw_link-&amp;quot;.$_,&amp;quot;?&amp;quot;) =~ m/Firmware\/(.*?)_update_V([\d_]+)_(\d\d)(\d\d)(\d\d)/; &lt;br /&gt;
            $data[0] =~ s/_/-/g;&lt;br /&gt;
            sprintf(&amp;quot;%s:%s:%s.%s.%s:%s&amp;quot;,$data[0],$data[1],$data[4],$data[3],&amp;quot;20&amp;quot;.$data[2],$_);&lt;br /&gt;
            } ReadingsVal(&amp;quot;eq3&amp;quot;,&amp;quot;MATCHED_READINGS&amp;quot;,&amp;quot;?&amp;quot;) =~ m/fw_link-(\d\d)/g;&lt;br /&gt;
            &lt;br /&gt;
  foreach my $dev (devspec2array(&amp;quot;TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)&amp;quot;)) {&lt;br /&gt;
    my $md = AttrVal($dev,&amp;quot;model&amp;quot;,&amp;quot;?&amp;quot;);&lt;br /&gt;
    my $v = AttrVal($dev,&amp;quot;firmware&amp;quot;,&amp;quot;0.0&amp;quot;);&lt;br /&gt;
    my ($h,$l) = split(&#039;\.&#039;,$v);&lt;br /&gt;
    foreach my $newFw (grep m/^${md}:/i,@eq3FwList) {&lt;br /&gt;
      my ($nh,$nl,$no,$date,$idx) = $newFw =~ m/^[^:]+:(\d+)_(\d+)_?(\d*):([^:]+):(\d\d)$/;&lt;br /&gt;
      if(($nh &amp;gt; $h) || (($nh == $h) &amp;amp;&amp;amp; ($nl &amp;gt; $l))) {&lt;br /&gt;
        $ret .= &amp;quot;,&amp;quot; if($ret ne &amp;quot;&amp;quot;);&lt;br /&gt;
        $ret .= $dev.&amp;quot; (&amp;quot;.$md.&amp;quot; | fw_&amp;quot;.$v.&amp;quot; =&amp;gt; fw&amp;quot;.$idx.&amp;quot;_&amp;quot;.$nh.&amp;quot;.&amp;quot;.$nl.($no?sprintf(&amp;quot;.%d&amp;quot;,$no):&amp;quot;&amp;quot;).&amp;quot; | &amp;quot;.$date.&amp;quot;)&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return ($ret eq &amp;quot;&amp;quot;)?&amp;quot;no fw-updates needed!&amp;quot;:$ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definition/Code für Attribut stateFormat ===&lt;br /&gt;
Da der Code für &#039;&#039;stateFormat&#039;&#039; recht umfangreich ist, wäre er als Einzeiler kaum sinnvoll zu verwalten, würde also ohnehin meistens über einen externen Editor bearbeitet werden. Daher wurde er als eigene (Sub-)Routine mit dem Namen &#039;&#039;eq3StateFormat&#039;&#039; in (z.B.) [[99_myUtils anlegen|99_myUtils]] ausgelagert:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub eq3StateFormat() {&lt;br /&gt;
  my $name = &amp;quot;eq3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my $ret =&amp;quot;&amp;quot;;&lt;br /&gt;
  my $lastCheck = ReadingsTimestamp($name,&amp;quot;MATCHED_READINGS&amp;quot;,&amp;quot;???&amp;quot;);&lt;br /&gt;
  $ret .= &#039;&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&#039;;   &lt;br /&gt;
  $ret .= &#039;last &amp;lt;a title=&amp;quot;eq3-downloads&amp;quot; href=&amp;quot;http://www.eq-3.de/downloads.html&amp;quot;&amp;gt;homematic&amp;lt;/a&amp;gt;-fw-check =&amp;gt; &#039;.$lastCheck;    &lt;br /&gt;
  $ret .= &#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;;    &lt;br /&gt;
  $ret .= &#039;&amp;lt;pre&amp;gt;&#039;;   &lt;br /&gt;
  $ret .= &amp;quot;| device                  | model                   | old_fw | new_fw | release    |\n&amp;quot;;  &lt;br /&gt;
  $ret .= &amp;quot;------------------------------------------------------------------------------------\n&amp;quot;;  &lt;br /&gt;
  my $check = ReadingsVal($name,&amp;quot;newFwForDevices&amp;quot;,&amp;quot;???&amp;quot;);    &lt;br /&gt;
  if($check eq &amp;quot;no fw-updates needed!&amp;quot;) {        &lt;br /&gt;
    $ret .= &#039;| &#039;.$check.&#039;                                                            |&#039;;     &lt;br /&gt;
  } else {         &lt;br /&gt;
    my @devices = split(&#039;,&#039;,$check);         &lt;br /&gt;
    foreach my $devStr (@devices) {&lt;br /&gt;
      my ($dev,$md,$ofw,$idx,$nfw,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\sfw_(\d+\.\d+)\s=&amp;gt;\sfw(\d\d)_([\d\.]+)\s\|\s([^\)]+)\)$/;          &lt;br /&gt;
      my $link = ReadingsVal($name,&amp;quot;fw_link-&amp;quot;.$idx,&amp;quot;???&amp;quot;);           &lt;br /&gt;
      $ret .= &#039;| &#039;;          &lt;br /&gt;
      $ret .= &#039;&amp;lt;a href=&amp;quot;/fhem?detail=&#039;.$dev.&#039;&amp;quot;&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%-23s&amp;quot;,$dev);             &lt;br /&gt;
      $ret .= &#039;&amp;lt;/a&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= &#039;&amp;lt;b&#039;.(($md eq &amp;quot;?&amp;quot;)?&#039; title=&amp;quot;missing attribute model =&amp;gt; set device in teach mode to receive missing data&amp;quot; style=&amp;quot;color:yellow&amp;quot;&#039;:&#039; style=&amp;quot;color:lightgray&amp;quot;&#039;).&#039;&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%-23s&amp;quot;,$md);          &lt;br /&gt;
      $ret .= &#039;&amp;lt;/b&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= &#039;&amp;lt;b&#039;.(($ofw eq &amp;quot;0.0&amp;quot;)?&#039; title=&amp;quot;missing attribute firmware =&amp;gt; set device in teach mode to receive missing data&amp;quot; style=&amp;quot;color:yellow&amp;quot;&#039;:&#039; style=&amp;quot;color:lightgray&amp;quot;&#039;).&#039;&amp;gt;&#039;;              &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%6s&amp;quot;,$ofw);           &lt;br /&gt;
      $ret .= &#039;&amp;lt;/b&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= &#039;&amp;lt;a title=&amp;quot;eq3-firmware.tgz&amp;quot; href=&amp;quot;&#039;.$link.&#039;&amp;quot;&amp;gt;&#039;;           &lt;br /&gt;
      $ret .= &#039;&amp;lt;b style=&amp;quot;color:red&amp;quot;&amp;gt;&#039;;           &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%6s&amp;quot;,$nfw);           &lt;br /&gt;
      $ret .= &#039;&amp;lt;/b&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &#039;&amp;lt;/a&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%-10s&amp;quot;,$date);            &lt;br /&gt;
      $ret .= &amp;quot; |\n&amp;quot;;        &lt;br /&gt;
    }   &lt;br /&gt;
  }  &lt;br /&gt;
  $ret .= &#039;&amp;lt;/pre&amp;gt;&#039;;  &lt;br /&gt;
  $ret .= &#039;&amp;lt;/div&amp;gt;&#039;;  &lt;br /&gt;
  return $ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sondersituationen ===&lt;br /&gt;
[[Datei:HM-FWUpdate-eQ3-check.png|mini|455px|right|Fehlerbedingung: Attribut &#039;&#039;firmware&#039;&#039; nicht gesetzt]]&lt;br /&gt;
Das Tool überprüft gleichzeitig auch bestimmte Rahmenbedingungen, so z.B., ob bei allen HomeMatic Devices die Attribute &#039;&#039;model&#039;&#039; und &#039;&#039;firmware&#039;&#039; gesetzt sind. Sollte das nicht der Fall sein, wird das Device in der Liste &lt;br /&gt;
* mit einem gelben &amp;quot;old_fw&amp;quot; Wert von 0.0 geführt; befindet sich der Mauszeiger über dem &amp;quot;0.0&amp;quot;, wird der Hinweistext &#039;&#039;missing attribute firmware =&amp;gt; set device in teach mode to receive missing data&#039;&#039; angezeigt (siehe Beispiel im Screenshot)&lt;br /&gt;
* mit einem gelben {{Taste|?}} in der Spalte &amp;quot;model&amp;quot; angezeigt; befindet sich der Mauszeiger über dem &amp;quot;?&amp;quot;, wird der Hinweistext &#039;&#039;missing attribute model =&amp;gt; set device in teach mode to receive missing data&#039;&#039; angezeigt&lt;br /&gt;
In diesem Fall sollte bei dem betreffenden Gerät versucht werden, mit &#039;&#039;getConfig&#039;&#039; die Daten zu aktualisieren bzw. vervollständigen.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus ist zu beachten, dass die Firmware-Version in den HomeMatic Geräten zwei&amp;quot;teilig&amp;quot; (Version.Release) abgelegt ist, die Firmware Update-Dateien jedoch drei&amp;quot;teilige&amp;quot; Versionskennungen (Version_Release_???) haben. Für den Vergleich, ob neue Firmware verfügbar ist, kann natürlich nur die zweiteilige Kennung verwendet werden, eine Änderung im dritten Teil der Versionskennung kann daher nicht automatisch erkannt werden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.eq-3.de/downloads.html Firmware Download] Seite von eq-3&lt;br /&gt;
* Forenthread zur {{Link2Forum|Topic=47729|LinkText=&amp;quot;Firmware Versionsprüfung&amp;quot;}}&lt;br /&gt;
* [http://git.zerfleddert.de/hmcfgusb/ Firmware Update Tool] von mgernoth&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Firmware_Update&amp;diff=17885</id>
		<title>HomeMatic Firmware Update</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Firmware_Update&amp;diff=17885"/>
		<updated>2016-12-19T09:33:00Z</updated>

		<summary type="html">&lt;p&gt;LWith: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Seit 2014 ist es möglich, bei einigen [[HomeMatic]] Komponenten selbst Firmware Updates durchzuführen. Vorher ging das nur per CCU oder durch Einsenden des Gerätes an ELV.&lt;br /&gt;
Dabei gibt es verschiedene Möglichkeiten das Firmware Update durchzuführen. Um in Fhem die aktuelle Firmware nach dem Update angezeigt zu bekommen, ist ein erneutes Pairen mit Fhem notwendig. Es muss aber nicht gelöscht oder zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
== Varianten für Firmwareupdates ==&lt;br /&gt;
=== Firmware Update mit CUL/HM-CFG-USB/HMUARTLGW unter FHEM ===&lt;br /&gt;
FW Updates sind in FHEM möglich. Benötigt wird dafür ein [[CUL]] oder ein [[HM-CFG-USB USB Konfigurations-Adapter|HM-CFG-USB]] oder ein [[HMUARTLGW]]. Mit einem [[HMLAN]] ist ein Update nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Vor dem Update ist sicherzustellen, dass das korrekte IO für das Device genutzt wird (falls mehrere IOs im System zu Verfügung stehen). Siehe Attribut IODev und IOgrp bei der Verwendung einer vCCU. Ein HMLAN kann mit dem Befehl :&amp;lt;code&amp;gt;set &amp;lt;HMLAN Name&amp;gt; close&amp;lt;/code&amp;gt; temporär ausgeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Um das Update durchführen zu können, wird die in dem entsprechenden Zip/tgz-File vorhandene .eq3-Datei benötigt. Bitte genau darauf achten, dass nicht versehentlich eine falsches Firmware-Datei verwendet wird. Der Vorgang selbst erfolgt mittels folgendem Befehl:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; fwUpdate &amp;lt;filename&amp;gt; &amp;lt;nowiki&amp;gt;[&amp;lt;time&amp;gt;]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;filename&amp;gt; ist der Name der .eq3 Datei inklusive absolutem oder relativem Pfad zu fhem-Root.&lt;br /&gt;
Die Angabe von [&amp;lt;time&amp;gt;] ist optional. Es ist die Zeit in Sekunden, die FHEM wartet, bis das Device in den Bootloader-Modus versetzt wird. Bei den meisten Devices ist die Zeit nicht notwendig, da FHEM das Gerät selbst in den Bootloader-Mode versetzen kann.&lt;br /&gt;
&lt;br /&gt;
Bei einigen älteren FW-Versionen wie z.B. bei den [[HM-CC-RT-DN]] v1.0 geht das allerdings nicht automatisch. Um den Flashvorgang zu starten, müssen hier noch die Batterien entfernt werden und beim wiedereinlegen die beiden äußeren Knöpfe gedrückt werden. Jene Zeit, die man für eben diese Aktion benötigt, wird hier eingegeben. &lt;br /&gt;
&lt;br /&gt;
Wichtig: während des Updates können keine weiteren Nachrichten in FHEM von Homematic verarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Da nach dem Update immer noch die alte FW-Version in FHEM steht, kann man entweder bei einigen Geräten die Version mit&lt;br /&gt;
:&amp;lt;code&amp;gt; set &amp;lt;device&amp;gt; getVersion &amp;lt;/code&amp;gt;&lt;br /&gt;
auslesen oder wenn das Kommando wie z.B. bei den oben genannten Heizkörperventilen nicht zur Verfügung steht, genügt es, am Gerät selbst die Anlerntaste zu drücken (was am Beispiel der RTs bedeutet, dass die Boost-Taste für mindestens drei Sekunden gedrückt werden  muss). Nach der Aktualisierung der Firmware-Information in Fhem, muss die [[Konfiguration]] noch gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Update mit CUL/HM-CFG-USB unter Linux ===&lt;br /&gt;
Für Linux hat mgernoth ein Updatetool erstellt.&lt;br /&gt;
&lt;br /&gt;
Zunächst muss sichergestellt werden, dass alle benötigten Pakete installiert sind. Um das Tool zu installieren und auszuführen, müssen die folgenden Pakete mit den gezeigten Befehlen installiert werden. Unter Debian:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libusb-1.0-0-dev git build-essential&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Unter OpenSuse 13.2 64 Bit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo zypper install libusb-1.0-0-dev git &lt;br /&gt;
sudo zypper install --type pattern devel_basis&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als nächstes wird der Sourcecode für das Tool heruntergeladen (vorher z.B. in den Pfad &amp;lt;code&amp;gt;/usr/src&amp;lt;/code&amp;gt; wechseln):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git://git.zerfleddert.de/hmcfgusb&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Und mit den Anweisungen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hmcfgusb&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
wird daraus eine ausführbare Datei erstellt.&lt;br /&gt;
&lt;br /&gt;
Weiterhin muss die nötige Firmware heruntergeladen und entpackt werden. Die offiziellen Updates gibt es unter [http://www.eq-3.de/downloads.html eq-3 Downloads]. Die Befehle, um beispielsweise die benötigte Datei für die Firmware Version 1.4 des HM-CC-RT-DN zu erhalten lauten:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget http://www.eq-3.de/Downloads/Software/Firmware/hm_cc_rt_dn_update_V1_4_001_141020.tgz&lt;br /&gt;
tar xvzf hm_cc_rt_dn_update_V1_4_001_141020.tgz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Zu guter Letzt muss noch das Tool mit einigen Parametern und der Seriennummer des HomeMatic Devices aufgerufen werden. Für ein Update mit einem CUL (&amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; ist in diesem Beispiel die Adresse des CULs) muss folgendes eingegeben werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./flash-ota -c /dev/ttyACM0 -f &amp;lt;FirmwareImageName&amp;gt;.eq3 -s &amp;lt;DeviceSerialNo&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Für ein Update mit einem COC muss folgendes eingegeben werden (/dev/ttyAMA0):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./flash-ota -c /dev/ttyAMA0 -f &amp;lt;FirmwareImageName&amp;gt;.eq3 -s &amp;lt;DeviceSerialNo&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Für ein Update mit HM-CFG-USB&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./flash-ota -f &amp;lt;FirmwareImageName&amp;gt;.eq3 -s &amp;lt;DeviceSerialNo&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nun muss nur noch das HomeMatic Gerät in den Update-Modus versetzt werden. Wie das geht, steht in der jeweils mit der Firmwaredatei gelieferten &amp;quot;readme&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Update mit HM-CFG-USB unter Windows ===&lt;br /&gt;
Für ein Firmwareupdate unter Windows wird das &amp;quot;HomeMatic Firmware Update Tool&amp;quot; von eq-3 benötigt: [http://www.eq-3.de/downloads.html eQ-3 Downloads]. Zur Zeit ist das Update damit nur mit dem HM-CFG-USB-2 möglich, nicht aber mit dem HM-CFG-LAN oder dem HM-CFG-USB der ersten Generation.&lt;br /&gt;
&lt;br /&gt;
Nach dem Start muss die Seriennummer des HomeMatic-Device eingegeben und die Firmware-Datei ausgewählt werden. Dann wird das Update-Tool durch einen Klick auf den entsprechenden Button in &amp;quot;Bereitschaft&amp;quot; gesetzt und anschließend muss das HomeMatic-Gerät in den Update-Modus versetzt werden. Bei Unterputz-Geräten ist das eventuell gar nicht so einfach, man kann in diesem Fall aber von FHEM aus dem Gerät ein Kommando schicken um es in den Bootloader Modus zu bringen. Dies geht mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; fwUpdate onlyEnterBootLoader&amp;lt;/code&amp;gt;&lt;br /&gt;
Direkt danach sollte das Update Tool mit seiner Arbeit beginnen.&lt;br /&gt;
&lt;br /&gt;
Falls das Update-Tool beim Auswählen der Firmware-Datei abstürzt (&amp;quot;Home Matic Firmware Update Tool funktioniert nicht mehr&amp;quot;), dann stimmt wahrscheinlich etwas mit der Firmware-Datei nicht. Die Datei darf nicht ausgepackt, sondern muss als &amp;quot;.tar.gz&amp;quot;-Datei, so wie sie heruntergeladen wurde, benutzt werden. Es kann Probleme geben, wenn die Datei mit dem Internet Explorer heruntergeladen wurde. Am einfachsten ist es, die Datei mit einem anderen Browser herunterzuladen.&lt;br /&gt;
&lt;br /&gt;
== Mögliche Probleme ==&lt;br /&gt;
Lässt sich die Firmware nicht OTA auf das HomeMatic-Device flashen, kann dies folgende Ursachen haben:&lt;br /&gt;
* Die Fhem-Software ist nicht auf dem neuesten Stand. Bitte vorher ein &#039;&#039;update&#039;&#039; durchführen.&lt;br /&gt;
* &#039;&#039;&#039;Entfernung&#039;&#039;&#039; zwischen Sender und Empfänger &#039;&#039;&#039;zu klein&#039;&#039;&#039;. 1,5 bis 2 m Abstand sollten beide Geräte zueinander mindestens haben.&lt;br /&gt;
* &#039;&#039;&#039;Entfernung&#039;&#039;&#039; zwischen Sender und Empfänger &#039;&#039;&#039;zu groß&#039;&#039;&#039;. Überprüfen Sie die RSSI-Werte des zu flashenden Device. Schlechter als - 70 sollten sie nicht sein (also keine - 75 oder noch kleiner). Ansonsten muss der Abstand für die Dauer des Flashens verringert werden.&lt;br /&gt;
&lt;br /&gt;
== Tool zur Firmware Versionsprüfung ==&lt;br /&gt;
[[Datei:HM-FWUpdate-eQ3.png|mini|400px|right|Beispiel einer Liste der relevanten Firmware Updates&amp;lt;br /&amp;gt;&#039;&#039;&#039;Legende:&#039;&#039;&#039;&amp;lt;br /&amp;gt;1 - Link auf die eQ-3 Download-Seite &amp;lt;br /&amp;gt;2 - Link auf die Details des HTTPMOD Device &amp;lt;br /&amp;gt;3 - Link auf die Details des HomeMatic Device &amp;lt;br /&amp;gt;4 - (Download) Link auf die Firmware Datei &amp;lt;br /&amp;gt;5 - &amp;quot;reread&amp;quot;: Aktualisierung dieser Liste auslösen]]&lt;br /&gt;
Im Fhem-Forum wurden unter dem Titel {{Link2Forum|Topic=47729|LinkText=...Firmware Versionsprüfung}} die erforderlichen Definitionen für ein [[HTTPMOD]]-Device vorgestellt, das &lt;br /&gt;
* für alle HomeMatic Devices der aktuellen Fhem-Umgebung&lt;br /&gt;
* die derzeit benutzte Firmware Version mit&lt;br /&gt;
* einem evtl. auf der eQ-3 Seite verfügbaren Update vergleicht und&lt;br /&gt;
* alle für die aktuelle Installation relevanten Updates in einer Übersicht (siehe Screenshot) darstellt und&lt;br /&gt;
* einmal täglich (alle 86400 Sekunden) automatisch ausgeführt wird; dieses Intervall sollte nicht verkürzt, sondern eher verlängert werden. Im Bedarfsfall kann durch anklicken von &#039;&#039;&#039;&#039;&#039;reread&#039;&#039;&#039;&#039;&#039; eine sofortige Aktualisierung ausgelöst werden.&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollte eine alte (vor dem 15.3.2016) Version dieser Definitionen bereits in Benutzung sein (zu erkennen am Vorhandensein von &#039;&#039;&amp;lt;nowiki&amp;gt;reading0[2|3|4|5]*&amp;lt;/nowiki&amp;gt;&#039;&#039;-Attributen), dann wird empfohlen, das Device mit &amp;lt;code&amp;gt;delete eq3&amp;lt;/code&amp;gt; zunächst komplett zu löschen und anschließend neu anzulegen.}}&lt;br /&gt;
Die unten aufgeführten erforderlichen Anweisungen zur Erstellung dieser Übersicht sind&lt;br /&gt;
* im wesentlichen über das Webinterface eingebbar (können aber auch &amp;quot;en bloc&amp;quot; in die fhem.cfg eingetragen werden - auch wenn das eigentlich nicht empfohlen ist)&lt;br /&gt;
* der umfangreiche Perl-Code für das Attribut &#039;&#039;userReadings&#039;&#039; ist dargestellt für die Eingabe über das [[FHEMWEB|Webinterface]]&lt;br /&gt;
* für das Attribut &#039;&#039;stateFormat&#039;&#039; ist die mehrzeilige Eingabe (zumindest derzeit, März 2016) nicht unterstützt, daher wurde der Code in eine Subroutine ausgelagert&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;{{Randnotiz|RNTyp=r|RNText=&#039;&#039;&#039;Wichtige Änderungen:&#039;&#039;&#039;&lt;br /&gt;
22.05.2016 - &#039;&#039;reading01Regex&#039;&#039; und &#039;&#039;reading01Format&#039;&#039; angepasst (eQ-3)&lt;br /&gt;
}}&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Basis-Definitionen für Device eq3 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define eq3 HTTPMOD http://www.eq-3.de/service/downloads.html 86400&lt;br /&gt;
attr eq3 userattr enableControlSet event-on-change-reading event-on-update-reading reading01AutoNumLen reading01Format reading01Name reading01RegOpt reading01RegOpt:s,i,g reading01Regex readingMaxAge readingMaxAgeReplacementMode readingMaxAgeReplacementMode:text,expression,delete requestData.* showError showMatched stateFormat userReadings webCmd&lt;br /&gt;
attr eq3 enableControlSet 1&lt;br /&gt;
attr eq3 event-on-change-reading .*&lt;br /&gt;
attr eq3 event-on-update-reading LAST_ERROR,MATCHED_READINGS&lt;br /&gt;
attr eq3 reading01AutoNumLen 2&lt;br /&gt;
attr eq3 reading01Format http://www.eq-3.de/%s&lt;br /&gt;
attr eq3 reading01Name fw_link&lt;br /&gt;
attr eq3 reading01RegOpt g&lt;br /&gt;
attr eq3 reading01Regex &amp;lt;a.href=&amp;quot;(Downloads\/Software\/Firmware\/[^&amp;quot;]+)&lt;br /&gt;
attr eq3 readingMaxAge 10&lt;br /&gt;
attr eq3 readingMaxAgeReplacementMode delete&lt;br /&gt;
attr eq3 requestData.* suchtext=&amp;amp;suche_in=2&amp;amp;downloadart=11&lt;br /&gt;
attr eq3 room eq3&lt;br /&gt;
attr eq3 showError 1&lt;br /&gt;
attr eq3 showMatched 1&lt;br /&gt;
attr eq3 stateFormat {eq3StateFormat}&lt;br /&gt;
attr eq3 webCmd reread&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definition/Code für Attribut userReadings ===&lt;br /&gt;
Der &amp;quot;Zugang&amp;quot; zur Eingabe des Attributs &#039;&#039;stateFormat&#039;&#039; erfolgt über die Details des Device &#039;&#039;&#039;eq3&#039;&#039;&#039; (URL: ...8083/fhem?detail=eq3).&lt;br /&gt;
[[Datei:HM-FWUpdate-eQ3-userReadings.png|mini|640px|left|&amp;quot;Der Weg&amp;quot; zur Eingabe von &#039;&#039;userReadings&#039;&#039;; durch Klick in das Eingabefeld öffnet sich ein separates Fenster.]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;Der Perl-Code, der für das Attribut &#039;&#039;userReadings&#039;&#039; eingegeben werden muss:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
newFwForDevices:MATCHED_READINGS:.* {&lt;br /&gt;
  my $ret = &amp;quot;&amp;quot;;&lt;br /&gt;
  my @data;&lt;br /&gt;
  my @eq3FwList = map{@data = ReadingsVal(&amp;quot;eq3&amp;quot;,&amp;quot;fw_link-&amp;quot;.$_,&amp;quot;?&amp;quot;) =~ m/Firmware\/(.*?)_update_V([\d_]+)_(\d\d)(\d\d)(\d\d)/; &lt;br /&gt;
            $data[0] =~ s/_/-/g;&lt;br /&gt;
            sprintf(&amp;quot;%s:%s:%s.%s.%s:%s&amp;quot;,$data[0],$data[1],$data[4],$data[3],&amp;quot;20&amp;quot;.$data[2],$_);&lt;br /&gt;
            } ReadingsVal(&amp;quot;eq3&amp;quot;,&amp;quot;MATCHED_READINGS&amp;quot;,&amp;quot;?&amp;quot;) =~ m/fw_link-(\d\d)/g;&lt;br /&gt;
            &lt;br /&gt;
  foreach my $dev (devspec2array(&amp;quot;TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)&amp;quot;)) {&lt;br /&gt;
    my $md = AttrVal($dev,&amp;quot;model&amp;quot;,&amp;quot;?&amp;quot;);&lt;br /&gt;
    my $v = AttrVal($dev,&amp;quot;firmware&amp;quot;,&amp;quot;0.0&amp;quot;);&lt;br /&gt;
    my ($h,$l) = split(&#039;\.&#039;,$v);&lt;br /&gt;
    foreach my $newFw (grep m/^${md}:/i,@eq3FwList) {&lt;br /&gt;
      my ($nh,$nl,$no,$date,$idx) = $newFw =~ m/^[^:]+:(\d+)_(\d+)_?(\d*):([^:]+):(\d\d)$/;&lt;br /&gt;
      if(($nh &amp;gt; $h) || (($nh == $h) &amp;amp;&amp;amp; ($nl &amp;gt; $l))) {&lt;br /&gt;
        $ret .= &amp;quot;,&amp;quot; if($ret ne &amp;quot;&amp;quot;);&lt;br /&gt;
        $ret .= $dev.&amp;quot; (&amp;quot;.$md.&amp;quot; | fw_&amp;quot;.$v.&amp;quot; =&amp;gt; fw&amp;quot;.$idx.&amp;quot;_&amp;quot;.$nh.&amp;quot;.&amp;quot;.$nl.($no?sprintf(&amp;quot;.%d&amp;quot;,$no):&amp;quot;&amp;quot;).&amp;quot; | &amp;quot;.$date.&amp;quot;)&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return ($ret eq &amp;quot;&amp;quot;)?&amp;quot;no fw-updates needed!&amp;quot;:$ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definition/Code für Attribut stateFormat ===&lt;br /&gt;
Da der Code für &#039;&#039;stateFormat&#039;&#039; recht umfangreich ist, wäre er als Einzeiler kaum sinnvoll zu verwalten, würde also ohnehin meistens über einen externen Editor bearbeitet werden. Daher wurde er als eigene (Sub-)Routine mit dem Namen &#039;&#039;eq3StateFormat&#039;&#039; in (z.B.) [[99_myUtils anlegen|99_myUtils]] ausgelagert:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub eq3StateFormat() {&lt;br /&gt;
  my $name = &amp;quot;eq3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my $ret =&amp;quot;&amp;quot;;&lt;br /&gt;
  my $lastCheck = ReadingsTimestamp($name,&amp;quot;MATCHED_READINGS&amp;quot;,&amp;quot;???&amp;quot;);&lt;br /&gt;
  $ret .= &#039;&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&#039;;   &lt;br /&gt;
  $ret .= &#039;last &amp;lt;a title=&amp;quot;eq3-downloads&amp;quot; href=&amp;quot;http://www.eq-3.de/downloads.html&amp;quot;&amp;gt;homematic&amp;lt;/a&amp;gt;-fw-check =&amp;gt; &#039;.$lastCheck;    &lt;br /&gt;
  $ret .= &#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;;    &lt;br /&gt;
  $ret .= &#039;&amp;lt;pre&amp;gt;&#039;;   &lt;br /&gt;
  $ret .= &amp;quot;| device                  | model                   | old_fw | new_fw | release    |\n&amp;quot;;  &lt;br /&gt;
  $ret .= &amp;quot;------------------------------------------------------------------------------------\n&amp;quot;;  &lt;br /&gt;
  my $check = ReadingsVal($name,&amp;quot;newFwForDevices&amp;quot;,&amp;quot;???&amp;quot;);    &lt;br /&gt;
  if($check eq &amp;quot;no fw-updates needed!&amp;quot;) {        &lt;br /&gt;
    $ret .= &#039;| &#039;.$check.&#039;                                                            |&#039;;     &lt;br /&gt;
  } else {         &lt;br /&gt;
    my @devices = split(&#039;,&#039;,$check);         &lt;br /&gt;
    foreach my $devStr (@devices) {&lt;br /&gt;
      my ($dev,$md,$ofw,$idx,$nfw,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\sfw_(\d+\.\d+)\s=&amp;gt;\sfw(\d\d)_([\d\.]+)\s\|\s([^\)]+)\)$/;          &lt;br /&gt;
      my $link = ReadingsVal($name,&amp;quot;fw_link-&amp;quot;.$idx,&amp;quot;???&amp;quot;);           &lt;br /&gt;
      $ret .= &#039;| &#039;;          &lt;br /&gt;
      $ret .= &#039;&amp;lt;a href=&amp;quot;/fhem?detail=&#039;.$dev.&#039;&amp;quot;&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%-23s&amp;quot;,$dev);             &lt;br /&gt;
      $ret .= &#039;&amp;lt;/a&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= &#039;&amp;lt;b&#039;.(($md eq &amp;quot;?&amp;quot;)?&#039; title=&amp;quot;missing attribute model =&amp;gt; set device in teach mode to receive missing data&amp;quot; style=&amp;quot;color:yellow&amp;quot;&#039;:&#039; style=&amp;quot;color:lightgray&amp;quot;&#039;).&#039;&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%-23s&amp;quot;,$md);          &lt;br /&gt;
      $ret .= &#039;&amp;lt;/b&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= &#039;&amp;lt;b&#039;.(($ofw eq &amp;quot;0.0&amp;quot;)?&#039; title=&amp;quot;missing attribute firmware =&amp;gt; set device in teach mode to receive missing data&amp;quot; style=&amp;quot;color:yellow&amp;quot;&#039;:&#039; style=&amp;quot;color:lightgray&amp;quot;&#039;).&#039;&amp;gt;&#039;;              &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%6s&amp;quot;,$ofw);           &lt;br /&gt;
      $ret .= &#039;&amp;lt;/b&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= &#039;&amp;lt;a title=&amp;quot;eq3-firmware.tgz&amp;quot; href=&amp;quot;&#039;.$link.&#039;&amp;quot;&amp;gt;&#039;;           &lt;br /&gt;
      $ret .= &#039;&amp;lt;b style=&amp;quot;color:red&amp;quot;&amp;gt;&#039;;           &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%6s&amp;quot;,$nfw);           &lt;br /&gt;
      $ret .= &#039;&amp;lt;/b&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &#039;&amp;lt;/a&amp;gt;&#039;;            &lt;br /&gt;
      $ret .= &amp;quot; | &amp;quot;;             &lt;br /&gt;
      $ret .= sprintf(&amp;quot;%-10s&amp;quot;,$date);            &lt;br /&gt;
      $ret .= &amp;quot; |\n&amp;quot;;        &lt;br /&gt;
    }   &lt;br /&gt;
  }  &lt;br /&gt;
  $ret .= &#039;&amp;lt;/pre&amp;gt;&#039;;  &lt;br /&gt;
  $ret .= &#039;&amp;lt;/div&amp;gt;&#039;;  &lt;br /&gt;
  return $ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sondersituationen ===&lt;br /&gt;
[[Datei:HM-FWUpdate-eQ3-check.png|mini|455px|right|Fehlerbedingung: Attribut &#039;&#039;firmware&#039;&#039; nicht gesetzt]]&lt;br /&gt;
Das Tool überprüft gleichzeitig auch bestimmte Rahmenbedingungen, so z.B., ob bei allen HomeMatic Devices die Attribute &#039;&#039;model&#039;&#039; und &#039;&#039;firmware&#039;&#039; gesetzt sind. Sollte das nicht der Fall sein, wird das Device in der Liste &lt;br /&gt;
* mit einem gelben &amp;quot;old_fw&amp;quot; Wert von 0.0 geführt; befindet sich der Mauszeiger über dem &amp;quot;0.0&amp;quot;, wird der Hinweistext &#039;&#039;missing attribute firmware =&amp;gt; set device in teach mode to receive missing data&#039;&#039; angezeigt (siehe Beispiel im Screenshot)&lt;br /&gt;
* mit einem gelben {{Taste|?}} in der Spalte &amp;quot;model&amp;quot; angezeigt; befindet sich der Mauszeiger über dem &amp;quot;?&amp;quot;, wird der Hinweistext &#039;&#039;missing attribute model =&amp;gt; set device in teach mode to receive missing data&#039;&#039; angezeigt&lt;br /&gt;
In diesem Fall sollte bei dem betreffenden Gerät versucht werden, mit &#039;&#039;getConfig&#039;&#039; die Daten zu aktualisieren bzw. vervollständigen.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus ist zu beachten, dass die Firmware-Version in den HomeMatic Geräten zwei&amp;quot;teilig&amp;quot; (Version.Release) abgelegt ist, die Firmware Update-Dateien jedoch drei&amp;quot;teilige&amp;quot; Versionskennungen (Version_Release_???) haben. Für den Vergleich, ob neue Firmware verfügbar ist, kann natürlich nur die zweiteilige Kennung verwendet werden, eine Änderung im dritten Teil der Versionskennung kann daher nicht automatisch erkannt werden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.eq-3.de/downloads.html Firmware Download] Seite von eq-3&lt;br /&gt;
* Forenthread zur {{Link2Forum|Topic=47729|LinkText=&amp;quot;Firmware Versionsprüfung&amp;quot;}}&lt;br /&gt;
* [http://git.zerfleddert.de/hmcfgusb/ Firmware Update Tool] von mgernoth&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=15070</id>
		<title>HM-Dis-WM55 Funk Statusanzeige</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=15070"/>
		<updated>2016-04-15T21:32:20Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Allgemeines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;HM-Dis-WM55&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HomeMatic Funk-Statusanzeige WM55&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
* Farbiges OLED-Display mit 128 x 128 RGB-Bildpunkten&lt;br /&gt;
* Frei programmierbar über HomeMatic-WebUI&lt;br /&gt;
* Dynamische Zuweisung von Anzeigeplätzen, Texten, Zustand von Systemvariablen, Symbolen&lt;br /&gt;
* In den Anzeigerahmen integrierte Taster für Anmeldung, Seitenfortschaltung und Auslösen von Zentralenprogrammen, z. B. Abfrage von Fensterzuständen bei Verlassen des Hauses&lt;br /&gt;
* Nur 19 mm flach, Schraub- oder Klebmontage, ortsunabhängiger Batteriebetrieb&lt;br /&gt;
* Lieferung mit weißem Rahmen, alternativ integrierbar in 55-mm-Installationsrahmen zahlreicher Installationsserien (Berker, ELSO, GIRA, merten, JUNG)&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die Funk-Statusanzeige hat 10 Kanäle (HM-Dis-WM55_Dis_01 bis HM-Dis-WM55_Dis_10). Jedem der Kanäle können 2 Texte zugewiesen werden. Kanal 1 und 2 kommt eine Doppelrolle zu. Sie enthalten sowohl Texte, sind aber auch die beiden Tasten. Und so wird auch die Ausgabe der Displayanzeige auf diese beiden Kanäle gegeben.&lt;br /&gt;
&lt;br /&gt;
Das Display hat 6 Zeilen zur Darstellung von bis zu 12 Zeichen und einem Icon.&lt;br /&gt;
Für die Texte in den Zeilen kann jeweils eine von 6 Anzeigefarben eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Die Zeilen können einzeln befüllt und getauscht werden, dies muss nicht in einem Rutsch passieren.&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
Es gibt hin und wieder Probleme die Register auszulesen. Abhilfe ist msgrepeat auf 3 zu setzten und hartnäckig bleiben.&lt;br /&gt;
&lt;br /&gt;
= Betrieb mit FHEM =&lt;br /&gt;
Das Gerät wird zur Zeit experimentell unterstützt.&lt;br /&gt;
msgrepeat sollte auf 3 gestellt werden, sonst gibt es öfters Timeouts:&lt;br /&gt;
 attr HM-Dis-WM55 msgRepeat 3&lt;br /&gt;
&lt;br /&gt;
Die Kanäle 1 und 2 sollten mit FHEM gepeered (zusätzlich zum pairing) werden&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 peerBulk &amp;lt;hmID&amp;gt;01&lt;br /&gt;
 set HM-Dis-WM55_Dis_02 peerBulk &amp;lt;hmID&amp;gt;01 &lt;br /&gt;
&lt;br /&gt;
Um einen Kanal mit Text zu befüllen dient der text Befehl auf einen Kanal. Es werden beide Texte in einen Kanal gleichzeitig geschrieben. Will ich einen Text tauschen muss ich den anderen mit neu setzten. Für ein Leerzeichen \_ einsetzten&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 text Fenster\_auf Fenster\_zu&lt;br /&gt;
&lt;br /&gt;
zum Übernehmen der Konfiguration den Config Taster auf der Rückseite nehmen und über das Menü übernehmen&lt;br /&gt;
&lt;br /&gt;
Nun kann man z.B. mit einem notify die Information an den Schalter senden, wenn ein Fenster offen und oder zu ist:&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 txt01_1 red error&lt;br /&gt;
&lt;br /&gt;
short bedeutet bei einem kurzen Tastendruck (es geht auch long). line bezieht sich auf die Zeile in die es geschrieben wird. Anschließend folgt der Text, die Farbe in der der Text angezeigt werden soll, sowie das Icon.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM help&lt;br /&gt;
kann eine Übersicht der gesetzten Texte angezeigt werden. Sowie der möglichen Farben und Icons.&lt;br /&gt;
&lt;br /&gt;
Folgende Farben gibt es:&lt;br /&gt;
 color is one white, red, orange, yellow, green, blue&lt;br /&gt;
&lt;br /&gt;
Folgende Icons gibt es:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| closed || Schloss geschlossen&lt;br /&gt;
|-&lt;br /&gt;
| error || Kreuz rot&lt;br /&gt;
|-&lt;br /&gt;
| ic12 || Leersymbol&lt;br /&gt;
|-&lt;br /&gt;
| ic13 || Leersymbol&lt;br /&gt;
|-&lt;br /&gt;
| info ||&amp;quot;i&amp;quot; in blauem Kreis&lt;br /&gt;
|-&lt;br /&gt;
| newMsg || Briefkasten mit Flag&lt;br /&gt;
|-&lt;br /&gt;
| noIcon || nichts&lt;br /&gt;
|-&lt;br /&gt;
| off || Glühbirne aus&lt;br /&gt;
|-&lt;br /&gt;
| ok || Haken grün&lt;br /&gt;
|-&lt;br /&gt;
| on || Glühbirne an&lt;br /&gt;
|-&lt;br /&gt;
| open || Schloss geöffnet&lt;br /&gt;
|-&lt;br /&gt;
| serviceMsg || Mann mit Schraubenschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| sigGreen || Leuchte grün&lt;br /&gt;
|-&lt;br /&gt;
| sigRed || Leuchte rot &lt;br /&gt;
|-&lt;br /&gt;
| sigYellow || Leuchte gelb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Soll kein Text eingeblendet werden oder dieser nicht geändert werden, kann man einfach nc schreiben Beispiel&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 nc nc error&lt;br /&gt;
Dann wird nur das Icon getauscht oder eben nur jenes angezeigt.&lt;br /&gt;
&lt;br /&gt;
== dynamische Ausgaben ==&lt;br /&gt;
Um das Display wirkungsvoll einzusetzen ist es angebracht Texte dynamisch - abhängig von irgendwelchen Readings und Auswertungen zu erzeugen. Dies ist möglich, bedarf bei strukturierten Einbau einiges an Installation - ist aber am Ende einfacher als es anfänglich scheint. Möglichkeiten, es zu realisieren gibt es einige - hier ein Beispiel über myUtils. &lt;br /&gt;
=== fhemUser.cfg ===&lt;br /&gt;
Da im fhem.cfg kein set kommando vorkommen soll/kann sollte man ein separates File einbinden welches definiert nach Systeminitialisierung ausgeführt wird. Hierzu erzeugt man ein File fhem_user.cfg. Im normalen fhem.cfg baut man eine Zeile ein um es auszuführen:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Wenn das File fhem_user.cfg mit der Oberfläche angelegt wurde (Edit file, Save as), liegt es im Unterverzeichnis ./FHEM und wird so eingebunden:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include ./FHEM/fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Im fhem_user.cfg stellt man nun für die beiden Buttons des display folgende Zeilen ein&lt;br /&gt;
 set dis_01 displayWM short  line1 e:{myLineA(1,0)}&lt;br /&gt;
 set dis_01 displayWM short  line2 e:{myLineA(2,0)}&lt;br /&gt;
 set dis_01 displayWM short  line3 e:{myLineA(3,0)}&lt;br /&gt;
 set dis_01 displayWM short  line4 e:{myLineA(4,0)}&lt;br /&gt;
 set dis_01 displayWM short  line5 e:{myLineA(5,0)}&lt;br /&gt;
 set dis_01 displayWM short  line6 e:{myLineA(6,0)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_01 displayWM long   line1 e:{myLineA(1,1)}&lt;br /&gt;
 set dis_01 displayWM long   line2 e:{myLineA(2,1)}&lt;br /&gt;
 set dis_01 displayWM long   line3 e:{myLineA(3,1)}&lt;br /&gt;
 set dis_01 displayWM long   line4 e:{myLineA(4,1)}&lt;br /&gt;
 set dis_01 displayWM long   line5 e:{myLineA(5,1)}&lt;br /&gt;
 set dis_01 displayWM long   line6 e:{myLineA(6,1)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM short  line1 e:{myLineA(1,2)}&lt;br /&gt;
 set dis_02 displayWM short  line2 e:{myLineA(2,2)}&lt;br /&gt;
 set dis_02 displayWM short  line3 e:{myLineA(3,2)}&lt;br /&gt;
 set dis_02 displayWM short  line4 e:{myLineA(4,2)}&lt;br /&gt;
 set dis_02 displayWM short  line5 e:{myLineA(5,2)}&lt;br /&gt;
 set dis_02 displayWM short  line6 e:{myLineA(6,2)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM long   line1 e:{myLineA(1,3)}&lt;br /&gt;
 set dis_02 displayWM long   line2 e:{myLineA(2,3)}&lt;br /&gt;
 set dis_02 displayWM long   line3 e:{myLineA(3,3)}&lt;br /&gt;
 set dis_02 displayWM long   line4 e:{myLineA(4,3)}&lt;br /&gt;
 set dis_02 displayWM long   line5 e:{myLineA(5,3)}&lt;br /&gt;
 set dis_02 displayWM long   line6 e:{myLineA(6,3)}&lt;br /&gt;
&lt;br /&gt;
Nun wird beim Tastendruck die Funktion myLineA gesucht - diese werden wir in 99_myUtils definieren.&lt;br /&gt;
&lt;br /&gt;
=== 99_myUtils ===&lt;br /&gt;
Hat man evtl. schon - dann kann man es erweitern. Um es auszuführen muss es aufgerufen werden. Daher wird eine Entity in fhem.cfg definiert&lt;br /&gt;
 define mu myUtils&lt;br /&gt;
&lt;br /&gt;
nun das File 99_myUtils.pm. Die instruktionen sind in den Kommentaren. Da es flexibel ist ist es auch keine strikte Anleitung. &lt;br /&gt;
&lt;br /&gt;
  ##############################################&lt;br /&gt;
  #&lt;br /&gt;
  package main;&lt;br /&gt;
  &lt;br /&gt;
  use strict;&lt;br /&gt;
  use warnings;&lt;br /&gt;
  use POSIX;&lt;br /&gt;
  sub myLineA ($$);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # define counter and counterlimit per press-type&lt;br /&gt;
  # presstype are 0: btn1 short&lt;br /&gt;
  # presstype are 1: btn1 long&lt;br /&gt;
  # presstype are 2: btn2 short&lt;br /&gt;
  # presstype are 3: btn2 long&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  my @cnt   ; #init one counter per press&lt;br /&gt;
  my @cntMax; #number of entries per press&lt;br /&gt;
  # structure per button/itteration/press&lt;br /&gt;
  # insert the function to be executes to fill the line with test, color and icon&lt;br /&gt;
  # Number of itterations can be extended as desired. At least one should be present.&lt;br /&gt;
  # obey the end of the line (is open) and the number of parameters you send to the funktion&lt;br /&gt;
  my %lineArr = (0 =&amp;gt;{#============Btn Type 0: Btn1 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,1 =&amp;gt;{#============Btn Type 0: Btn1 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;Info&amp;quot;,&amp;quot;green&amp;quot;        ,&amp;quot;info&amp;quot; ,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;act:&amp;quot;,&amp;quot;I_actTotal&amp;quot;   ,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot;,&amp;quot;I_sum_battery&amp;quot;,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;fl:&amp;quot; ,&amp;quot;I_fail&amp;quot;       ,&amp;quot;green&amp;quot;,&#039;      &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(        &amp;quot;Error&amp;quot;        ,&amp;quot;red&amp;quot;,&amp;quot;error&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;ERR__protocol&amp;quot;,&amp;quot;red&amp;quot;   ,&#039;            &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot; ,&amp;quot;ERR_battery&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;W__protocol&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;            &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
                ,2 =&amp;gt;{#============Btn Type 2: Btn2 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myRT(&amp;quot;ca:&amp;quot;,&amp;quot;h.caro.Clima&amp;quot;,&#039;#  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myRT(&amp;quot;lg:&amp;quot;,&amp;quot;h.lnge.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myRT(&amp;quot;fh:&amp;quot;,&amp;quot;h.fsth.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myRT(&amp;quot;du:&amp;quot;,&amp;quot;h.dact.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myRT(&amp;quot;bs:&amp;quot;,&amp;quot;h.bad.Clima&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;   ,&amp;quot;&amp;quot;           ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,3 =&amp;gt;{#============Btn Type 3: Btn2 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myLi(&amp;quot;Fl:&amp;quot;,&amp;quot;LichtF&amp;quot;         ,&#039; &lt;br /&gt;
                           ,2=&amp;gt;&#039;{myLi(&amp;quot;Fh:&amp;quot;,&amp;quot;LichtFH&amp;quot;        ,&#039; &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myLi(&amp;quot;L1:&amp;quot;,&amp;quot;LichtL&amp;quot;         ,&#039; &lt;br /&gt;
                           ,4=&amp;gt;&#039;{myLi(&amp;quot;Sl:&amp;quot;,&amp;quot;sw_Sw&amp;quot;          ,&#039; &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myLi(&amp;quot;L2:&amp;quot;,&amp;quot;LichtL_Sw1_V_01&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myLi(&amp;quot;L3:&amp;quot;,&amp;quot;LichtL_Sw1_V_02&amp;quot;,&#039; &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;off&amp;quot;   ,&amp;quot;&amp;quot;,&amp;quot;off&amp;quot;   ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;on&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;on&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;open&amp;quot;  ,&amp;quot;&amp;quot;,&amp;quot;open&amp;quot;  ,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;closed&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;closed&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;error&amp;quot; ,&amp;quot;&amp;quot;,&amp;quot;error&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;ok&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;ok&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,2 =&amp;gt;{#-------itteration 2&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;info&amp;quot;      ,&amp;quot;white&amp;quot; ,&amp;quot;info&amp;quot;      ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;newMsg&amp;quot;    ,&amp;quot;red&amp;quot;   ,&amp;quot;newMsg&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;serviceMsg&amp;quot;,&amp;quot;orange&amp;quot;,&amp;quot;serviceMsg&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;sigGreen&amp;quot;  ,&amp;quot;yellow&amp;quot;,&amp;quot;sigGreen&amp;quot;  ,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;sigYellow&amp;quot; ,&amp;quot;green&amp;quot; ,&amp;quot;sigYellow&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;sigRed&amp;quot;    ,&amp;quot;blue&amp;quot;  ,&amp;quot;sigRed&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
     );&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  sub myUtils_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
  &lt;br /&gt;
  # Normal devices&lt;br /&gt;
    $hash-&amp;gt;{DefFn}   = &amp;quot;myUtil_Define&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn} = &amp;quot;myUtil_Undef&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{AttrList}= $readingFnAttributes;&lt;br /&gt;
    &lt;br /&gt;
    @cntMax = (scalar keys %{$lineArr{0}}&lt;br /&gt;
              ,scalar keys %{$lineArr{1}}&lt;br /&gt;
              ,scalar keys %{$lineArr{2}}&lt;br /&gt;
              ,scalar keys %{$lineArr{3}});&lt;br /&gt;
    push @cnt,&amp;quot;0&amp;quot; foreach (keys %lineArr);&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Define($$) {########################################################&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    return ;&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Undef($$) {#########################################################&lt;br /&gt;
    my ($hash, $arg) = @_;&lt;br /&gt;
    return undef;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  sub myLineA($$){# main entry - do not change!!!&lt;br /&gt;
    my ($line,$type) = @_;&lt;br /&gt;
    $cnt[$type] = ($cnt[$type] +1)%$cntMax[$type] if ($line == 1); # rotate counter per type&lt;br /&gt;
  &lt;br /&gt;
    return (eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;t&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;c&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;i&amp;quot;)}&#039;&lt;br /&gt;
           );&lt;br /&gt;
  }&lt;br /&gt;
  sub myRT($$$){ # function to return information of an RT. &lt;br /&gt;
    # line &#039;t&#039; calculates the text&lt;br /&gt;
    # line &#039;c&#039; calculates the color&lt;br /&gt;
    # line &#039;i&#039; calculates the icon&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;desired-temp&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,&amp;quot;no&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;ValvePosition&amp;quot;,0)    ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTh($$$){#temp sensor &lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;temperature&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;humidity&amp;quot;,&amp;quot;&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;temperature&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)    ? &amp;quot;ok&amp;quot;  : &amp;quot;no&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myPr($$$){#Sensor Pressure&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;pressure&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;luminosity&amp;quot;,&amp;quot;-&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;luminosity&amp;quot;,0)&amp;gt;1000 ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)         ? &amp;quot;ok&amp;quot;    : &amp;quot;error&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myLi($$$){#Light&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;state&amp;quot;,&amp;quot;xx&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;timedOn&amp;quot;,0) eq &amp;quot;off&amp;quot; ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;phyLevel&amp;quot;,ReadingsVal($e,&amp;quot;level&amp;quot;,&amp;quot;1&amp;quot;)) ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTx($$$$){#text only&lt;br /&gt;
    my ($p,$c,$icon,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p;  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return ($icon?$icon:&amp;quot;noIcon&amp;quot;);}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  sub myHm($$$$){#HMInfo readings&lt;br /&gt;
    my ($p,$e,$c,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.join(&amp;quot;,&amp;quot;, grep !/:0/&lt;br /&gt;
                                    , map{s/^(.).*?:/$1:/;;$_;;} &lt;br /&gt;
                                      split &amp;quot;,&amp;quot;&lt;br /&gt;
                                    , ReadingsVal(&amp;quot;hm&amp;quot;,$e,&amp;quot;-&amp;quot;))&lt;br /&gt;
                 }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return &amp;quot;noIcon&amp;quot;;}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  1;&lt;br /&gt;
&lt;br /&gt;
Die Definition, was angezeigt werden soll wird nun in der Struktur %lineArr festgelegt. &lt;br /&gt;
Die Typen der Ausgaben - z.B. Darstellung eines Werts eines RT - wird in der jeweiligen Funktion &amp;quot;myTh&amp;quot; festgelegt. Hier kann man so viele - nach den gleichen Regeln wie die Erste - definieren und in der Struktur nutzen. &lt;br /&gt;
In der Struktur werden die Namen der auszuwertenden Entities eingetragen. &lt;br /&gt;
Mit den Einträgen zur Itteration kann man erreichen dass beim Tastendruck der Text alterniert. Beim ersten Druck eine Seite, beim 2. eine weitere, nach der Letzten wieder die Erste.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29128}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schalter (Sender)]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=15069</id>
		<title>HM-Dis-WM55 Funk Statusanzeige</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=15069"/>
		<updated>2016-04-15T21:30:17Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Allgemeines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;HM-Dis-WM55&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HomeMatic Funk-Statusanzeige WM55&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
* Farbiges OLED-Display mit 128 x 128 RGB-Bildpunkten&lt;br /&gt;
* Frei programmierbar über HomeMatic-WebUI&lt;br /&gt;
* Dynamische Zuweisung von Anzeigeplätzen, Texten, Zustand von Systemvariablen, Symbolen&lt;br /&gt;
* In den Anzeigerahmen integrierte Taster für Anmeldung, Seitenfortschaltung und Auslösen von Zentralenprogrammen, z. B. Abfrage von Fensterzuständen bei Verlassen des Hauses&lt;br /&gt;
* Nur 19 mm flach, Schraub- oder Klebmontage, ortsunabhängiger Batteriebetrieb&lt;br /&gt;
* Lieferung mit weißem Rahmen, alternativ integrierbar in 55-mm-Installationsrahmen zahlreicher Installationsserien (Berker, ELSO, GIRA, merten, JUNG)&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die Funk-Statusanzeige hat 10 Kanäle (HM-Dis-WM55_Dis_01 bis HM-Dis-WM55_Dis_10). Jedem der Kanäle können 2 Texte zugewiesen werden. Kanal 1 und 2 kommt eine Doppelrolle zu. Sie enthalten sowohl Texte, sind aber auch die beiden Tasten. Und so wird auch die Ausgabe der Displayanzeige auf diese beiden Kanäle gegeben.&lt;br /&gt;
&lt;br /&gt;
Das Display hat 6 Zeilen zur Darstellung von bis zu 12 Zeichen und einem Icon.&lt;br /&gt;
&lt;br /&gt;
Die Zeilen können einzeln befüllt und getauscht werden, dies muss nicht in einem Rutsch passieren.&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
Es gibt hin und wieder Probleme die Register auszulesen. Abhilfe ist msgrepeat auf 3 zu setzten und hartnäckig bleiben.&lt;br /&gt;
&lt;br /&gt;
= Betrieb mit FHEM =&lt;br /&gt;
Das Gerät wird zur Zeit experimentell unterstützt.&lt;br /&gt;
msgrepeat sollte auf 3 gestellt werden, sonst gibt es öfters Timeouts:&lt;br /&gt;
 attr HM-Dis-WM55 msgRepeat 3&lt;br /&gt;
&lt;br /&gt;
Die Kanäle 1 und 2 sollten mit FHEM gepeered (zusätzlich zum pairing) werden&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 peerBulk &amp;lt;hmID&amp;gt;01&lt;br /&gt;
 set HM-Dis-WM55_Dis_02 peerBulk &amp;lt;hmID&amp;gt;01 &lt;br /&gt;
&lt;br /&gt;
Um einen Kanal mit Text zu befüllen dient der text Befehl auf einen Kanal. Es werden beide Texte in einen Kanal gleichzeitig geschrieben. Will ich einen Text tauschen muss ich den anderen mit neu setzten. Für ein Leerzeichen \_ einsetzten&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 text Fenster\_auf Fenster\_zu&lt;br /&gt;
&lt;br /&gt;
zum Übernehmen der Konfiguration den Config Taster auf der Rückseite nehmen und über das Menü übernehmen&lt;br /&gt;
&lt;br /&gt;
Nun kann man z.B. mit einem notify die Information an den Schalter senden, wenn ein Fenster offen und oder zu ist:&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 txt01_1 red error&lt;br /&gt;
&lt;br /&gt;
short bedeutet bei einem kurzen Tastendruck (es geht auch long). line bezieht sich auf die Zeile in die es geschrieben wird. Anschließend folgt der Text, die Farbe in der der Text angezeigt werden soll, sowie das Icon.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM help&lt;br /&gt;
kann eine Übersicht der gesetzten Texte angezeigt werden. Sowie der möglichen Farben und Icons.&lt;br /&gt;
&lt;br /&gt;
Folgende Farben gibt es:&lt;br /&gt;
 color is one white, red, orange, yellow, green, blue&lt;br /&gt;
&lt;br /&gt;
Folgende Icons gibt es:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| closed || Schloss geschlossen&lt;br /&gt;
|-&lt;br /&gt;
| error || Kreuz rot&lt;br /&gt;
|-&lt;br /&gt;
| ic12 || Leersymbol&lt;br /&gt;
|-&lt;br /&gt;
| ic13 || Leersymbol&lt;br /&gt;
|-&lt;br /&gt;
| info ||&amp;quot;i&amp;quot; in blauem Kreis&lt;br /&gt;
|-&lt;br /&gt;
| newMsg || Briefkasten mit Flag&lt;br /&gt;
|-&lt;br /&gt;
| noIcon || nichts&lt;br /&gt;
|-&lt;br /&gt;
| off || Glühbirne aus&lt;br /&gt;
|-&lt;br /&gt;
| ok || Haken grün&lt;br /&gt;
|-&lt;br /&gt;
| on || Glühbirne an&lt;br /&gt;
|-&lt;br /&gt;
| open || Schloss geöffnet&lt;br /&gt;
|-&lt;br /&gt;
| serviceMsg || Mann mit Schraubenschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| sigGreen || Leuchte grün&lt;br /&gt;
|-&lt;br /&gt;
| sigRed || Leuchte rot &lt;br /&gt;
|-&lt;br /&gt;
| sigYellow || Leuchte gelb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Soll kein Text eingeblendet werden oder dieser nicht geändert werden, kann man einfach nc schreiben Beispiel&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 nc nc error&lt;br /&gt;
Dann wird nur das Icon getauscht oder eben nur jenes angezeigt.&lt;br /&gt;
&lt;br /&gt;
== dynamische Ausgaben ==&lt;br /&gt;
Um das Display wirkungsvoll einzusetzen ist es angebracht Texte dynamisch - abhängig von irgendwelchen Readings und Auswertungen zu erzeugen. Dies ist möglich, bedarf bei strukturierten Einbau einiges an Installation - ist aber am Ende einfacher als es anfänglich scheint. Möglichkeiten, es zu realisieren gibt es einige - hier ein Beispiel über myUtils. &lt;br /&gt;
=== fhemUser.cfg ===&lt;br /&gt;
Da im fhem.cfg kein set kommando vorkommen soll/kann sollte man ein separates File einbinden welches definiert nach Systeminitialisierung ausgeführt wird. Hierzu erzeugt man ein File fhem_user.cfg. Im normalen fhem.cfg baut man eine Zeile ein um es auszuführen:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Wenn das File fhem_user.cfg mit der Oberfläche angelegt wurde (Edit file, Save as), liegt es im Unterverzeichnis ./FHEM und wird so eingebunden:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include ./FHEM/fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Im fhem_user.cfg stellt man nun für die beiden Buttons des display folgende Zeilen ein&lt;br /&gt;
 set dis_01 displayWM short  line1 e:{myLineA(1,0)}&lt;br /&gt;
 set dis_01 displayWM short  line2 e:{myLineA(2,0)}&lt;br /&gt;
 set dis_01 displayWM short  line3 e:{myLineA(3,0)}&lt;br /&gt;
 set dis_01 displayWM short  line4 e:{myLineA(4,0)}&lt;br /&gt;
 set dis_01 displayWM short  line5 e:{myLineA(5,0)}&lt;br /&gt;
 set dis_01 displayWM short  line6 e:{myLineA(6,0)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_01 displayWM long   line1 e:{myLineA(1,1)}&lt;br /&gt;
 set dis_01 displayWM long   line2 e:{myLineA(2,1)}&lt;br /&gt;
 set dis_01 displayWM long   line3 e:{myLineA(3,1)}&lt;br /&gt;
 set dis_01 displayWM long   line4 e:{myLineA(4,1)}&lt;br /&gt;
 set dis_01 displayWM long   line5 e:{myLineA(5,1)}&lt;br /&gt;
 set dis_01 displayWM long   line6 e:{myLineA(6,1)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM short  line1 e:{myLineA(1,2)}&lt;br /&gt;
 set dis_02 displayWM short  line2 e:{myLineA(2,2)}&lt;br /&gt;
 set dis_02 displayWM short  line3 e:{myLineA(3,2)}&lt;br /&gt;
 set dis_02 displayWM short  line4 e:{myLineA(4,2)}&lt;br /&gt;
 set dis_02 displayWM short  line5 e:{myLineA(5,2)}&lt;br /&gt;
 set dis_02 displayWM short  line6 e:{myLineA(6,2)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM long   line1 e:{myLineA(1,3)}&lt;br /&gt;
 set dis_02 displayWM long   line2 e:{myLineA(2,3)}&lt;br /&gt;
 set dis_02 displayWM long   line3 e:{myLineA(3,3)}&lt;br /&gt;
 set dis_02 displayWM long   line4 e:{myLineA(4,3)}&lt;br /&gt;
 set dis_02 displayWM long   line5 e:{myLineA(5,3)}&lt;br /&gt;
 set dis_02 displayWM long   line6 e:{myLineA(6,3)}&lt;br /&gt;
&lt;br /&gt;
Nun wird beim Tastendruck die Funktion myLineA gesucht - diese werden wir in 99_myUtils definieren.&lt;br /&gt;
&lt;br /&gt;
=== 99_myUtils ===&lt;br /&gt;
Hat man evtl. schon - dann kann man es erweitern. Um es auszuführen muss es aufgerufen werden. Daher wird eine Entity in fhem.cfg definiert&lt;br /&gt;
 define mu myUtils&lt;br /&gt;
&lt;br /&gt;
nun das File 99_myUtils.pm. Die instruktionen sind in den Kommentaren. Da es flexibel ist ist es auch keine strikte Anleitung. &lt;br /&gt;
&lt;br /&gt;
  ##############################################&lt;br /&gt;
  #&lt;br /&gt;
  package main;&lt;br /&gt;
  &lt;br /&gt;
  use strict;&lt;br /&gt;
  use warnings;&lt;br /&gt;
  use POSIX;&lt;br /&gt;
  sub myLineA ($$);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # define counter and counterlimit per press-type&lt;br /&gt;
  # presstype are 0: btn1 short&lt;br /&gt;
  # presstype are 1: btn1 long&lt;br /&gt;
  # presstype are 2: btn2 short&lt;br /&gt;
  # presstype are 3: btn2 long&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  my @cnt   ; #init one counter per press&lt;br /&gt;
  my @cntMax; #number of entries per press&lt;br /&gt;
  # structure per button/itteration/press&lt;br /&gt;
  # insert the function to be executes to fill the line with test, color and icon&lt;br /&gt;
  # Number of itterations can be extended as desired. At least one should be present.&lt;br /&gt;
  # obey the end of the line (is open) and the number of parameters you send to the funktion&lt;br /&gt;
  my %lineArr = (0 =&amp;gt;{#============Btn Type 0: Btn1 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,1 =&amp;gt;{#============Btn Type 0: Btn1 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;Info&amp;quot;,&amp;quot;green&amp;quot;        ,&amp;quot;info&amp;quot; ,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;act:&amp;quot;,&amp;quot;I_actTotal&amp;quot;   ,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot;,&amp;quot;I_sum_battery&amp;quot;,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;fl:&amp;quot; ,&amp;quot;I_fail&amp;quot;       ,&amp;quot;green&amp;quot;,&#039;      &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(        &amp;quot;Error&amp;quot;        ,&amp;quot;red&amp;quot;,&amp;quot;error&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;ERR__protocol&amp;quot;,&amp;quot;red&amp;quot;   ,&#039;            &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot; ,&amp;quot;ERR_battery&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;W__protocol&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;            &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
                ,2 =&amp;gt;{#============Btn Type 2: Btn2 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myRT(&amp;quot;ca:&amp;quot;,&amp;quot;h.caro.Clima&amp;quot;,&#039;#  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myRT(&amp;quot;lg:&amp;quot;,&amp;quot;h.lnge.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myRT(&amp;quot;fh:&amp;quot;,&amp;quot;h.fsth.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myRT(&amp;quot;du:&amp;quot;,&amp;quot;h.dact.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myRT(&amp;quot;bs:&amp;quot;,&amp;quot;h.bad.Clima&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;   ,&amp;quot;&amp;quot;           ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,3 =&amp;gt;{#============Btn Type 3: Btn2 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myLi(&amp;quot;Fl:&amp;quot;,&amp;quot;LichtF&amp;quot;         ,&#039; &lt;br /&gt;
                           ,2=&amp;gt;&#039;{myLi(&amp;quot;Fh:&amp;quot;,&amp;quot;LichtFH&amp;quot;        ,&#039; &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myLi(&amp;quot;L1:&amp;quot;,&amp;quot;LichtL&amp;quot;         ,&#039; &lt;br /&gt;
                           ,4=&amp;gt;&#039;{myLi(&amp;quot;Sl:&amp;quot;,&amp;quot;sw_Sw&amp;quot;          ,&#039; &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myLi(&amp;quot;L2:&amp;quot;,&amp;quot;LichtL_Sw1_V_01&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myLi(&amp;quot;L3:&amp;quot;,&amp;quot;LichtL_Sw1_V_02&amp;quot;,&#039; &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;off&amp;quot;   ,&amp;quot;&amp;quot;,&amp;quot;off&amp;quot;   ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;on&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;on&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;open&amp;quot;  ,&amp;quot;&amp;quot;,&amp;quot;open&amp;quot;  ,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;closed&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;closed&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;error&amp;quot; ,&amp;quot;&amp;quot;,&amp;quot;error&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;ok&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;ok&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,2 =&amp;gt;{#-------itteration 2&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;info&amp;quot;      ,&amp;quot;white&amp;quot; ,&amp;quot;info&amp;quot;      ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;newMsg&amp;quot;    ,&amp;quot;red&amp;quot;   ,&amp;quot;newMsg&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;serviceMsg&amp;quot;,&amp;quot;orange&amp;quot;,&amp;quot;serviceMsg&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;sigGreen&amp;quot;  ,&amp;quot;yellow&amp;quot;,&amp;quot;sigGreen&amp;quot;  ,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;sigYellow&amp;quot; ,&amp;quot;green&amp;quot; ,&amp;quot;sigYellow&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;sigRed&amp;quot;    ,&amp;quot;blue&amp;quot;  ,&amp;quot;sigRed&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
     );&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  sub myUtils_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
  &lt;br /&gt;
  # Normal devices&lt;br /&gt;
    $hash-&amp;gt;{DefFn}   = &amp;quot;myUtil_Define&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn} = &amp;quot;myUtil_Undef&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{AttrList}= $readingFnAttributes;&lt;br /&gt;
    &lt;br /&gt;
    @cntMax = (scalar keys %{$lineArr{0}}&lt;br /&gt;
              ,scalar keys %{$lineArr{1}}&lt;br /&gt;
              ,scalar keys %{$lineArr{2}}&lt;br /&gt;
              ,scalar keys %{$lineArr{3}});&lt;br /&gt;
    push @cnt,&amp;quot;0&amp;quot; foreach (keys %lineArr);&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Define($$) {########################################################&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    return ;&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Undef($$) {#########################################################&lt;br /&gt;
    my ($hash, $arg) = @_;&lt;br /&gt;
    return undef;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  sub myLineA($$){# main entry - do not change!!!&lt;br /&gt;
    my ($line,$type) = @_;&lt;br /&gt;
    $cnt[$type] = ($cnt[$type] +1)%$cntMax[$type] if ($line == 1); # rotate counter per type&lt;br /&gt;
  &lt;br /&gt;
    return (eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;t&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;c&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;i&amp;quot;)}&#039;&lt;br /&gt;
           );&lt;br /&gt;
  }&lt;br /&gt;
  sub myRT($$$){ # function to return information of an RT. &lt;br /&gt;
    # line &#039;t&#039; calculates the text&lt;br /&gt;
    # line &#039;c&#039; calculates the color&lt;br /&gt;
    # line &#039;i&#039; calculates the icon&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;desired-temp&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,&amp;quot;no&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;ValvePosition&amp;quot;,0)    ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTh($$$){#temp sensor &lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;temperature&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;humidity&amp;quot;,&amp;quot;&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;temperature&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)    ? &amp;quot;ok&amp;quot;  : &amp;quot;no&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myPr($$$){#Sensor Pressure&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;pressure&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;luminosity&amp;quot;,&amp;quot;-&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;luminosity&amp;quot;,0)&amp;gt;1000 ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)         ? &amp;quot;ok&amp;quot;    : &amp;quot;error&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myLi($$$){#Light&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;state&amp;quot;,&amp;quot;xx&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;timedOn&amp;quot;,0) eq &amp;quot;off&amp;quot; ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;phyLevel&amp;quot;,ReadingsVal($e,&amp;quot;level&amp;quot;,&amp;quot;1&amp;quot;)) ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTx($$$$){#text only&lt;br /&gt;
    my ($p,$c,$icon,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p;  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return ($icon?$icon:&amp;quot;noIcon&amp;quot;);}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  sub myHm($$$$){#HMInfo readings&lt;br /&gt;
    my ($p,$e,$c,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.join(&amp;quot;,&amp;quot;, grep !/:0/&lt;br /&gt;
                                    , map{s/^(.).*?:/$1:/;;$_;;} &lt;br /&gt;
                                      split &amp;quot;,&amp;quot;&lt;br /&gt;
                                    , ReadingsVal(&amp;quot;hm&amp;quot;,$e,&amp;quot;-&amp;quot;))&lt;br /&gt;
                 }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return &amp;quot;noIcon&amp;quot;;}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  1;&lt;br /&gt;
&lt;br /&gt;
Die Definition, was angezeigt werden soll wird nun in der Struktur %lineArr festgelegt. &lt;br /&gt;
Die Typen der Ausgaben - z.B. Darstellung eines Werts eines RT - wird in der jeweiligen Funktion &amp;quot;myTh&amp;quot; festgelegt. Hier kann man so viele - nach den gleichen Regeln wie die Erste - definieren und in der Struktur nutzen. &lt;br /&gt;
In der Struktur werden die Namen der auszuwertenden Entities eingetragen. &lt;br /&gt;
Mit den Einträgen zur Itteration kann man erreichen dass beim Tastendruck der Text alterniert. Beim ersten Druck eine Seite, beim 2. eine weitere, nach der Letzten wieder die Erste.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29128}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schalter (Sender)]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=15068</id>
		<title>HM-Dis-WM55 Funk Statusanzeige</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=15068"/>
		<updated>2016-04-15T21:29:50Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Allgemeines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;HM-Dis-WM55&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HomeMatic Funk-Statusanzeige WM55&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
* Farbiges OLED-Display mit 128 x 128 RGB-Bildpunkten&lt;br /&gt;
* Frei programmierbar über HomeMatic-WebUI&lt;br /&gt;
* Dynamische Zuweisung von Anzeigeplätzen, Texten, Zustand von Systemvariablen, Symbolen&lt;br /&gt;
* In den Anzeigerahmen integrierte Taster für Anmeldung, Seitenfortschaltung und Auslösen von Zentralenprogrammen, z. B. Abfrage von Fensterzuständen bei Verlassen des Hauses&lt;br /&gt;
* Nur 19 mm flach, Schraub- oder Klebmontage, ortsunabhängiger Batteriebetrieb&lt;br /&gt;
* Lieferung mit weißem Rahmen, alternativ integrierbar in 55-mm-Installationsrahmen zahlreicher Installationsserien (Berker, ELSO, GIRA, merten, JUNG)&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die Funk-Statusanzeige hat 10 Kanäle (HM-Dis-WM55_Dis_01 bis HM-Dis-WM55_Dis_10). Jedem der Kanäle können 2 Texte zugewiesen werden. Kanal 1 und 2 kommt eine Doppelrolle zu. Sie enthalten sowohl Texte, sind aber auch die beiden Tasten. Und so wird auch die Ausgabe der Displayanzeige auf diese beiden Kanäle gegeben.&lt;br /&gt;
&lt;br /&gt;
Das Display hat 6 Zeilen zur Darstellung von bis zu 12 Zeichen und einem von 12 Icons.&lt;br /&gt;
&lt;br /&gt;
Die Zeilen können einzeln befüllt und getauscht werden, dies muss nicht in einem Rutsch passieren.&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
Es gibt hin und wieder Probleme die Register auszulesen. Abhilfe ist msgrepeat auf 3 zu setzten und hartnäckig bleiben.&lt;br /&gt;
&lt;br /&gt;
= Betrieb mit FHEM =&lt;br /&gt;
Das Gerät wird zur Zeit experimentell unterstützt.&lt;br /&gt;
msgrepeat sollte auf 3 gestellt werden, sonst gibt es öfters Timeouts:&lt;br /&gt;
 attr HM-Dis-WM55 msgRepeat 3&lt;br /&gt;
&lt;br /&gt;
Die Kanäle 1 und 2 sollten mit FHEM gepeered (zusätzlich zum pairing) werden&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 peerBulk &amp;lt;hmID&amp;gt;01&lt;br /&gt;
 set HM-Dis-WM55_Dis_02 peerBulk &amp;lt;hmID&amp;gt;01 &lt;br /&gt;
&lt;br /&gt;
Um einen Kanal mit Text zu befüllen dient der text Befehl auf einen Kanal. Es werden beide Texte in einen Kanal gleichzeitig geschrieben. Will ich einen Text tauschen muss ich den anderen mit neu setzten. Für ein Leerzeichen \_ einsetzten&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 text Fenster\_auf Fenster\_zu&lt;br /&gt;
&lt;br /&gt;
zum Übernehmen der Konfiguration den Config Taster auf der Rückseite nehmen und über das Menü übernehmen&lt;br /&gt;
&lt;br /&gt;
Nun kann man z.B. mit einem notify die Information an den Schalter senden, wenn ein Fenster offen und oder zu ist:&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 txt01_1 red error&lt;br /&gt;
&lt;br /&gt;
short bedeutet bei einem kurzen Tastendruck (es geht auch long). line bezieht sich auf die Zeile in die es geschrieben wird. Anschließend folgt der Text, die Farbe in der der Text angezeigt werden soll, sowie das Icon.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM help&lt;br /&gt;
kann eine Übersicht der gesetzten Texte angezeigt werden. Sowie der möglichen Farben und Icons.&lt;br /&gt;
&lt;br /&gt;
Folgende Farben gibt es:&lt;br /&gt;
 color is one white, red, orange, yellow, green, blue&lt;br /&gt;
&lt;br /&gt;
Folgende Icons gibt es:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| closed || Schloss geschlossen&lt;br /&gt;
|-&lt;br /&gt;
| error || Kreuz rot&lt;br /&gt;
|-&lt;br /&gt;
| ic12 || Leersymbol&lt;br /&gt;
|-&lt;br /&gt;
| ic13 || Leersymbol&lt;br /&gt;
|-&lt;br /&gt;
| info ||&amp;quot;i&amp;quot; in blauem Kreis&lt;br /&gt;
|-&lt;br /&gt;
| newMsg || Briefkasten mit Flag&lt;br /&gt;
|-&lt;br /&gt;
| noIcon || nichts&lt;br /&gt;
|-&lt;br /&gt;
| off || Glühbirne aus&lt;br /&gt;
|-&lt;br /&gt;
| ok || Haken grün&lt;br /&gt;
|-&lt;br /&gt;
| on || Glühbirne an&lt;br /&gt;
|-&lt;br /&gt;
| open || Schloss geöffnet&lt;br /&gt;
|-&lt;br /&gt;
| serviceMsg || Mann mit Schraubenschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| sigGreen || Leuchte grün&lt;br /&gt;
|-&lt;br /&gt;
| sigRed || Leuchte rot &lt;br /&gt;
|-&lt;br /&gt;
| sigYellow || Leuchte gelb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Soll kein Text eingeblendet werden oder dieser nicht geändert werden, kann man einfach nc schreiben Beispiel&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 nc nc error&lt;br /&gt;
Dann wird nur das Icon getauscht oder eben nur jenes angezeigt.&lt;br /&gt;
&lt;br /&gt;
== dynamische Ausgaben ==&lt;br /&gt;
Um das Display wirkungsvoll einzusetzen ist es angebracht Texte dynamisch - abhängig von irgendwelchen Readings und Auswertungen zu erzeugen. Dies ist möglich, bedarf bei strukturierten Einbau einiges an Installation - ist aber am Ende einfacher als es anfänglich scheint. Möglichkeiten, es zu realisieren gibt es einige - hier ein Beispiel über myUtils. &lt;br /&gt;
=== fhemUser.cfg ===&lt;br /&gt;
Da im fhem.cfg kein set kommando vorkommen soll/kann sollte man ein separates File einbinden welches definiert nach Systeminitialisierung ausgeführt wird. Hierzu erzeugt man ein File fhem_user.cfg. Im normalen fhem.cfg baut man eine Zeile ein um es auszuführen:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Wenn das File fhem_user.cfg mit der Oberfläche angelegt wurde (Edit file, Save as), liegt es im Unterverzeichnis ./FHEM und wird so eingebunden:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include ./FHEM/fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Im fhem_user.cfg stellt man nun für die beiden Buttons des display folgende Zeilen ein&lt;br /&gt;
 set dis_01 displayWM short  line1 e:{myLineA(1,0)}&lt;br /&gt;
 set dis_01 displayWM short  line2 e:{myLineA(2,0)}&lt;br /&gt;
 set dis_01 displayWM short  line3 e:{myLineA(3,0)}&lt;br /&gt;
 set dis_01 displayWM short  line4 e:{myLineA(4,0)}&lt;br /&gt;
 set dis_01 displayWM short  line5 e:{myLineA(5,0)}&lt;br /&gt;
 set dis_01 displayWM short  line6 e:{myLineA(6,0)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_01 displayWM long   line1 e:{myLineA(1,1)}&lt;br /&gt;
 set dis_01 displayWM long   line2 e:{myLineA(2,1)}&lt;br /&gt;
 set dis_01 displayWM long   line3 e:{myLineA(3,1)}&lt;br /&gt;
 set dis_01 displayWM long   line4 e:{myLineA(4,1)}&lt;br /&gt;
 set dis_01 displayWM long   line5 e:{myLineA(5,1)}&lt;br /&gt;
 set dis_01 displayWM long   line6 e:{myLineA(6,1)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM short  line1 e:{myLineA(1,2)}&lt;br /&gt;
 set dis_02 displayWM short  line2 e:{myLineA(2,2)}&lt;br /&gt;
 set dis_02 displayWM short  line3 e:{myLineA(3,2)}&lt;br /&gt;
 set dis_02 displayWM short  line4 e:{myLineA(4,2)}&lt;br /&gt;
 set dis_02 displayWM short  line5 e:{myLineA(5,2)}&lt;br /&gt;
 set dis_02 displayWM short  line6 e:{myLineA(6,2)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM long   line1 e:{myLineA(1,3)}&lt;br /&gt;
 set dis_02 displayWM long   line2 e:{myLineA(2,3)}&lt;br /&gt;
 set dis_02 displayWM long   line3 e:{myLineA(3,3)}&lt;br /&gt;
 set dis_02 displayWM long   line4 e:{myLineA(4,3)}&lt;br /&gt;
 set dis_02 displayWM long   line5 e:{myLineA(5,3)}&lt;br /&gt;
 set dis_02 displayWM long   line6 e:{myLineA(6,3)}&lt;br /&gt;
&lt;br /&gt;
Nun wird beim Tastendruck die Funktion myLineA gesucht - diese werden wir in 99_myUtils definieren.&lt;br /&gt;
&lt;br /&gt;
=== 99_myUtils ===&lt;br /&gt;
Hat man evtl. schon - dann kann man es erweitern. Um es auszuführen muss es aufgerufen werden. Daher wird eine Entity in fhem.cfg definiert&lt;br /&gt;
 define mu myUtils&lt;br /&gt;
&lt;br /&gt;
nun das File 99_myUtils.pm. Die instruktionen sind in den Kommentaren. Da es flexibel ist ist es auch keine strikte Anleitung. &lt;br /&gt;
&lt;br /&gt;
  ##############################################&lt;br /&gt;
  #&lt;br /&gt;
  package main;&lt;br /&gt;
  &lt;br /&gt;
  use strict;&lt;br /&gt;
  use warnings;&lt;br /&gt;
  use POSIX;&lt;br /&gt;
  sub myLineA ($$);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # define counter and counterlimit per press-type&lt;br /&gt;
  # presstype are 0: btn1 short&lt;br /&gt;
  # presstype are 1: btn1 long&lt;br /&gt;
  # presstype are 2: btn2 short&lt;br /&gt;
  # presstype are 3: btn2 long&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  my @cnt   ; #init one counter per press&lt;br /&gt;
  my @cntMax; #number of entries per press&lt;br /&gt;
  # structure per button/itteration/press&lt;br /&gt;
  # insert the function to be executes to fill the line with test, color and icon&lt;br /&gt;
  # Number of itterations can be extended as desired. At least one should be present.&lt;br /&gt;
  # obey the end of the line (is open) and the number of parameters you send to the funktion&lt;br /&gt;
  my %lineArr = (0 =&amp;gt;{#============Btn Type 0: Btn1 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,1 =&amp;gt;{#============Btn Type 0: Btn1 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;Info&amp;quot;,&amp;quot;green&amp;quot;        ,&amp;quot;info&amp;quot; ,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;act:&amp;quot;,&amp;quot;I_actTotal&amp;quot;   ,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot;,&amp;quot;I_sum_battery&amp;quot;,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;fl:&amp;quot; ,&amp;quot;I_fail&amp;quot;       ,&amp;quot;green&amp;quot;,&#039;      &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(        &amp;quot;Error&amp;quot;        ,&amp;quot;red&amp;quot;,&amp;quot;error&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;ERR__protocol&amp;quot;,&amp;quot;red&amp;quot;   ,&#039;            &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot; ,&amp;quot;ERR_battery&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;W__protocol&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;            &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
                ,2 =&amp;gt;{#============Btn Type 2: Btn2 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myRT(&amp;quot;ca:&amp;quot;,&amp;quot;h.caro.Clima&amp;quot;,&#039;#  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myRT(&amp;quot;lg:&amp;quot;,&amp;quot;h.lnge.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myRT(&amp;quot;fh:&amp;quot;,&amp;quot;h.fsth.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myRT(&amp;quot;du:&amp;quot;,&amp;quot;h.dact.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myRT(&amp;quot;bs:&amp;quot;,&amp;quot;h.bad.Clima&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;   ,&amp;quot;&amp;quot;           ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,3 =&amp;gt;{#============Btn Type 3: Btn2 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myLi(&amp;quot;Fl:&amp;quot;,&amp;quot;LichtF&amp;quot;         ,&#039; &lt;br /&gt;
                           ,2=&amp;gt;&#039;{myLi(&amp;quot;Fh:&amp;quot;,&amp;quot;LichtFH&amp;quot;        ,&#039; &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myLi(&amp;quot;L1:&amp;quot;,&amp;quot;LichtL&amp;quot;         ,&#039; &lt;br /&gt;
                           ,4=&amp;gt;&#039;{myLi(&amp;quot;Sl:&amp;quot;,&amp;quot;sw_Sw&amp;quot;          ,&#039; &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myLi(&amp;quot;L2:&amp;quot;,&amp;quot;LichtL_Sw1_V_01&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myLi(&amp;quot;L3:&amp;quot;,&amp;quot;LichtL_Sw1_V_02&amp;quot;,&#039; &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;off&amp;quot;   ,&amp;quot;&amp;quot;,&amp;quot;off&amp;quot;   ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;on&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;on&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;open&amp;quot;  ,&amp;quot;&amp;quot;,&amp;quot;open&amp;quot;  ,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;closed&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;closed&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;error&amp;quot; ,&amp;quot;&amp;quot;,&amp;quot;error&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;ok&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;ok&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,2 =&amp;gt;{#-------itteration 2&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;info&amp;quot;      ,&amp;quot;white&amp;quot; ,&amp;quot;info&amp;quot;      ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;newMsg&amp;quot;    ,&amp;quot;red&amp;quot;   ,&amp;quot;newMsg&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;serviceMsg&amp;quot;,&amp;quot;orange&amp;quot;,&amp;quot;serviceMsg&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;sigGreen&amp;quot;  ,&amp;quot;yellow&amp;quot;,&amp;quot;sigGreen&amp;quot;  ,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;sigYellow&amp;quot; ,&amp;quot;green&amp;quot; ,&amp;quot;sigYellow&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;sigRed&amp;quot;    ,&amp;quot;blue&amp;quot;  ,&amp;quot;sigRed&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
     );&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  sub myUtils_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
  &lt;br /&gt;
  # Normal devices&lt;br /&gt;
    $hash-&amp;gt;{DefFn}   = &amp;quot;myUtil_Define&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn} = &amp;quot;myUtil_Undef&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{AttrList}= $readingFnAttributes;&lt;br /&gt;
    &lt;br /&gt;
    @cntMax = (scalar keys %{$lineArr{0}}&lt;br /&gt;
              ,scalar keys %{$lineArr{1}}&lt;br /&gt;
              ,scalar keys %{$lineArr{2}}&lt;br /&gt;
              ,scalar keys %{$lineArr{3}});&lt;br /&gt;
    push @cnt,&amp;quot;0&amp;quot; foreach (keys %lineArr);&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Define($$) {########################################################&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    return ;&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Undef($$) {#########################################################&lt;br /&gt;
    my ($hash, $arg) = @_;&lt;br /&gt;
    return undef;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  sub myLineA($$){# main entry - do not change!!!&lt;br /&gt;
    my ($line,$type) = @_;&lt;br /&gt;
    $cnt[$type] = ($cnt[$type] +1)%$cntMax[$type] if ($line == 1); # rotate counter per type&lt;br /&gt;
  &lt;br /&gt;
    return (eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;t&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;c&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;i&amp;quot;)}&#039;&lt;br /&gt;
           );&lt;br /&gt;
  }&lt;br /&gt;
  sub myRT($$$){ # function to return information of an RT. &lt;br /&gt;
    # line &#039;t&#039; calculates the text&lt;br /&gt;
    # line &#039;c&#039; calculates the color&lt;br /&gt;
    # line &#039;i&#039; calculates the icon&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;desired-temp&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,&amp;quot;no&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;ValvePosition&amp;quot;,0)    ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTh($$$){#temp sensor &lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;temperature&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;humidity&amp;quot;,&amp;quot;&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;temperature&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)    ? &amp;quot;ok&amp;quot;  : &amp;quot;no&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myPr($$$){#Sensor Pressure&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;pressure&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;luminosity&amp;quot;,&amp;quot;-&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;luminosity&amp;quot;,0)&amp;gt;1000 ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)         ? &amp;quot;ok&amp;quot;    : &amp;quot;error&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myLi($$$){#Light&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;state&amp;quot;,&amp;quot;xx&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;timedOn&amp;quot;,0) eq &amp;quot;off&amp;quot; ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;phyLevel&amp;quot;,ReadingsVal($e,&amp;quot;level&amp;quot;,&amp;quot;1&amp;quot;)) ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTx($$$$){#text only&lt;br /&gt;
    my ($p,$c,$icon,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p;  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return ($icon?$icon:&amp;quot;noIcon&amp;quot;);}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  sub myHm($$$$){#HMInfo readings&lt;br /&gt;
    my ($p,$e,$c,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.join(&amp;quot;,&amp;quot;, grep !/:0/&lt;br /&gt;
                                    , map{s/^(.).*?:/$1:/;;$_;;} &lt;br /&gt;
                                      split &amp;quot;,&amp;quot;&lt;br /&gt;
                                    , ReadingsVal(&amp;quot;hm&amp;quot;,$e,&amp;quot;-&amp;quot;))&lt;br /&gt;
                 }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return &amp;quot;noIcon&amp;quot;;}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  1;&lt;br /&gt;
&lt;br /&gt;
Die Definition, was angezeigt werden soll wird nun in der Struktur %lineArr festgelegt. &lt;br /&gt;
Die Typen der Ausgaben - z.B. Darstellung eines Werts eines RT - wird in der jeweiligen Funktion &amp;quot;myTh&amp;quot; festgelegt. Hier kann man so viele - nach den gleichen Regeln wie die Erste - definieren und in der Struktur nutzen. &lt;br /&gt;
In der Struktur werden die Namen der auszuwertenden Entities eingetragen. &lt;br /&gt;
Mit den Einträgen zur Itteration kann man erreichen dass beim Tastendruck der Text alterniert. Beim ersten Druck eine Seite, beim 2. eine weitere, nach der Letzten wieder die Erste.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29128}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schalter (Sender)]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14913</id>
		<title>HM-Dis-WM55 Funk Statusanzeige</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14913"/>
		<updated>2016-03-31T09:25:51Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* fhemUser.cfg */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;HM-Dis-WM55&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HomeMatic Funk-Statusanzeige WM55&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
* Farbiges OLED-Display mit 128 x 128 RGB-Bildpunkten&lt;br /&gt;
* Frei programmierbar über HomeMatic-WebUI&lt;br /&gt;
* Dynamische Zuweisung von Anzeigeplätzen, Texten, Zustand von Systemvariablen, Symbolen&lt;br /&gt;
* In den Anzeigerahmen integrierte Taster für Anmeldung, Seitenfortschaltung und Auslösen von Zentralenprogrammen, z. B. Abfrage von Fensterzuständen bei Verlassen des Hauses&lt;br /&gt;
* Nur 19 mm flach, Schraub- oder Klebmontage, ortsunabhängiger Batteriebetrieb&lt;br /&gt;
* Lieferung mit weißem Rahmen, alternativ integrierbar in 55-mm-Installationsrahmen zahlreicher Installationsserien (Berker, ELSO, GIRA, merten, JUNG)&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die Funk-Statusanzeige hat 10 Kanäle (HM-Dis-WM55_Dis_01 bis HM-Dis-WM55_Dis_10). Jedem der Kanäle können 2 Texte zugewiesen werden. Kanal 1 und 2 kommt eine Doppelrolle zu. Sie enthalten sowohl Texte, sind aber auch die beiden Tasten. Und so wird auch die Ausgabe der Displayanzeige auf diese beiden Kanäle gegeben.&lt;br /&gt;
&lt;br /&gt;
Das Display hat 6 Zeilen zur Darstellung.&lt;br /&gt;
&lt;br /&gt;
Die Zeilen können einzeln befüllt und getauscht werden, dies muss nicht in einem Rutsch passieren.&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
Es gibt hin und wieder Probleme die Register auszulesen. Abhilfe ist msgrepeat auf 3 zu setzten und hartnäckig bleiben.&lt;br /&gt;
&lt;br /&gt;
= Betrieb mit FHEM =&lt;br /&gt;
Das Gerät wird zur Zeit experimentell unterstützt.&lt;br /&gt;
msgrepeat sollte auf 3 gestellt werden, sonst gibt es öfters Timeouts:&lt;br /&gt;
 attr HM-Dis-WM55 msgRepeat 3&lt;br /&gt;
&lt;br /&gt;
Die Kanäle 1 und 2 sollten mit FHEM gepeered (zusätzlich zum pairing) werden&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 peerBulk &amp;lt;hmID&amp;gt;01&lt;br /&gt;
 set HM-Dis-WM55_Dis_02 peerBulk &amp;lt;hmID&amp;gt;01 &lt;br /&gt;
&lt;br /&gt;
Um einen Kanal mit Text zu befüllen dient der text Befehl auf einen Kanal. Es werden beide Texte in einen Kanal gleichzeitig geschrieben. Will ich einen Text tauschen muss ich den anderen mit neu setzten. Für ein Leerzeichen \_ einsetzten&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 text Fenster\_auf Fenster\_zu&lt;br /&gt;
&lt;br /&gt;
zum Übernehmen der Konfiguration den Config Taster auf der Rückseite nehmen und über das Menü übernehmen&lt;br /&gt;
&lt;br /&gt;
Nun kann man z.B. mit einem notify die Information an den Schalter senden, wenn ein Fenster offen und oder zu ist:&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 txt01_1 red error&lt;br /&gt;
&lt;br /&gt;
short bedeutet bei einem kurzen Tastendruck (es geht auch long). line bezieht sich auf die Zeile in die es geschrieben wird. Anschließend folgt der Text, die Farbe in der der Text angezeigt werden soll, sowie das Icon.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM help&lt;br /&gt;
kann eine Übersicht der gesetzten Texte angezeigt werden. Sowie der möglichen Farben und Icons.&lt;br /&gt;
&lt;br /&gt;
Folgende Farben gibt es:&lt;br /&gt;
 color is one white, red, orange, yellow, green, blue&lt;br /&gt;
&lt;br /&gt;
Folgende Icons gibt es:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| closed || Schloss geschlossen&lt;br /&gt;
|-&lt;br /&gt;
| error || Kreuz rot&lt;br /&gt;
|-&lt;br /&gt;
| ic12 || Leersymbol&lt;br /&gt;
|-&lt;br /&gt;
| ic13 || Leersymbol&lt;br /&gt;
|-&lt;br /&gt;
| info ||&amp;quot;i&amp;quot; in blauem Kreis&lt;br /&gt;
|-&lt;br /&gt;
| newMsg || Briefkasten mit Flag&lt;br /&gt;
|-&lt;br /&gt;
| noIcon || nichts&lt;br /&gt;
|-&lt;br /&gt;
| off || Glühbirne aus&lt;br /&gt;
|-&lt;br /&gt;
| ok || Haken grün&lt;br /&gt;
|-&lt;br /&gt;
| on || Glühbirne an&lt;br /&gt;
|-&lt;br /&gt;
| open || Schloss geöffnet&lt;br /&gt;
|-&lt;br /&gt;
| serviceMsg || Mann mit Schraubenschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| sigGreen || Leuchte grün&lt;br /&gt;
|-&lt;br /&gt;
| sigRed || Leuchte rot &lt;br /&gt;
|-&lt;br /&gt;
| sigYellow || Leuchte gelb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Soll kein Text eingeblendet werden oder dieser nicht geändert werden, kann man einfach nc schreiben Beispiel&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 nc nc error&lt;br /&gt;
Dann wird nur das Icon getauscht oder eben nur jenes angezeigt.&lt;br /&gt;
&lt;br /&gt;
== dynamische Ausgaben ==&lt;br /&gt;
Um das Display wirkungsvoll einzusetzen ist es angebracht Texte dynamisch - abhängig von irgendwelchen Readings und Auswertungen zu erzeugen. Dies ist möglich, bedarf bei strukturierten Einbau einiges an Installation - ist aber am Ende einfacher als es anfänglich scheint. Möglichkeiten, es zu realisieren gibt es einige - hier ein Beispiel über myUtils. &lt;br /&gt;
=== fhemUser.cfg ===&lt;br /&gt;
Da im fhem.cfg kein set kommando vorkommen soll/kann sollte man ein separates File einbinden welches definiert nach Systeminitialisierung ausgeführt wird. Hierzu erzeugt man ein File fhem_user.cfg. Im normalen fhem.cfg baut man eine Zeile ein um es auszuführen:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Wenn das File fhem_user.cfg mit der Oberfläche angelegt wurde (Edit file, Save as), liegt es im Unterverzeichnis ./FHEM und wird so eingebunden:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include ./FHEM/fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Im fhem_user.cfg stellt man nun für die beiden Buttons des display folgende Zeilen ein&lt;br /&gt;
 set dis_01 displayWM short  line1 e:{myLineA(1,0)}&lt;br /&gt;
 set dis_01 displayWM short  line2 e:{myLineA(2,0)}&lt;br /&gt;
 set dis_01 displayWM short  line3 e:{myLineA(3,0)}&lt;br /&gt;
 set dis_01 displayWM short  line4 e:{myLineA(4,0)}&lt;br /&gt;
 set dis_01 displayWM short  line5 e:{myLineA(5,0)}&lt;br /&gt;
 set dis_01 displayWM short  line6 e:{myLineA(6,0)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_01 displayWM long   line1 e:{myLineA(1,1)}&lt;br /&gt;
 set dis_01 displayWM long   line2 e:{myLineA(2,1)}&lt;br /&gt;
 set dis_01 displayWM long   line3 e:{myLineA(3,1)}&lt;br /&gt;
 set dis_01 displayWM long   line4 e:{myLineA(4,1)}&lt;br /&gt;
 set dis_01 displayWM long   line5 e:{myLineA(5,1)}&lt;br /&gt;
 set dis_01 displayWM long   line6 e:{myLineA(6,1)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM short  line1 e:{myLineA(1,2)}&lt;br /&gt;
 set dis_02 displayWM short  line2 e:{myLineA(2,2)}&lt;br /&gt;
 set dis_02 displayWM short  line3 e:{myLineA(3,2)}&lt;br /&gt;
 set dis_02 displayWM short  line4 e:{myLineA(4,2)}&lt;br /&gt;
 set dis_02 displayWM short  line5 e:{myLineA(5,2)}&lt;br /&gt;
 set dis_02 displayWM short  line6 e:{myLineA(6,2)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM long   line1 e:{myLineA(1,3)}&lt;br /&gt;
 set dis_02 displayWM long   line2 e:{myLineA(2,3)}&lt;br /&gt;
 set dis_02 displayWM long   line3 e:{myLineA(3,3)}&lt;br /&gt;
 set dis_02 displayWM long   line4 e:{myLineA(4,3)}&lt;br /&gt;
 set dis_02 displayWM long   line5 e:{myLineA(5,3)}&lt;br /&gt;
 set dis_02 displayWM long   line6 e:{myLineA(6,3)}&lt;br /&gt;
&lt;br /&gt;
Nun wird beim Tastendruck die Funktion myLineA gesucht - diese werden wir in 99_myUtils definieren.&lt;br /&gt;
&lt;br /&gt;
=== 99_myUtils ===&lt;br /&gt;
Hat man evtl. schon - dann kann man es erweitern. Um es auszuführen muss es aufgerufen werden. Daher wird eine Entity in fhem.cfg definiert&lt;br /&gt;
 define mu myUtils&lt;br /&gt;
&lt;br /&gt;
nun das File 99_myUtils.pm. Die instruktionen sind in den Kommentaren. Da es flexibel ist ist es auch keine strikte Anleitung. &lt;br /&gt;
&lt;br /&gt;
  ##############################################&lt;br /&gt;
  #&lt;br /&gt;
  package main;&lt;br /&gt;
  &lt;br /&gt;
  use strict;&lt;br /&gt;
  use warnings;&lt;br /&gt;
  use POSIX;&lt;br /&gt;
  sub myLineA ($$);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # define counter and counterlimit per press-type&lt;br /&gt;
  # presstype are 0: btn1 short&lt;br /&gt;
  # presstype are 1: btn1 long&lt;br /&gt;
  # presstype are 2: btn2 short&lt;br /&gt;
  # presstype are 3: btn2 long&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  my @cnt   ; #init one counter per press&lt;br /&gt;
  my @cntMax; #number of entries per press&lt;br /&gt;
  # structure per button/itteration/press&lt;br /&gt;
  # insert the function to be executes to fill the line with test, color and icon&lt;br /&gt;
  # Number of itterations can be extended as desired. At least one should be present.&lt;br /&gt;
  # obey the end of the line (is open) and the number of parameters you send to the funktion&lt;br /&gt;
  my %lineArr = (0 =&amp;gt;{#============Btn Type 0: Btn1 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,1 =&amp;gt;{#============Btn Type 0: Btn1 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;Info&amp;quot;,&amp;quot;green&amp;quot;        ,&amp;quot;info&amp;quot; ,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;act:&amp;quot;,&amp;quot;I_actTotal&amp;quot;   ,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot;,&amp;quot;I_sum_battery&amp;quot;,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;fl:&amp;quot; ,&amp;quot;I_fail&amp;quot;       ,&amp;quot;green&amp;quot;,&#039;      &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(        &amp;quot;Error&amp;quot;        ,&amp;quot;red&amp;quot;,&amp;quot;error&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;ERR__protocol&amp;quot;,&amp;quot;red&amp;quot;   ,&#039;            &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot; ,&amp;quot;ERR_battery&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;W__protocol&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;            &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
                ,2 =&amp;gt;{#============Btn Type 2: Btn2 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myRT(&amp;quot;ca:&amp;quot;,&amp;quot;h.caro.Clima&amp;quot;,&#039;#  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myRT(&amp;quot;lg:&amp;quot;,&amp;quot;h.lnge.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myRT(&amp;quot;fh:&amp;quot;,&amp;quot;h.fsth.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myRT(&amp;quot;du:&amp;quot;,&amp;quot;h.dact.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myRT(&amp;quot;bs:&amp;quot;,&amp;quot;h.bad.Clima&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;   ,&amp;quot;&amp;quot;           ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,3 =&amp;gt;{#============Btn Type 3: Btn2 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myLi(&amp;quot;Fl:&amp;quot;,&amp;quot;LichtF&amp;quot;         ,&#039; &lt;br /&gt;
                           ,2=&amp;gt;&#039;{myLi(&amp;quot;Fh:&amp;quot;,&amp;quot;LichtFH&amp;quot;        ,&#039; &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myLi(&amp;quot;L1:&amp;quot;,&amp;quot;LichtL&amp;quot;         ,&#039; &lt;br /&gt;
                           ,4=&amp;gt;&#039;{myLi(&amp;quot;Sl:&amp;quot;,&amp;quot;sw_Sw&amp;quot;          ,&#039; &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myLi(&amp;quot;L2:&amp;quot;,&amp;quot;LichtL_Sw1_V_01&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myLi(&amp;quot;L3:&amp;quot;,&amp;quot;LichtL_Sw1_V_02&amp;quot;,&#039; &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;off&amp;quot;   ,&amp;quot;&amp;quot;,&amp;quot;off&amp;quot;   ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;on&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;on&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;open&amp;quot;  ,&amp;quot;&amp;quot;,&amp;quot;open&amp;quot;  ,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;closed&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;closed&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;error&amp;quot; ,&amp;quot;&amp;quot;,&amp;quot;error&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;ok&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;ok&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,2 =&amp;gt;{#-------itteration 2&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;info&amp;quot;      ,&amp;quot;white&amp;quot; ,&amp;quot;info&amp;quot;      ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;newMsg&amp;quot;    ,&amp;quot;red&amp;quot;   ,&amp;quot;newMsg&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;serviceMsg&amp;quot;,&amp;quot;orange&amp;quot;,&amp;quot;serviceMsg&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;sigGreen&amp;quot;  ,&amp;quot;yellow&amp;quot;,&amp;quot;sigGreen&amp;quot;  ,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;sigYellow&amp;quot; ,&amp;quot;green&amp;quot; ,&amp;quot;sigYellow&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;sigRed&amp;quot;    ,&amp;quot;blue&amp;quot;  ,&amp;quot;sigRed&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
     );&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  sub myUtils_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
  &lt;br /&gt;
  # Normal devices&lt;br /&gt;
    $hash-&amp;gt;{DefFn}   = &amp;quot;myUtil_Define&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn} = &amp;quot;myUtil_Undef&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{AttrList}= $readingFnAttributes;&lt;br /&gt;
    &lt;br /&gt;
    @cntMax = (scalar keys %{$lineArr{0}}&lt;br /&gt;
              ,scalar keys %{$lineArr{1}}&lt;br /&gt;
              ,scalar keys %{$lineArr{2}}&lt;br /&gt;
              ,scalar keys %{$lineArr{3}});&lt;br /&gt;
    push @cnt,&amp;quot;0&amp;quot; foreach (keys %lineArr);&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Define($$) {########################################################&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    return ;&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Undef($$) {#########################################################&lt;br /&gt;
    my ($hash, $arg) = @_;&lt;br /&gt;
    return undef;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  sub myLineA($$){# main entry - do not change!!!&lt;br /&gt;
    my ($line,$type) = @_;&lt;br /&gt;
    $cnt[$type] = ($cnt[$type] +1)%$cntMax[$type] if ($line == 1); # rotate counter per type&lt;br /&gt;
  &lt;br /&gt;
    return (eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;t&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;c&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;i&amp;quot;)}&#039;&lt;br /&gt;
           );&lt;br /&gt;
  }&lt;br /&gt;
  sub myRT($$$){ # function to return information of an RT. &lt;br /&gt;
    # line &#039;t&#039; calculates the text&lt;br /&gt;
    # line &#039;c&#039; calculates the color&lt;br /&gt;
    # line &#039;i&#039; calculates the icon&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;desired-temp&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,&amp;quot;no&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;ValvePosition&amp;quot;,0)    ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTh($$$){#temp sensor &lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;temperature&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;humidity&amp;quot;,&amp;quot;&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;temperature&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)    ? &amp;quot;ok&amp;quot;  : &amp;quot;no&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myPr($$$){#Sensor Pressure&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;pressure&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;luminosity&amp;quot;,&amp;quot;-&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;luminosity&amp;quot;,0)&amp;gt;1000 ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)         ? &amp;quot;ok&amp;quot;    : &amp;quot;error&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myLi($$$){#Light&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;state&amp;quot;,&amp;quot;xx&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;timedOn&amp;quot;,0) eq &amp;quot;off&amp;quot; ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;phyLevel&amp;quot;,ReadingsVal($e,&amp;quot;level&amp;quot;,&amp;quot;1&amp;quot;)) ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTx($$$$){#text only&lt;br /&gt;
    my ($p,$c,$icon,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p;  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return ($icon?$icon:&amp;quot;noIcon&amp;quot;);}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  sub myHm($$$$){#HMInfo readings&lt;br /&gt;
    my ($p,$e,$c,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.join(&amp;quot;,&amp;quot;, grep !/:0/&lt;br /&gt;
                                    , map{s/^(.).*?:/$1:/;;$_;;} &lt;br /&gt;
                                      split &amp;quot;,&amp;quot;&lt;br /&gt;
                                    , ReadingsVal(&amp;quot;hm&amp;quot;,$e,&amp;quot;-&amp;quot;))&lt;br /&gt;
                 }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return &amp;quot;noIcon&amp;quot;;}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  1;&lt;br /&gt;
&lt;br /&gt;
Die Definition, was angezeigt werden soll wird nun in der Struktur %lineArr festgelegt. &lt;br /&gt;
Die Typen der Ausgaben - z.B. Darstellung eines Werts eines RT - wird in der jeweiligen Funktion &amp;quot;myTh&amp;quot; festgelegt. Hier kann man so viele - nach den gleichen Regeln wie die Erste - definieren und in der Struktur nutzen. &lt;br /&gt;
In der Struktur werden die Namen der auszuwertenden Entities eingetragen. &lt;br /&gt;
Mit den Einträgen zur Itteration kann man erreichen dass beim Tastendruck der Text alterniert. Beim ersten Druck eine Seite, beim 2. eine weitere, nach der Letzten wieder die Erste.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29128}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schalter (Sender)]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14863</id>
		<title>HM-Dis-WM55 Funk Statusanzeige</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14863"/>
		<updated>2016-03-28T10:02:28Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Betrieb mit FHEM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;HM-Dis-WM55&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HomeMatic Funk-Statusanzeige WM55&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
* Farbiges OLED-Display mit 128 x 128 RGB-Bildpunkten&lt;br /&gt;
* Frei programmierbar über HomeMatic-WebUI&lt;br /&gt;
* Dynamische Zuweisung von Anzeigeplätzen, Texten, Zustand von Systemvariablen, Symbolen&lt;br /&gt;
* In den Anzeigerahmen integrierte Taster für Anmeldung, Seitenfortschaltung und Auslösen von Zentralenprogrammen, z. B. Abfrage von Fensterzuständen bei Verlassen des Hauses&lt;br /&gt;
* Nur 19 mm flach, Schraub- oder Klebmontage, ortsunabhängiger Batteriebetrieb&lt;br /&gt;
* Lieferung mit weißem Rahmen, alternativ integrierbar in 55-mm-Installationsrahmen zahlreicher Installationsserien (Berker, ELSO, GIRA, merten, JUNG)&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die Funk-Statusanzeige hat 10 Kanäle (HM-Dis-WM55_Dis_01 bis HM-Dis-WM55_Dis_10). Jedem der Kanäle können 2 Texte zugewiesen werden. Kanal 1 und 2 kommt eine Doppelrolle zu. Sie enthalten sowohl Texte, sind aber auch die beiden Tasten. Und so wird auch die Ausgabe der Displayanzeige auf diese beiden Kanäle gegeben.&lt;br /&gt;
&lt;br /&gt;
Das Display hat 6 Zeilen zur Darstellung.&lt;br /&gt;
&lt;br /&gt;
Die Zeilen können einzeln befüllt und getauscht werden, dies muss nicht in einem Rutsch passieren.&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
Es gibt hin und wieder Probleme die Register auszulesen. Abhilfe ist msgrepeat auf 3 zu setzten und hartnäckig bleiben.&lt;br /&gt;
&lt;br /&gt;
= Betrieb mit FHEM =&lt;br /&gt;
Das Gerät wird zur Zeit experimentell unterstützt.&lt;br /&gt;
msgrepeat sollte auf 3 gestellt werden, sonst gibt es öfters Timeouts:&lt;br /&gt;
 attr HM-Dis-WM55 msgRepeat 3&lt;br /&gt;
&lt;br /&gt;
Die Kanäle 1 und 2 sollten mit FHEM gepeered (zusätzlich zum pairing) werden&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 peerBulk &amp;lt;hmID&amp;gt;01&lt;br /&gt;
 set HM-Dis-WM55_Dis_02 peerBulk &amp;lt;hmID&amp;gt;01 &lt;br /&gt;
&lt;br /&gt;
Um einen Kanal mit Text zu befüllen dient der text Befehl auf einen Kanal. Es werden beide Texte in einen Kanal gleichzeitig geschrieben. Will ich einen Text tauschen muss ich den anderen mit neu setzten. Für ein Leerzeichen \_ einsetzten&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 text Fenster\_auf Fenster\_zu&lt;br /&gt;
&lt;br /&gt;
zum Übernehmen der Konfiguration den Config Taster auf der Rückseite nehmen und über das Menü übernehmen&lt;br /&gt;
&lt;br /&gt;
Nun kann man z.B. mit einem notify die Information an den Schalter senden, wenn ein Fenster offen und oder zu ist:&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 txt01_1 red error&lt;br /&gt;
&lt;br /&gt;
short bedeutet bei einem kurzen Tastendruck (es geht auch long). line bezieht sich auf die Zeile in die es geschrieben wird. Anschließend folgt der Text, die Farbe in der der Text angezeigt werden soll, sowie das Icon.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM help&lt;br /&gt;
kann eine Übersicht der gesetzten Texte angezeigt werden. Sowie der möglichen Farben und Icons.&lt;br /&gt;
&lt;br /&gt;
Folgende Farben gibt es:&lt;br /&gt;
 color is one white, red, orange, yellow, green, blue&lt;br /&gt;
&lt;br /&gt;
Folgende Icons gibt es:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| closed || Schloss geschlossen&lt;br /&gt;
|-&lt;br /&gt;
| error || Kreuz rot&lt;br /&gt;
|-&lt;br /&gt;
| ic12 || Leersymbol&lt;br /&gt;
|-&lt;br /&gt;
| ic13 || Leersymbol&lt;br /&gt;
|-&lt;br /&gt;
| info ||&amp;quot;i&amp;quot; in blauem Kreis&lt;br /&gt;
|-&lt;br /&gt;
| newMsg || Briefkasten mit Flag&lt;br /&gt;
|-&lt;br /&gt;
| noIcon || nichts&lt;br /&gt;
|-&lt;br /&gt;
| off || Glühbirne aus&lt;br /&gt;
|-&lt;br /&gt;
| ok || Haken grün&lt;br /&gt;
|-&lt;br /&gt;
| on || Glühbirne an&lt;br /&gt;
|-&lt;br /&gt;
| open || Schloss geöffnet&lt;br /&gt;
|-&lt;br /&gt;
| serviceMsg || Mann mit Schraubenschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| sigGreen || Leuchte grün&lt;br /&gt;
|-&lt;br /&gt;
| sigRed || Leuchte rot &lt;br /&gt;
|-&lt;br /&gt;
| sigYellow || Leuchte gelb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Soll kein Text eingeblendet werden oder dieser nicht geändert werden, kann man einfach nc schreiben Beispiel&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 nc nc error&lt;br /&gt;
Dann wird nur das Icon getauscht oder eben nur jenes angezeigt.&lt;br /&gt;
&lt;br /&gt;
== dynamische Ausgaben ==&lt;br /&gt;
Um das Display wirkungsvoll einzusetzen ist es angebracht Texte dynamisch - abhängig von irgendwelchen Readings und Auswertungen zu erzeugen. Dies ist möglich, bedarf bei strukturierten Einbau einiges an Installation - ist aber am Ende einfacher als es anfänglich scheint. Möglichkeiten, es zu realisieren gibt es einige - hier ein Beispiel über myUtils. &lt;br /&gt;
=== fhemUser.cfg ===&lt;br /&gt;
Da im fhem.cfg kein set kommando vorkommen soll/kann sollte man ein separates File einbinden welches definiert nach Systeminitialisierung ausgeführt wird. Hierzu erzeugt man ein File fhem_user.cfg. Im normalen fhem.cfg baut man eine Zeile ein um es auszuführen:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Wenn das File fhem_user.cfg mit der Oberfläche angelegt wurde (Edit file, Save as), liegt es im Unterverzeichnis ./FHEM und so eingebunden:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include ./FHEM/fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Im fhem_user.cfg stellt man nun für die beiden Buttons des display folgende Zeilen ein&lt;br /&gt;
 set dis_01 displayWM short  line1 e:{myLineA(1,0)}&lt;br /&gt;
 set dis_01 displayWM short  line2 e:{myLineA(2,0)}&lt;br /&gt;
 set dis_01 displayWM short  line3 e:{myLineA(3,0)}&lt;br /&gt;
 set dis_01 displayWM short  line4 e:{myLineA(4,0)}&lt;br /&gt;
 set dis_01 displayWM short  line5 e:{myLineA(5,0)}&lt;br /&gt;
 set dis_01 displayWM short  line6 e:{myLineA(6,0)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_01 displayWM long   line1 e:{myLineA(1,1)}&lt;br /&gt;
 set dis_01 displayWM long   line2 e:{myLineA(2,1)}&lt;br /&gt;
 set dis_01 displayWM long   line3 e:{myLineA(3,1)}&lt;br /&gt;
 set dis_01 displayWM long   line4 e:{myLineA(4,1)}&lt;br /&gt;
 set dis_01 displayWM long   line5 e:{myLineA(5,1)}&lt;br /&gt;
 set dis_01 displayWM long   line6 e:{myLineA(6,1)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM short  line1 e:{myLineA(1,2)}&lt;br /&gt;
 set dis_02 displayWM short  line2 e:{myLineA(2,2)}&lt;br /&gt;
 set dis_02 displayWM short  line3 e:{myLineA(3,2)}&lt;br /&gt;
 set dis_02 displayWM short  line4 e:{myLineA(4,2)}&lt;br /&gt;
 set dis_02 displayWM short  line5 e:{myLineA(5,2)}&lt;br /&gt;
 set dis_02 displayWM short  line6 e:{myLineA(6,2)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM long   line1 e:{myLineA(1,3)}&lt;br /&gt;
 set dis_02 displayWM long   line2 e:{myLineA(2,3)}&lt;br /&gt;
 set dis_02 displayWM long   line3 e:{myLineA(3,3)}&lt;br /&gt;
 set dis_02 displayWM long   line4 e:{myLineA(4,3)}&lt;br /&gt;
 set dis_02 displayWM long   line5 e:{myLineA(5,3)}&lt;br /&gt;
 set dis_02 displayWM long   line6 e:{myLineA(6,3)}&lt;br /&gt;
&lt;br /&gt;
Nun wird beim Tastendruck die Funktion myLineA gesucht - diese werden wir in 99_myUtils definieren.&lt;br /&gt;
&lt;br /&gt;
=== 99_myUtils ===&lt;br /&gt;
Hat man evtl. schon - dann kann man es erweitern. Um es auszuführen muss es aufgerufen werden. Daher wird eine Entity in fhem.cfg definiert&lt;br /&gt;
 define mu myUtils&lt;br /&gt;
&lt;br /&gt;
nun das File 99_myUtils.pm. Die instruktionen sind in den Kommentaren. Da es flexibel ist ist es auch keine strikte Anleitung. &lt;br /&gt;
&lt;br /&gt;
  ##############################################&lt;br /&gt;
  #&lt;br /&gt;
  package main;&lt;br /&gt;
  &lt;br /&gt;
  use strict;&lt;br /&gt;
  use warnings;&lt;br /&gt;
  use POSIX;&lt;br /&gt;
  sub myLineA ($$);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # define counter and counterlimit per press-type&lt;br /&gt;
  # presstype are 0: btn1 short&lt;br /&gt;
  # presstype are 1: btn1 long&lt;br /&gt;
  # presstype are 2: btn2 short&lt;br /&gt;
  # presstype are 3: btn2 long&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  my @cnt   ; #init one counter per press&lt;br /&gt;
  my @cntMax; #number of entries per press&lt;br /&gt;
  # structure per button/itteration/press&lt;br /&gt;
  # insert the function to be executes to fill the line with test, color and icon&lt;br /&gt;
  # Number of itterations can be extended as desired. At least one should be present.&lt;br /&gt;
  # obey the end of the line (is open) and the number of parameters you send to the funktion&lt;br /&gt;
  my %lineArr = (0 =&amp;gt;{#============Btn Type 0: Btn1 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,1 =&amp;gt;{#============Btn Type 0: Btn1 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;Info&amp;quot;,&amp;quot;green&amp;quot;        ,&amp;quot;info&amp;quot; ,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;act:&amp;quot;,&amp;quot;I_actTotal&amp;quot;   ,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot;,&amp;quot;I_sum_battery&amp;quot;,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;fl:&amp;quot; ,&amp;quot;I_fail&amp;quot;       ,&amp;quot;green&amp;quot;,&#039;      &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(        &amp;quot;Error&amp;quot;        ,&amp;quot;red&amp;quot;,&amp;quot;error&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;ERR__protocol&amp;quot;,&amp;quot;red&amp;quot;   ,&#039;            &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot; ,&amp;quot;ERR_battery&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;W__protocol&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;            &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
                ,2 =&amp;gt;{#============Btn Type 2: Btn2 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myRT(&amp;quot;ca:&amp;quot;,&amp;quot;h.caro.Clima&amp;quot;,&#039;#  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myRT(&amp;quot;lg:&amp;quot;,&amp;quot;h.lnge.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myRT(&amp;quot;fh:&amp;quot;,&amp;quot;h.fsth.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myRT(&amp;quot;du:&amp;quot;,&amp;quot;h.dact.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myRT(&amp;quot;bs:&amp;quot;,&amp;quot;h.bad.Clima&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;   ,&amp;quot;&amp;quot;           ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,3 =&amp;gt;{#============Btn Type 3: Btn2 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myLi(&amp;quot;Fl:&amp;quot;,&amp;quot;LichtF&amp;quot;         ,&#039; &lt;br /&gt;
                           ,2=&amp;gt;&#039;{myLi(&amp;quot;Fh:&amp;quot;,&amp;quot;LichtFH&amp;quot;        ,&#039; &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myLi(&amp;quot;L1:&amp;quot;,&amp;quot;LichtL&amp;quot;         ,&#039; &lt;br /&gt;
                           ,4=&amp;gt;&#039;{myLi(&amp;quot;Sl:&amp;quot;,&amp;quot;sw_Sw&amp;quot;          ,&#039; &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myLi(&amp;quot;L2:&amp;quot;,&amp;quot;LichtL_Sw1_V_01&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myLi(&amp;quot;L3:&amp;quot;,&amp;quot;LichtL_Sw1_V_02&amp;quot;,&#039; &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;off&amp;quot;   ,&amp;quot;&amp;quot;,&amp;quot;off&amp;quot;   ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;on&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;on&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;open&amp;quot;  ,&amp;quot;&amp;quot;,&amp;quot;open&amp;quot;  ,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;closed&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;closed&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;error&amp;quot; ,&amp;quot;&amp;quot;,&amp;quot;error&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;ok&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;ok&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,2 =&amp;gt;{#-------itteration 2&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;info&amp;quot;      ,&amp;quot;white&amp;quot; ,&amp;quot;info&amp;quot;      ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;newMsg&amp;quot;    ,&amp;quot;red&amp;quot;   ,&amp;quot;newMsg&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;serviceMsg&amp;quot;,&amp;quot;orange&amp;quot;,&amp;quot;serviceMsg&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;sigGreen&amp;quot;  ,&amp;quot;yellow&amp;quot;,&amp;quot;sigGreen&amp;quot;  ,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;sigYellow&amp;quot; ,&amp;quot;green&amp;quot; ,&amp;quot;sigYellow&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;sigRed&amp;quot;    ,&amp;quot;blue&amp;quot;  ,&amp;quot;sigRed&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
     );&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  sub myUtils_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
  &lt;br /&gt;
  # Normal devices&lt;br /&gt;
    $hash-&amp;gt;{DefFn}   = &amp;quot;myUtil_Define&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn} = &amp;quot;myUtil_Undef&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{AttrList}= $readingFnAttributes;&lt;br /&gt;
    &lt;br /&gt;
    @cntMax = (scalar keys %{$lineArr{0}}&lt;br /&gt;
              ,scalar keys %{$lineArr{1}}&lt;br /&gt;
              ,scalar keys %{$lineArr{2}}&lt;br /&gt;
              ,scalar keys %{$lineArr{3}});&lt;br /&gt;
    push @cnt,&amp;quot;0&amp;quot; foreach (keys %lineArr);&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Define($$) {########################################################&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    return ;&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Undef($$) {#########################################################&lt;br /&gt;
    my ($hash, $arg) = @_;&lt;br /&gt;
    return undef;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  sub myLineA($$){# main entry - do not change!!!&lt;br /&gt;
    my ($line,$type) = @_;&lt;br /&gt;
    $cnt[$type] = ($cnt[$type] +1)%$cntMax[$type] if ($line == 1); # rotate counter per type&lt;br /&gt;
  &lt;br /&gt;
    return (eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;t&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;c&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;i&amp;quot;)}&#039;&lt;br /&gt;
           );&lt;br /&gt;
  }&lt;br /&gt;
  sub myRT($$$){ # function to return information of an RT. &lt;br /&gt;
    # line &#039;t&#039; calculates the text&lt;br /&gt;
    # line &#039;c&#039; calculates the color&lt;br /&gt;
    # line &#039;i&#039; calculates the icon&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;desired-temp&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,&amp;quot;no&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;ValvePosition&amp;quot;,0)    ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTh($$$){#temp sensor &lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;temperature&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;humidity&amp;quot;,&amp;quot;&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;temperature&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)    ? &amp;quot;ok&amp;quot;  : &amp;quot;no&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myPr($$$){#Sensor Pressure&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;pressure&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;luminosity&amp;quot;,&amp;quot;-&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;luminosity&amp;quot;,0)&amp;gt;1000 ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)         ? &amp;quot;ok&amp;quot;    : &amp;quot;error&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myLi($$$){#Light&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;state&amp;quot;,&amp;quot;xx&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;timedOn&amp;quot;,0) eq &amp;quot;off&amp;quot; ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;phyLevel&amp;quot;,ReadingsVal($e,&amp;quot;level&amp;quot;,&amp;quot;1&amp;quot;)) ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTx($$$$){#text only&lt;br /&gt;
    my ($p,$c,$icon,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p;  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return ($icon?$icon:&amp;quot;noIcon&amp;quot;);}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  sub myHm($$$$){#HMInfo readings&lt;br /&gt;
    my ($p,$e,$c,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.join(&amp;quot;,&amp;quot;, grep !/:0/&lt;br /&gt;
                                    , map{s/^(.).*?:/$1:/;;$_;;} &lt;br /&gt;
                                      split &amp;quot;,&amp;quot;&lt;br /&gt;
                                    , ReadingsVal(&amp;quot;hm&amp;quot;,$e,&amp;quot;-&amp;quot;))&lt;br /&gt;
                 }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return &amp;quot;noIcon&amp;quot;;}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  1;&lt;br /&gt;
&lt;br /&gt;
Die Definition, was angezeigt werden soll wird nun in der Struktur %lineArr festgelegt. &lt;br /&gt;
Die Typen der Ausgaben - z.B. Darstellung eines Werts eines RT - wird in der jeweiligen Funktion &amp;quot;myTh&amp;quot; festgelegt. Hier kann man so viele - nach den gleichen Regeln wie die Erste - definieren und in der Struktur nutzen. &lt;br /&gt;
In der Struktur werden die Namen der auszuwertenden Entities eingetragen. &lt;br /&gt;
Mit den Einträgen zur Itteration kann man erreichen dass beim Tastendruck der Text alterniert. Beim ersten Druck eine Seite, beim 2. eine weitere, nach der Letzten wieder die Erste.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29128}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schalter (Sender)]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14862</id>
		<title>HM-Dis-WM55 Funk Statusanzeige</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14862"/>
		<updated>2016-03-28T07:24:10Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Betrieb mit FHEM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;HM-Dis-WM55&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HomeMatic Funk-Statusanzeige WM55&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
* Farbiges OLED-Display mit 128 x 128 RGB-Bildpunkten&lt;br /&gt;
* Frei programmierbar über HomeMatic-WebUI&lt;br /&gt;
* Dynamische Zuweisung von Anzeigeplätzen, Texten, Zustand von Systemvariablen, Symbolen&lt;br /&gt;
* In den Anzeigerahmen integrierte Taster für Anmeldung, Seitenfortschaltung und Auslösen von Zentralenprogrammen, z. B. Abfrage von Fensterzuständen bei Verlassen des Hauses&lt;br /&gt;
* Nur 19 mm flach, Schraub- oder Klebmontage, ortsunabhängiger Batteriebetrieb&lt;br /&gt;
* Lieferung mit weißem Rahmen, alternativ integrierbar in 55-mm-Installationsrahmen zahlreicher Installationsserien (Berker, ELSO, GIRA, merten, JUNG)&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die Funk-Statusanzeige hat 10 Kanäle (HM-Dis-WM55_Dis_01 bis HM-Dis-WM55_Dis_10). Jedem der Kanäle können 2 Texte zugewiesen werden. Kanal 1 und 2 kommt eine Doppelrolle zu. Sie enthalten sowohl Texte, sind aber auch die beiden Tasten. Und so wird auch die Ausgabe der Displayanzeige auf diese beiden Kanäle gegeben.&lt;br /&gt;
&lt;br /&gt;
Das Display hat 6 Zeilen zur Darstellung.&lt;br /&gt;
&lt;br /&gt;
Die Zeilen können einzeln befüllt und getauscht werden, dies muss nicht in einem Rutsch passieren.&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
Es gibt hin und wieder Probleme die Register auszulesen. Abhilfe ist msgrepeat auf 3 zu setzten und hartnäckig bleiben.&lt;br /&gt;
&lt;br /&gt;
= Betrieb mit FHEM =&lt;br /&gt;
Das Gerät wird zur Zeit experimentell unterstützt.&lt;br /&gt;
msgrepeat sollte auf 3 gestellt werden, sonst gibt es öfters Timeouts:&lt;br /&gt;
 attr HM-Dis-WM55 msgRepeat 3&lt;br /&gt;
&lt;br /&gt;
Die Kanäle 1 und 2 sollten mit FHEM gepeered (zusätzlich zum pairing) werden&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 peerBulk &amp;lt;hmID&amp;gt;01&lt;br /&gt;
 set HM-Dis-WM55_Dis_02 peerBulk &amp;lt;hmID&amp;gt;01 &lt;br /&gt;
&lt;br /&gt;
Um einen Kanal mit Text zu befüllen dient der text Befehl auf einen Kanal. Es werden beide Texte in einen Kanal gleichzeitig geschrieben. Will ich einen Text tauschen muss ich den anderen mit neu setzten. Für ein Leerzeichen \_ einsetzten&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 text Fenster\_auf Fenster\_zu&lt;br /&gt;
&lt;br /&gt;
zum Übernehmen der Konfiguration den Config Taster auf der Rückseite nehmen und über das Menü übernehmen&lt;br /&gt;
&lt;br /&gt;
Nun kann man z.B. mit einem notify die Information an den Schalter senden, wenn ein Fenster offen und oder zu ist:&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 txt01_1 red error&lt;br /&gt;
&lt;br /&gt;
short bedeutet bei einem kurzen Tastendruck (es geht auch long). line bezieht sich auf die Zeile in die es geschrieben wird. Anschließend folgt der Text, die Farbe in der der Text angezeigt werden soll, sowie das Icon.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM help&lt;br /&gt;
kann eine Übersicht der gesetzten Texte angezeigt werden. Sowie der möglichen Farben und Icons.&lt;br /&gt;
&lt;br /&gt;
Folgende Farben gibt es:&lt;br /&gt;
 color is one white, red, orange, yellow, green, blue&lt;br /&gt;
&lt;br /&gt;
Folgende Icons gibt es:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| closed || Schloss geschlossen&lt;br /&gt;
|-&lt;br /&gt;
| error || Kreuz rot&lt;br /&gt;
|-&lt;br /&gt;
| ic12 || Leersymbol&lt;br /&gt;
|-&lt;br /&gt;
| ic13 || Leersymbol&lt;br /&gt;
|-&lt;br /&gt;
| info ||&amp;quot;i&amp;quot; in blauem Kreis&lt;br /&gt;
|-&lt;br /&gt;
| newMsg || Briefkasten mit Flag&lt;br /&gt;
|-&lt;br /&gt;
| noIcon || nichts&lt;br /&gt;
|-&lt;br /&gt;
| off || Glühbirne aus&lt;br /&gt;
|-&lt;br /&gt;
| ok || Haken grün&lt;br /&gt;
|-&lt;br /&gt;
| on || Glühbirne an&lt;br /&gt;
|-&lt;br /&gt;
| open || Schloss geöffnet&lt;br /&gt;
|-&lt;br /&gt;
| serviceMsg || Mann mit Schraubenschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| sigGreen || Leuchte grün&lt;br /&gt;
|-&lt;br /&gt;
| sigRed || Leuchte rot &lt;br /&gt;
|-&lt;br /&gt;
| sigYellow || Leuchte gelb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Soll kein Text eingeblendet werden oder dieser nicht geändert werden kann man einfach nc schreiben Beispiel&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 nc nc error&lt;br /&gt;
Dann wird nur das Icon getauscht oder eben nur jenes angezeigt.&lt;br /&gt;
&lt;br /&gt;
== dynamische Ausgaben ==&lt;br /&gt;
Um das Display wirkungsvoll einzusetzen ist es angebracht Texte dynamisch - abhängig von irgendwelchen Readings und Auswertungen zu erzeugen. Dies ist möglich, bedarf bei strukturierten Einbau einiges an Installation - ist aber am Ende einfacher als es anfänglich scheint. Möglichkeiten, es zu realisieren gibt es einige - hier ein Beispiel über myUtils. &lt;br /&gt;
=== fhemUser.cfg ===&lt;br /&gt;
Da im fhem.cfg kein set kommando vorkommen soll/kann sollte man ein separates File einbinden welches definiert nach Systeminitialisierung ausgeführt wird. Hierzu erzeugt man ein File fhem_user.cfg. Im normalen fhem.cfg baut man eine Zeile ein um es auszuführen:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Wenn das File fhem_user.cfg mit der Oberfläche angelegt wurde (Edit file, Save as), liegt es im Unterverzeichnis ./FHEM und so eingebunden:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include ./FHEM/fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Im fhem_user.cfg stellt man nun für die beiden Buttons des display folgende Zeilen ein&lt;br /&gt;
 set dis_01 displayWM short  line1 e:{myLineA(1,0)}&lt;br /&gt;
 set dis_01 displayWM short  line2 e:{myLineA(2,0)}&lt;br /&gt;
 set dis_01 displayWM short  line3 e:{myLineA(3,0)}&lt;br /&gt;
 set dis_01 displayWM short  line4 e:{myLineA(4,0)}&lt;br /&gt;
 set dis_01 displayWM short  line5 e:{myLineA(5,0)}&lt;br /&gt;
 set dis_01 displayWM short  line6 e:{myLineA(6,0)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_01 displayWM long   line1 e:{myLineA(1,1)}&lt;br /&gt;
 set dis_01 displayWM long   line2 e:{myLineA(2,1)}&lt;br /&gt;
 set dis_01 displayWM long   line3 e:{myLineA(3,1)}&lt;br /&gt;
 set dis_01 displayWM long   line4 e:{myLineA(4,1)}&lt;br /&gt;
 set dis_01 displayWM long   line5 e:{myLineA(5,1)}&lt;br /&gt;
 set dis_01 displayWM long   line6 e:{myLineA(6,1)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM short  line1 e:{myLineA(1,2)}&lt;br /&gt;
 set dis_02 displayWM short  line2 e:{myLineA(2,2)}&lt;br /&gt;
 set dis_02 displayWM short  line3 e:{myLineA(3,2)}&lt;br /&gt;
 set dis_02 displayWM short  line4 e:{myLineA(4,2)}&lt;br /&gt;
 set dis_02 displayWM short  line5 e:{myLineA(5,2)}&lt;br /&gt;
 set dis_02 displayWM short  line6 e:{myLineA(6,2)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM long   line1 e:{myLineA(1,3)}&lt;br /&gt;
 set dis_02 displayWM long   line2 e:{myLineA(2,3)}&lt;br /&gt;
 set dis_02 displayWM long   line3 e:{myLineA(3,3)}&lt;br /&gt;
 set dis_02 displayWM long   line4 e:{myLineA(4,3)}&lt;br /&gt;
 set dis_02 displayWM long   line5 e:{myLineA(5,3)}&lt;br /&gt;
 set dis_02 displayWM long   line6 e:{myLineA(6,3)}&lt;br /&gt;
&lt;br /&gt;
Nun wird beim Tastendruck die Funktion myLineA gesucht - diese werden wir in 99_myUtils definieren.&lt;br /&gt;
&lt;br /&gt;
=== 99_myUtils ===&lt;br /&gt;
Hat man evtl. schon - dann kann man es erweitern. Um es auszuführen muss es aufgerufen werden. Daher wird eine Entity in fhem.cfg definiert&lt;br /&gt;
 define mu myUtils&lt;br /&gt;
&lt;br /&gt;
nun das File 99_myUtils.pm. Die instruktionen sind in den Kommentaren. Da es flexibel ist ist es auch keine strikte Anleitung. &lt;br /&gt;
&lt;br /&gt;
  ##############################################&lt;br /&gt;
  #&lt;br /&gt;
  package main;&lt;br /&gt;
  &lt;br /&gt;
  use strict;&lt;br /&gt;
  use warnings;&lt;br /&gt;
  use POSIX;&lt;br /&gt;
  sub myLineA ($$);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # define counter and counterlimit per press-type&lt;br /&gt;
  # presstype are 0: btn1 short&lt;br /&gt;
  # presstype are 1: btn1 long&lt;br /&gt;
  # presstype are 2: btn2 short&lt;br /&gt;
  # presstype are 3: btn2 long&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  my @cnt   ; #init one counter per press&lt;br /&gt;
  my @cntMax; #number of entries per press&lt;br /&gt;
  # structure per button/itteration/press&lt;br /&gt;
  # insert the function to be executes to fill the line with test, color and icon&lt;br /&gt;
  # Number of itterations can be extended as desired. At least one should be present.&lt;br /&gt;
  # obey the end of the line (is open) and the number of parameters you send to the funktion&lt;br /&gt;
  my %lineArr = (0 =&amp;gt;{#============Btn Type 0: Btn1 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,1 =&amp;gt;{#============Btn Type 0: Btn1 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;Info&amp;quot;,&amp;quot;green&amp;quot;        ,&amp;quot;info&amp;quot; ,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;act:&amp;quot;,&amp;quot;I_actTotal&amp;quot;   ,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot;,&amp;quot;I_sum_battery&amp;quot;,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;fl:&amp;quot; ,&amp;quot;I_fail&amp;quot;       ,&amp;quot;green&amp;quot;,&#039;      &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(        &amp;quot;Error&amp;quot;        ,&amp;quot;red&amp;quot;,&amp;quot;error&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;ERR__protocol&amp;quot;,&amp;quot;red&amp;quot;   ,&#039;            &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot; ,&amp;quot;ERR_battery&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;W__protocol&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;            &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
                ,2 =&amp;gt;{#============Btn Type 2: Btn2 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myRT(&amp;quot;ca:&amp;quot;,&amp;quot;h.caro.Clima&amp;quot;,&#039;#  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myRT(&amp;quot;lg:&amp;quot;,&amp;quot;h.lnge.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myRT(&amp;quot;fh:&amp;quot;,&amp;quot;h.fsth.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myRT(&amp;quot;du:&amp;quot;,&amp;quot;h.dact.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myRT(&amp;quot;bs:&amp;quot;,&amp;quot;h.bad.Clima&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;   ,&amp;quot;&amp;quot;           ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,3 =&amp;gt;{#============Btn Type 3: Btn2 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myLi(&amp;quot;Fl:&amp;quot;,&amp;quot;LichtF&amp;quot;         ,&#039; &lt;br /&gt;
                           ,2=&amp;gt;&#039;{myLi(&amp;quot;Fh:&amp;quot;,&amp;quot;LichtFH&amp;quot;        ,&#039; &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myLi(&amp;quot;L1:&amp;quot;,&amp;quot;LichtL&amp;quot;         ,&#039; &lt;br /&gt;
                           ,4=&amp;gt;&#039;{myLi(&amp;quot;Sl:&amp;quot;,&amp;quot;sw_Sw&amp;quot;          ,&#039; &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myLi(&amp;quot;L2:&amp;quot;,&amp;quot;LichtL_Sw1_V_01&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myLi(&amp;quot;L3:&amp;quot;,&amp;quot;LichtL_Sw1_V_02&amp;quot;,&#039; &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;off&amp;quot;   ,&amp;quot;&amp;quot;,&amp;quot;off&amp;quot;   ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;on&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;on&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;open&amp;quot;  ,&amp;quot;&amp;quot;,&amp;quot;open&amp;quot;  ,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;closed&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;closed&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;error&amp;quot; ,&amp;quot;&amp;quot;,&amp;quot;error&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;ok&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;ok&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,2 =&amp;gt;{#-------itteration 2&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;info&amp;quot;      ,&amp;quot;white&amp;quot; ,&amp;quot;info&amp;quot;      ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;newMsg&amp;quot;    ,&amp;quot;red&amp;quot;   ,&amp;quot;newMsg&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;serviceMsg&amp;quot;,&amp;quot;orange&amp;quot;,&amp;quot;serviceMsg&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;sigGreen&amp;quot;  ,&amp;quot;yellow&amp;quot;,&amp;quot;sigGreen&amp;quot;  ,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;sigYellow&amp;quot; ,&amp;quot;green&amp;quot; ,&amp;quot;sigYellow&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;sigRed&amp;quot;    ,&amp;quot;blue&amp;quot;  ,&amp;quot;sigRed&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
     );&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  sub myUtils_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
  &lt;br /&gt;
  # Normal devices&lt;br /&gt;
    $hash-&amp;gt;{DefFn}   = &amp;quot;myUtil_Define&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn} = &amp;quot;myUtil_Undef&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{AttrList}= $readingFnAttributes;&lt;br /&gt;
    &lt;br /&gt;
    @cntMax = (scalar keys %{$lineArr{0}}&lt;br /&gt;
              ,scalar keys %{$lineArr{1}}&lt;br /&gt;
              ,scalar keys %{$lineArr{2}}&lt;br /&gt;
              ,scalar keys %{$lineArr{3}});&lt;br /&gt;
    push @cnt,&amp;quot;0&amp;quot; foreach (keys %lineArr);&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Define($$) {########################################################&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    return ;&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Undef($$) {#########################################################&lt;br /&gt;
    my ($hash, $arg) = @_;&lt;br /&gt;
    return undef;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  sub myLineA($$){# main entry - do not change!!!&lt;br /&gt;
    my ($line,$type) = @_;&lt;br /&gt;
    $cnt[$type] = ($cnt[$type] +1)%$cntMax[$type] if ($line == 1); # rotate counter per type&lt;br /&gt;
  &lt;br /&gt;
    return (eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;t&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;c&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;i&amp;quot;)}&#039;&lt;br /&gt;
           );&lt;br /&gt;
  }&lt;br /&gt;
  sub myRT($$$){ # function to return information of an RT. &lt;br /&gt;
    # line &#039;t&#039; calculates the text&lt;br /&gt;
    # line &#039;c&#039; calculates the color&lt;br /&gt;
    # line &#039;i&#039; calculates the icon&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;desired-temp&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,&amp;quot;no&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;ValvePosition&amp;quot;,0)    ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTh($$$){#temp sensor &lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;temperature&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;humidity&amp;quot;,&amp;quot;&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;temperature&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)    ? &amp;quot;ok&amp;quot;  : &amp;quot;no&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myPr($$$){#Sensor Pressure&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;pressure&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;luminosity&amp;quot;,&amp;quot;-&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;luminosity&amp;quot;,0)&amp;gt;1000 ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)         ? &amp;quot;ok&amp;quot;    : &amp;quot;error&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myLi($$$){#Light&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;state&amp;quot;,&amp;quot;xx&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;timedOn&amp;quot;,0) eq &amp;quot;off&amp;quot; ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;phyLevel&amp;quot;,ReadingsVal($e,&amp;quot;level&amp;quot;,&amp;quot;1&amp;quot;)) ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTx($$$$){#text only&lt;br /&gt;
    my ($p,$c,$icon,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p;  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return ($icon?$icon:&amp;quot;noIcon&amp;quot;);}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  sub myHm($$$$){#HMInfo readings&lt;br /&gt;
    my ($p,$e,$c,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.join(&amp;quot;,&amp;quot;, grep !/:0/&lt;br /&gt;
                                    , map{s/^(.).*?:/$1:/;;$_;;} &lt;br /&gt;
                                      split &amp;quot;,&amp;quot;&lt;br /&gt;
                                    , ReadingsVal(&amp;quot;hm&amp;quot;,$e,&amp;quot;-&amp;quot;))&lt;br /&gt;
                 }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return &amp;quot;noIcon&amp;quot;;}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  1;&lt;br /&gt;
&lt;br /&gt;
Die Definition, was angezeigt werden soll wird nun in der Struktur %lineArr festgelegt. &lt;br /&gt;
Die Typen der Ausgaben - z.B. Darstellung eines Werts eines RT - wird in der jeweiligen Funktion &amp;quot;myTh&amp;quot; festgelegt. Hier kann man so viele - nach den gleichen Regeln wie die Erste - definieren und in der Struktur nutzen. &lt;br /&gt;
In der Struktur werden die Namen der auszuwertenden Entities eingetragen. &lt;br /&gt;
Mit den Einträgen zur Itteration kann man erreichen dass beim Tastendruck der Text alterniert. Beim ersten Druck eine Seite, beim 2. eine weitere, nach der Letzten wieder die Erste.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29128}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schalter (Sender)]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14861</id>
		<title>HM-Dis-WM55 Funk Statusanzeige</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14861"/>
		<updated>2016-03-27T20:51:06Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* fhemUser.cfg */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;HM-Dis-WM55&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HomeMatic Funk-Statusanzeige WM55&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
* Farbiges OLED-Display mit 128 x 128 RGB-Bildpunkten&lt;br /&gt;
* Frei programmierbar über HomeMatic-WebUI&lt;br /&gt;
* Dynamische Zuweisung von Anzeigeplätzen, Texten, Zustand von Systemvariablen, Symbolen&lt;br /&gt;
* In den Anzeigerahmen integrierte Taster für Anmeldung, Seitenfortschaltung und Auslösen von Zentralenprogrammen, z. B. Abfrage von Fensterzuständen bei Verlassen des Hauses&lt;br /&gt;
* Nur 19 mm flach, Schraub- oder Klebmontage, ortsunabhängiger Batteriebetrieb&lt;br /&gt;
* Lieferung mit weißem Rahmen, alternativ integrierbar in 55-mm-Installationsrahmen zahlreicher Installationsserien (Berker, ELSO, GIRA, merten, JUNG)&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die Funk-Statusanzeige hat 10 Kanäle (HM-Dis-WM55_Dis_01 bis HM-Dis-WM55_Dis_10). Jedem der Kanäle können 2 Texte zugewiesen werden. Kanal 1 und 2 kommt eine Doppelrolle zu. Sie enthalten sowohl Texte, sind aber auch die beiden Tasten. Und so wird auch die Ausgabe der Displayanzeige auf diese beiden Kanäle gegeben.&lt;br /&gt;
&lt;br /&gt;
Das Display hat 6 Zeilen zur Darstellung.&lt;br /&gt;
&lt;br /&gt;
Die Zeilen können einzeln befüllt und getauscht werden, dies muss nicht in einem Rutsch passieren.&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
Es gibt hin und wieder Probleme die Register auszulesen. Abhilfe ist msgrepeat auf 3 zu setzten und hartnäckig bleiben.&lt;br /&gt;
&lt;br /&gt;
= Betrieb mit FHEM =&lt;br /&gt;
Das Gerät wird zur Zeit experimentell unterstützt.&lt;br /&gt;
msgrepeat sollte auf 3 gestellt werden, sonst gibt es öfters Timeouts:&lt;br /&gt;
 attr HM-Dis-WM55 msgRepeat 3&lt;br /&gt;
&lt;br /&gt;
Die Kanäle 1 und 2 sollten mit FHEM gepeered (zusätzlich zum pairing) werden&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 peerBulk &amp;lt;hmID&amp;gt;01&lt;br /&gt;
 set HM-Dis-WM55_Dis_02 peerBulk &amp;lt;hmID&amp;gt;01 &lt;br /&gt;
&lt;br /&gt;
Um einen Kanal mit Text zu befüllen dient der text Befehl auf einen Kanal. Es werden beide Texte in einen Kanal gleichzeitig geschrieben. Will ich einen Text tauschen muss ich den anderen mit neu setzten. Für ein Leerzeichen \_ einsetzten&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 text Fenster\_auf Fenster\_zu&lt;br /&gt;
&lt;br /&gt;
zum Übernehmen der Konfiguration den Config Taster auf der Rückseite nehmen und über das Menü übernehmen&lt;br /&gt;
&lt;br /&gt;
Nun kann man z.B. mit einem notify die Information an den Schalter senden, wenn ein Fenster offen und oder zu ist:&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 txt01_1 red error&lt;br /&gt;
&lt;br /&gt;
short bedeutet bei einem kurzen Tastendruck (es geht auch long). line bezieht sich auf die Zeile in die es geschrieben wird. Anschließend folgt der Text, die Farbe in der der Text angezeigt werden soll, sowie das Icon.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM help&lt;br /&gt;
kann eine Übersicht der gesetzten Texte angezeigt werden. Sowie der möglichen Farben und Icons.&lt;br /&gt;
&lt;br /&gt;
Folgende Farben gibt es:&lt;br /&gt;
 color is one white, red, orange, yellow, green, blue&lt;br /&gt;
&lt;br /&gt;
Folgende Icons gibt es:&lt;br /&gt;
;closed&lt;br /&gt;
: Schloss geschlossen&lt;br /&gt;
;error&lt;br /&gt;
: Kreuz rot&lt;br /&gt;
;ic12&lt;br /&gt;
: Leersymbol&lt;br /&gt;
;ic13&lt;br /&gt;
: Leersymbol&lt;br /&gt;
;info&lt;br /&gt;
: &amp;quot;i&amp;quot; in blauem Kreis&lt;br /&gt;
;newMsg&lt;br /&gt;
: Briefkasten mit Flag&lt;br /&gt;
;noIcon&lt;br /&gt;
: nichts&lt;br /&gt;
;off&lt;br /&gt;
: Glühbirne aus&lt;br /&gt;
;ok&lt;br /&gt;
: Haken grün&lt;br /&gt;
;on&lt;br /&gt;
: Glühbirne an&lt;br /&gt;
;open&lt;br /&gt;
: Schloss geöffnet&lt;br /&gt;
;serviceMsg&lt;br /&gt;
: Mann mit Schraubenschlüssel&lt;br /&gt;
;sigGreen&lt;br /&gt;
: Leuchte grün&lt;br /&gt;
;sigRed&lt;br /&gt;
: Leuchte rot&lt;br /&gt;
;sigYellow&lt;br /&gt;
: Leuchte gelb&lt;br /&gt;
&lt;br /&gt;
Soll kein Text eingeblendet werden oder dieser nicht geändert werden kann man einfach nc schreiben Beispiel&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 nc nc error&lt;br /&gt;
Dann wird nur das Icon getauscht oder eben nur jenes angezeigt.&lt;br /&gt;
&lt;br /&gt;
== dynamische Ausgaben ==&lt;br /&gt;
Um das Display wirkungsvoll einzusetzen ist es angebracht Texte dynamisch - abhängig von irgendwelchen Readings und Auswertungen zu erzeugen. Dies ist möglich, bedarf bei strukturierten Einbau einiges an Installation - ist aber am Ende einfacher als es anfänglich scheint. Möglichkeiten, es zu realisieren gibt es einige - hier ein Beispiel über myUtils. &lt;br /&gt;
=== fhemUser.cfg ===&lt;br /&gt;
Da im fhem.cfg kein set kommando vorkommen soll/kann sollte man ein separates File einbinden welches definiert nach Systeminitialisierung ausgeführt wird. Hierzu erzeugt man ein File fhem_user.cfg. Im normalen fhem.cfg baut man eine Zeile ein um es auszuführen:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Wenn das File fhem_user.cfg mit der Oberfläche angelegt wurde (Edit file, Save as), liegt es im Unterverzeichnis ./FHEM und so eingebunden:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include ./FHEM/fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
Im fhem_user.cfg stellt man nun für die beiden Buttons des display folgende Zeilen ein&lt;br /&gt;
 set dis_01 displayWM short  line1 e:{myLineA(1,0)}&lt;br /&gt;
 set dis_01 displayWM short  line2 e:{myLineA(2,0)}&lt;br /&gt;
 set dis_01 displayWM short  line3 e:{myLineA(3,0)}&lt;br /&gt;
 set dis_01 displayWM short  line4 e:{myLineA(4,0)}&lt;br /&gt;
 set dis_01 displayWM short  line5 e:{myLineA(5,0)}&lt;br /&gt;
 set dis_01 displayWM short  line6 e:{myLineA(6,0)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_01 displayWM long   line1 e:{myLineA(1,1)}&lt;br /&gt;
 set dis_01 displayWM long   line2 e:{myLineA(2,1)}&lt;br /&gt;
 set dis_01 displayWM long   line3 e:{myLineA(3,1)}&lt;br /&gt;
 set dis_01 displayWM long   line4 e:{myLineA(4,1)}&lt;br /&gt;
 set dis_01 displayWM long   line5 e:{myLineA(5,1)}&lt;br /&gt;
 set dis_01 displayWM long   line6 e:{myLineA(6,1)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM short  line1 e:{myLineA(1,2)}&lt;br /&gt;
 set dis_02 displayWM short  line2 e:{myLineA(2,2)}&lt;br /&gt;
 set dis_02 displayWM short  line3 e:{myLineA(3,2)}&lt;br /&gt;
 set dis_02 displayWM short  line4 e:{myLineA(4,2)}&lt;br /&gt;
 set dis_02 displayWM short  line5 e:{myLineA(5,2)}&lt;br /&gt;
 set dis_02 displayWM short  line6 e:{myLineA(6,2)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM long   line1 e:{myLineA(1,3)}&lt;br /&gt;
 set dis_02 displayWM long   line2 e:{myLineA(2,3)}&lt;br /&gt;
 set dis_02 displayWM long   line3 e:{myLineA(3,3)}&lt;br /&gt;
 set dis_02 displayWM long   line4 e:{myLineA(4,3)}&lt;br /&gt;
 set dis_02 displayWM long   line5 e:{myLineA(5,3)}&lt;br /&gt;
 set dis_02 displayWM long   line6 e:{myLineA(6,3)}&lt;br /&gt;
&lt;br /&gt;
Nun wird beim Tastendruck die Funktion myLineA gesucht - diese werden wir in 99_myUtils definieren.&lt;br /&gt;
&lt;br /&gt;
=== 99_myUtils ===&lt;br /&gt;
Hat man evtl. schon - dann kann man es erweitern. Um es auszuführen muss es aufgerufen werden. Daher wird eine Entity in fhem.cfg definiert&lt;br /&gt;
 define mu myUtils&lt;br /&gt;
&lt;br /&gt;
nun das File 99_myUtils.pm. Die instruktionen sind in den Kommentaren. Da es flexibel ist ist es auch keine strikte Anleitung. &lt;br /&gt;
&lt;br /&gt;
  ##############################################&lt;br /&gt;
  #&lt;br /&gt;
  package main;&lt;br /&gt;
  &lt;br /&gt;
  use strict;&lt;br /&gt;
  use warnings;&lt;br /&gt;
  use POSIX;&lt;br /&gt;
  sub myLineA ($$);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # define counter and counterlimit per press-type&lt;br /&gt;
  # presstype are 0: btn1 short&lt;br /&gt;
  # presstype are 1: btn1 long&lt;br /&gt;
  # presstype are 2: btn2 short&lt;br /&gt;
  # presstype are 3: btn2 long&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  my @cnt   ; #init one counter per press&lt;br /&gt;
  my @cntMax; #number of entries per press&lt;br /&gt;
  # structure per button/itteration/press&lt;br /&gt;
  # insert the function to be executes to fill the line with test, color and icon&lt;br /&gt;
  # Number of itterations can be extended as desired. At least one should be present.&lt;br /&gt;
  # obey the end of the line (is open) and the number of parameters you send to the funktion&lt;br /&gt;
  my %lineArr = (0 =&amp;gt;{#============Btn Type 0: Btn1 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,1 =&amp;gt;{#============Btn Type 0: Btn1 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;Info&amp;quot;,&amp;quot;green&amp;quot;        ,&amp;quot;info&amp;quot; ,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;act:&amp;quot;,&amp;quot;I_actTotal&amp;quot;   ,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot;,&amp;quot;I_sum_battery&amp;quot;,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;fl:&amp;quot; ,&amp;quot;I_fail&amp;quot;       ,&amp;quot;green&amp;quot;,&#039;      &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(        &amp;quot;Error&amp;quot;        ,&amp;quot;red&amp;quot;,&amp;quot;error&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;ERR__protocol&amp;quot;,&amp;quot;red&amp;quot;   ,&#039;            &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot; ,&amp;quot;ERR_battery&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;W__protocol&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;            &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
                ,2 =&amp;gt;{#============Btn Type 2: Btn2 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myRT(&amp;quot;ca:&amp;quot;,&amp;quot;h.caro.Clima&amp;quot;,&#039;#  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myRT(&amp;quot;lg:&amp;quot;,&amp;quot;h.lnge.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myRT(&amp;quot;fh:&amp;quot;,&amp;quot;h.fsth.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myRT(&amp;quot;du:&amp;quot;,&amp;quot;h.dact.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myRT(&amp;quot;bs:&amp;quot;,&amp;quot;h.bad.Clima&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;   ,&amp;quot;&amp;quot;           ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,3 =&amp;gt;{#============Btn Type 3: Btn2 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myLi(&amp;quot;Fl:&amp;quot;,&amp;quot;LichtF&amp;quot;         ,&#039; &lt;br /&gt;
                           ,2=&amp;gt;&#039;{myLi(&amp;quot;Fh:&amp;quot;,&amp;quot;LichtFH&amp;quot;        ,&#039; &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myLi(&amp;quot;L1:&amp;quot;,&amp;quot;LichtL&amp;quot;         ,&#039; &lt;br /&gt;
                           ,4=&amp;gt;&#039;{myLi(&amp;quot;Sl:&amp;quot;,&amp;quot;sw_Sw&amp;quot;          ,&#039; &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myLi(&amp;quot;L2:&amp;quot;,&amp;quot;LichtL_Sw1_V_01&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myLi(&amp;quot;L3:&amp;quot;,&amp;quot;LichtL_Sw1_V_02&amp;quot;,&#039; &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;off&amp;quot;   ,&amp;quot;&amp;quot;,&amp;quot;off&amp;quot;   ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;on&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;on&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;open&amp;quot;  ,&amp;quot;&amp;quot;,&amp;quot;open&amp;quot;  ,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;closed&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;closed&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;error&amp;quot; ,&amp;quot;&amp;quot;,&amp;quot;error&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;ok&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;ok&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,2 =&amp;gt;{#-------itteration 2&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;info&amp;quot;      ,&amp;quot;white&amp;quot; ,&amp;quot;info&amp;quot;      ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;newMsg&amp;quot;    ,&amp;quot;red&amp;quot;   ,&amp;quot;newMsg&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;serviceMsg&amp;quot;,&amp;quot;orange&amp;quot;,&amp;quot;serviceMsg&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;sigGreen&amp;quot;  ,&amp;quot;yellow&amp;quot;,&amp;quot;sigGreen&amp;quot;  ,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;sigYellow&amp;quot; ,&amp;quot;green&amp;quot; ,&amp;quot;sigYellow&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;sigRed&amp;quot;    ,&amp;quot;blue&amp;quot;  ,&amp;quot;sigRed&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
     );&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  sub myUtils_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
  &lt;br /&gt;
  # Normal devices&lt;br /&gt;
    $hash-&amp;gt;{DefFn}   = &amp;quot;myUtil_Define&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn} = &amp;quot;myUtil_Undef&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{AttrList}= $readingFnAttributes;&lt;br /&gt;
    &lt;br /&gt;
    @cntMax = (scalar keys %{$lineArr{0}}&lt;br /&gt;
              ,scalar keys %{$lineArr{1}}&lt;br /&gt;
              ,scalar keys %{$lineArr{2}}&lt;br /&gt;
              ,scalar keys %{$lineArr{3}});&lt;br /&gt;
    push @cnt,&amp;quot;0&amp;quot; foreach (keys %lineArr);&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Define($$) {########################################################&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    return ;&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Undef($$) {#########################################################&lt;br /&gt;
    my ($hash, $arg) = @_;&lt;br /&gt;
    return undef;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  sub myLineA($$){# main entry - do not change!!!&lt;br /&gt;
    my ($line,$type) = @_;&lt;br /&gt;
    $cnt[$type] = ($cnt[$type] +1)%$cntMax[$type] if ($line == 1); # rotate counter per type&lt;br /&gt;
  &lt;br /&gt;
    return (eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;t&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;c&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;i&amp;quot;)}&#039;&lt;br /&gt;
           );&lt;br /&gt;
  }&lt;br /&gt;
  sub myRT($$$){ # function to return information of an RT. &lt;br /&gt;
    # line &#039;t&#039; calculates the text&lt;br /&gt;
    # line &#039;c&#039; calculates the color&lt;br /&gt;
    # line &#039;i&#039; calculates the icon&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;desired-temp&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,&amp;quot;no&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;ValvePosition&amp;quot;,0)    ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTh($$$){#temp sensor &lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;temperature&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;humidity&amp;quot;,&amp;quot;&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;temperature&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)    ? &amp;quot;ok&amp;quot;  : &amp;quot;no&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myPr($$$){#Sensor Pressure&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;pressure&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;luminosity&amp;quot;,&amp;quot;-&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;luminosity&amp;quot;,0)&amp;gt;1000 ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)         ? &amp;quot;ok&amp;quot;    : &amp;quot;error&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myLi($$$){#Light&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;state&amp;quot;,&amp;quot;xx&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;timedOn&amp;quot;,0) eq &amp;quot;off&amp;quot; ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;phyLevel&amp;quot;,ReadingsVal($e,&amp;quot;level&amp;quot;,&amp;quot;1&amp;quot;)) ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTx($$$$){#text only&lt;br /&gt;
    my ($p,$c,$icon,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p;  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return ($icon?$icon:&amp;quot;noIcon&amp;quot;);}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  sub myHm($$$$){#HMInfo readings&lt;br /&gt;
    my ($p,$e,$c,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.join(&amp;quot;,&amp;quot;, grep !/:0/&lt;br /&gt;
                                    , map{s/^(.).*?:/$1:/;;$_;;} &lt;br /&gt;
                                      split &amp;quot;,&amp;quot;&lt;br /&gt;
                                    , ReadingsVal(&amp;quot;hm&amp;quot;,$e,&amp;quot;-&amp;quot;))&lt;br /&gt;
                 }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return &amp;quot;noIcon&amp;quot;;}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  1;&lt;br /&gt;
&lt;br /&gt;
Die Definition, was angezeigt werden soll wird nun in der Struktur %lineArr festgelegt. &lt;br /&gt;
Die Typen der Ausgaben - z.B. Darstellung eines Werts eines RT - wird in der jeweiligen Funktion &amp;quot;myTh&amp;quot; festgelegt. Hier kann man so viele - nach den gleichen Regeln wie die Erste - definieren und in der Struktur nutzen. &lt;br /&gt;
In der Struktur werden die Namen der auszuwertenden Entities eingetragen. &lt;br /&gt;
Mit den Einträgen zur Itteration kann man erreichen dass beim Tastendruck der Text alterniert. Beim ersten Druck eine Seite, beim 2. eine weitere, nach der Letzten wieder die Erste.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29128}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schalter (Sender)]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14860</id>
		<title>HM-Dis-WM55 Funk Statusanzeige</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14860"/>
		<updated>2016-03-27T20:42:46Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Betrieb mit FHEM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;HM-Dis-WM55&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HomeMatic Funk-Statusanzeige WM55&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
* Farbiges OLED-Display mit 128 x 128 RGB-Bildpunkten&lt;br /&gt;
* Frei programmierbar über HomeMatic-WebUI&lt;br /&gt;
* Dynamische Zuweisung von Anzeigeplätzen, Texten, Zustand von Systemvariablen, Symbolen&lt;br /&gt;
* In den Anzeigerahmen integrierte Taster für Anmeldung, Seitenfortschaltung und Auslösen von Zentralenprogrammen, z. B. Abfrage von Fensterzuständen bei Verlassen des Hauses&lt;br /&gt;
* Nur 19 mm flach, Schraub- oder Klebmontage, ortsunabhängiger Batteriebetrieb&lt;br /&gt;
* Lieferung mit weißem Rahmen, alternativ integrierbar in 55-mm-Installationsrahmen zahlreicher Installationsserien (Berker, ELSO, GIRA, merten, JUNG)&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die Funk-Statusanzeige hat 10 Kanäle (HM-Dis-WM55_Dis_01 bis HM-Dis-WM55_Dis_10). Jedem der Kanäle können 2 Texte zugewiesen werden. Kanal 1 und 2 kommt eine Doppelrolle zu. Sie enthalten sowohl Texte, sind aber auch die beiden Tasten. Und so wird auch die Ausgabe der Displayanzeige auf diese beiden Kanäle gegeben.&lt;br /&gt;
&lt;br /&gt;
Das Display hat 6 Zeilen zur Darstellung.&lt;br /&gt;
&lt;br /&gt;
Die Zeilen können einzeln befüllt und getauscht werden, dies muss nicht in einem Rutsch passieren.&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
Es gibt hin und wieder Probleme die Register auszulesen. Abhilfe ist msgrepeat auf 3 zu setzten und hartnäckig bleiben.&lt;br /&gt;
&lt;br /&gt;
= Betrieb mit FHEM =&lt;br /&gt;
Das Gerät wird zur Zeit experimentell unterstützt.&lt;br /&gt;
msgrepeat sollte auf 3 gestellt werden, sonst gibt es öfters Timeouts:&lt;br /&gt;
 attr HM-Dis-WM55 msgRepeat 3&lt;br /&gt;
&lt;br /&gt;
Die Kanäle 1 und 2 sollten mit FHEM gepeered (zusätzlich zum pairing) werden&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 peerBulk &amp;lt;hmID&amp;gt;01&lt;br /&gt;
 set HM-Dis-WM55_Dis_02 peerBulk &amp;lt;hmID&amp;gt;01 &lt;br /&gt;
&lt;br /&gt;
Um einen Kanal mit Text zu befüllen dient der text Befehl auf einen Kanal. Es werden beide Texte in einen Kanal gleichzeitig geschrieben. Will ich einen Text tauschen muss ich den anderen mit neu setzten. Für ein Leerzeichen \_ einsetzten&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 text Fenster\_auf Fenster\_zu&lt;br /&gt;
&lt;br /&gt;
zum Übernehmen der Konfiguration den Config Taster auf der Rückseite nehmen und über das Menü übernehmen&lt;br /&gt;
&lt;br /&gt;
Nun kann man z.B. mit einem notify die Information an den Schalter senden, wenn ein Fenster offen und oder zu ist:&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 txt01_1 red error&lt;br /&gt;
&lt;br /&gt;
short bedeutet bei einem kurzen Tastendruck (es geht auch long). line bezieht sich auf die Zeile in die es geschrieben wird. Anschließend folgt der Text, die Farbe in der der Text angezeigt werden soll, sowie das Icon.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM help&lt;br /&gt;
kann eine Übersicht der gesetzten Texte angezeigt werden. Sowie der möglichen Farben und Icons.&lt;br /&gt;
&lt;br /&gt;
Folgende Farben gibt es:&lt;br /&gt;
 color is one white, red, orange, yellow, green, blue&lt;br /&gt;
&lt;br /&gt;
Folgende Icons gibt es:&lt;br /&gt;
;closed&lt;br /&gt;
: Schloss geschlossen&lt;br /&gt;
;error&lt;br /&gt;
: Kreuz rot&lt;br /&gt;
;ic12&lt;br /&gt;
: Leersymbol&lt;br /&gt;
;ic13&lt;br /&gt;
: Leersymbol&lt;br /&gt;
;info&lt;br /&gt;
: &amp;quot;i&amp;quot; in blauem Kreis&lt;br /&gt;
;newMsg&lt;br /&gt;
: Briefkasten mit Flag&lt;br /&gt;
;noIcon&lt;br /&gt;
: nichts&lt;br /&gt;
;off&lt;br /&gt;
: Glühbirne aus&lt;br /&gt;
;ok&lt;br /&gt;
: Haken grün&lt;br /&gt;
;on&lt;br /&gt;
: Glühbirne an&lt;br /&gt;
;open&lt;br /&gt;
: Schloss geöffnet&lt;br /&gt;
;serviceMsg&lt;br /&gt;
: Mann mit Schraubenschlüssel&lt;br /&gt;
;sigGreen&lt;br /&gt;
: Leuchte grün&lt;br /&gt;
;sigRed&lt;br /&gt;
: Leuchte rot&lt;br /&gt;
;sigYellow&lt;br /&gt;
: Leuchte gelb&lt;br /&gt;
&lt;br /&gt;
Soll kein Text eingeblendet werden oder dieser nicht geändert werden kann man einfach nc schreiben Beispiel&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 nc nc error&lt;br /&gt;
Dann wird nur das Icon getauscht oder eben nur jenes angezeigt.&lt;br /&gt;
&lt;br /&gt;
== dynamische Ausgaben ==&lt;br /&gt;
Um das Display wirkungsvoll einzusetzen ist es angebracht Texte dynamisch - abhängig von irgendwelchen Readings und Auswertungen zu erzeugen. Dies ist möglich, bedarf bei strukturierten Einbau einiges an Installation - ist aber am Ende einfacher als es anfänglich scheint. Möglichkeiten, es zu realisieren gibt es einige - hier ein Beispiel über myUtils. &lt;br /&gt;
=== fhemUser.cfg ===&lt;br /&gt;
Da im fhem.cfg kein set kommando vorkommen soll/kann sollte man ein separates File einbinden welches definiert nach Systeminitialisierung ausgeführt wird. Hierzu erzeugt man ein File fhem_user.cfg. Im normalen fhem.cfg baut man eine Zeile ein um es auszuführen:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im fhem_user.cfg stellt man nun für die beiden Buttons des display folgende Zeilen ein&lt;br /&gt;
 set dis_01 displayWM short  line1 e:{myLineA(1,0)}&lt;br /&gt;
 set dis_01 displayWM short  line2 e:{myLineA(2,0)}&lt;br /&gt;
 set dis_01 displayWM short  line3 e:{myLineA(3,0)}&lt;br /&gt;
 set dis_01 displayWM short  line4 e:{myLineA(4,0)}&lt;br /&gt;
 set dis_01 displayWM short  line5 e:{myLineA(5,0)}&lt;br /&gt;
 set dis_01 displayWM short  line6 e:{myLineA(6,0)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_01 displayWM long   line1 e:{myLineA(1,1)}&lt;br /&gt;
 set dis_01 displayWM long   line2 e:{myLineA(2,1)}&lt;br /&gt;
 set dis_01 displayWM long   line3 e:{myLineA(3,1)}&lt;br /&gt;
 set dis_01 displayWM long   line4 e:{myLineA(4,1)}&lt;br /&gt;
 set dis_01 displayWM long   line5 e:{myLineA(5,1)}&lt;br /&gt;
 set dis_01 displayWM long   line6 e:{myLineA(6,1)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM short  line1 e:{myLineA(1,2)}&lt;br /&gt;
 set dis_02 displayWM short  line2 e:{myLineA(2,2)}&lt;br /&gt;
 set dis_02 displayWM short  line3 e:{myLineA(3,2)}&lt;br /&gt;
 set dis_02 displayWM short  line4 e:{myLineA(4,2)}&lt;br /&gt;
 set dis_02 displayWM short  line5 e:{myLineA(5,2)}&lt;br /&gt;
 set dis_02 displayWM short  line6 e:{myLineA(6,2)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM long   line1 e:{myLineA(1,3)}&lt;br /&gt;
 set dis_02 displayWM long   line2 e:{myLineA(2,3)}&lt;br /&gt;
 set dis_02 displayWM long   line3 e:{myLineA(3,3)}&lt;br /&gt;
 set dis_02 displayWM long   line4 e:{myLineA(4,3)}&lt;br /&gt;
 set dis_02 displayWM long   line5 e:{myLineA(5,3)}&lt;br /&gt;
 set dis_02 displayWM long   line6 e:{myLineA(6,3)}&lt;br /&gt;
&lt;br /&gt;
Nun wird beim Tastendruck die Funktion myLineA gesucht - diese werden wir in 99_myUtils definieren.&lt;br /&gt;
&lt;br /&gt;
=== 99_myUtils ===&lt;br /&gt;
Hat man evtl. schon - dann kann man es erweitern. Um es auszuführen muss es aufgerufen werden. Daher wird eine Entity in fhem.cfg definiert&lt;br /&gt;
 define mu myUtils&lt;br /&gt;
&lt;br /&gt;
nun das File 99_myUtils.pm. Die instruktionen sind in den Kommentaren. Da es flexibel ist ist es auch keine strikte Anleitung. &lt;br /&gt;
&lt;br /&gt;
  ##############################################&lt;br /&gt;
  #&lt;br /&gt;
  package main;&lt;br /&gt;
  &lt;br /&gt;
  use strict;&lt;br /&gt;
  use warnings;&lt;br /&gt;
  use POSIX;&lt;br /&gt;
  sub myLineA ($$);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # define counter and counterlimit per press-type&lt;br /&gt;
  # presstype are 0: btn1 short&lt;br /&gt;
  # presstype are 1: btn1 long&lt;br /&gt;
  # presstype are 2: btn2 short&lt;br /&gt;
  # presstype are 3: btn2 long&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  my @cnt   ; #init one counter per press&lt;br /&gt;
  my @cntMax; #number of entries per press&lt;br /&gt;
  # structure per button/itteration/press&lt;br /&gt;
  # insert the function to be executes to fill the line with test, color and icon&lt;br /&gt;
  # Number of itterations can be extended as desired. At least one should be present.&lt;br /&gt;
  # obey the end of the line (is open) and the number of parameters you send to the funktion&lt;br /&gt;
  my %lineArr = (0 =&amp;gt;{#============Btn Type 0: Btn1 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,1 =&amp;gt;{#============Btn Type 0: Btn1 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;Info&amp;quot;,&amp;quot;green&amp;quot;        ,&amp;quot;info&amp;quot; ,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;act:&amp;quot;,&amp;quot;I_actTotal&amp;quot;   ,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot;,&amp;quot;I_sum_battery&amp;quot;,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;fl:&amp;quot; ,&amp;quot;I_fail&amp;quot;       ,&amp;quot;green&amp;quot;,&#039;      &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(        &amp;quot;Error&amp;quot;        ,&amp;quot;red&amp;quot;,&amp;quot;error&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;ERR__protocol&amp;quot;,&amp;quot;red&amp;quot;   ,&#039;            &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot; ,&amp;quot;ERR_battery&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;W__protocol&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;            &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
                ,2 =&amp;gt;{#============Btn Type 2: Btn2 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myRT(&amp;quot;ca:&amp;quot;,&amp;quot;h.caro.Clima&amp;quot;,&#039;#  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myRT(&amp;quot;lg:&amp;quot;,&amp;quot;h.lnge.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myRT(&amp;quot;fh:&amp;quot;,&amp;quot;h.fsth.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myRT(&amp;quot;du:&amp;quot;,&amp;quot;h.dact.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myRT(&amp;quot;bs:&amp;quot;,&amp;quot;h.bad.Clima&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;   ,&amp;quot;&amp;quot;           ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,3 =&amp;gt;{#============Btn Type 3: Btn2 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myLi(&amp;quot;Fl:&amp;quot;,&amp;quot;LichtF&amp;quot;         ,&#039; &lt;br /&gt;
                           ,2=&amp;gt;&#039;{myLi(&amp;quot;Fh:&amp;quot;,&amp;quot;LichtFH&amp;quot;        ,&#039; &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myLi(&amp;quot;L1:&amp;quot;,&amp;quot;LichtL&amp;quot;         ,&#039; &lt;br /&gt;
                           ,4=&amp;gt;&#039;{myLi(&amp;quot;Sl:&amp;quot;,&amp;quot;sw_Sw&amp;quot;          ,&#039; &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myLi(&amp;quot;L2:&amp;quot;,&amp;quot;LichtL_Sw1_V_01&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myLi(&amp;quot;L3:&amp;quot;,&amp;quot;LichtL_Sw1_V_02&amp;quot;,&#039; &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;off&amp;quot;   ,&amp;quot;&amp;quot;,&amp;quot;off&amp;quot;   ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;on&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;on&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;open&amp;quot;  ,&amp;quot;&amp;quot;,&amp;quot;open&amp;quot;  ,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;closed&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;closed&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;error&amp;quot; ,&amp;quot;&amp;quot;,&amp;quot;error&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;ok&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;ok&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,2 =&amp;gt;{#-------itteration 2&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;info&amp;quot;      ,&amp;quot;white&amp;quot; ,&amp;quot;info&amp;quot;      ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;newMsg&amp;quot;    ,&amp;quot;red&amp;quot;   ,&amp;quot;newMsg&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;serviceMsg&amp;quot;,&amp;quot;orange&amp;quot;,&amp;quot;serviceMsg&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;sigGreen&amp;quot;  ,&amp;quot;yellow&amp;quot;,&amp;quot;sigGreen&amp;quot;  ,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;sigYellow&amp;quot; ,&amp;quot;green&amp;quot; ,&amp;quot;sigYellow&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;sigRed&amp;quot;    ,&amp;quot;blue&amp;quot;  ,&amp;quot;sigRed&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
     );&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  sub myUtils_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
  &lt;br /&gt;
  # Normal devices&lt;br /&gt;
    $hash-&amp;gt;{DefFn}   = &amp;quot;myUtil_Define&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn} = &amp;quot;myUtil_Undef&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{AttrList}= $readingFnAttributes;&lt;br /&gt;
    &lt;br /&gt;
    @cntMax = (scalar keys %{$lineArr{0}}&lt;br /&gt;
              ,scalar keys %{$lineArr{1}}&lt;br /&gt;
              ,scalar keys %{$lineArr{2}}&lt;br /&gt;
              ,scalar keys %{$lineArr{3}});&lt;br /&gt;
    push @cnt,&amp;quot;0&amp;quot; foreach (keys %lineArr);&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Define($$) {########################################################&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    return ;&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Undef($$) {#########################################################&lt;br /&gt;
    my ($hash, $arg) = @_;&lt;br /&gt;
    return undef;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  sub myLineA($$){# main entry - do not change!!!&lt;br /&gt;
    my ($line,$type) = @_;&lt;br /&gt;
    $cnt[$type] = ($cnt[$type] +1)%$cntMax[$type] if ($line == 1); # rotate counter per type&lt;br /&gt;
  &lt;br /&gt;
    return (eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;t&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;c&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;i&amp;quot;)}&#039;&lt;br /&gt;
           );&lt;br /&gt;
  }&lt;br /&gt;
  sub myRT($$$){ # function to return information of an RT. &lt;br /&gt;
    # line &#039;t&#039; calculates the text&lt;br /&gt;
    # line &#039;c&#039; calculates the color&lt;br /&gt;
    # line &#039;i&#039; calculates the icon&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;desired-temp&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,&amp;quot;no&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;ValvePosition&amp;quot;,0)    ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTh($$$){#temp sensor &lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;temperature&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;humidity&amp;quot;,&amp;quot;&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;temperature&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)    ? &amp;quot;ok&amp;quot;  : &amp;quot;no&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myPr($$$){#Sensor Pressure&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;pressure&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;luminosity&amp;quot;,&amp;quot;-&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;luminosity&amp;quot;,0)&amp;gt;1000 ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)         ? &amp;quot;ok&amp;quot;    : &amp;quot;error&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myLi($$$){#Light&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;state&amp;quot;,&amp;quot;xx&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;timedOn&amp;quot;,0) eq &amp;quot;off&amp;quot; ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;phyLevel&amp;quot;,ReadingsVal($e,&amp;quot;level&amp;quot;,&amp;quot;1&amp;quot;)) ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTx($$$$){#text only&lt;br /&gt;
    my ($p,$c,$icon,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p;  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return ($icon?$icon:&amp;quot;noIcon&amp;quot;);}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  sub myHm($$$$){#HMInfo readings&lt;br /&gt;
    my ($p,$e,$c,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.join(&amp;quot;,&amp;quot;, grep !/:0/&lt;br /&gt;
                                    , map{s/^(.).*?:/$1:/;;$_;;} &lt;br /&gt;
                                      split &amp;quot;,&amp;quot;&lt;br /&gt;
                                    , ReadingsVal(&amp;quot;hm&amp;quot;,$e,&amp;quot;-&amp;quot;))&lt;br /&gt;
                 }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return &amp;quot;noIcon&amp;quot;;}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  1;&lt;br /&gt;
&lt;br /&gt;
Die Definition, was angezeigt werden soll wird nun in der Struktur %lineArr festgelegt. &lt;br /&gt;
Die Typen der Ausgaben - z.B. Darstellung eines Werts eines RT - wird in der jeweiligen Funktion &amp;quot;myTh&amp;quot; festgelegt. Hier kann man so viele - nach den gleichen Regeln wie die Erste - definieren und in der Struktur nutzen. &lt;br /&gt;
In der Struktur werden die Namen der auszuwertenden Entities eingetragen. &lt;br /&gt;
Mit den Einträgen zur Itteration kann man erreichen dass beim Tastendruck der Text alterniert. Beim ersten Druck eine Seite, beim 2. eine weitere, nach der Letzten wieder die Erste.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29128}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schalter (Sender)]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14856</id>
		<title>HM-Dis-WM55 Funk Statusanzeige</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14856"/>
		<updated>2016-03-27T07:33:36Z</updated>

		<summary type="html">&lt;p&gt;LWith: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;HM-Dis-WM55&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HomeMatic Funk-Statusanzeige WM55&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
* Farbiges OLED-Display mit 128 x 128 RGB-Bildpunkten&lt;br /&gt;
* Frei programmierbar über HomeMatic-WebUI&lt;br /&gt;
* Dynamische Zuweisung von Anzeigeplätzen, Texten, Zustand von Systemvariablen, Symbolen&lt;br /&gt;
* In den Anzeigerahmen integrierte Taster für Anmeldung, Seitenfortschaltung und Auslösen von Zentralenprogrammen, z. B. Abfrage von Fensterzuständen bei Verlassen des Hauses&lt;br /&gt;
* Nur 19 mm flach, Schraub- oder Klebmontage, ortsunabhängiger Batteriebetrieb&lt;br /&gt;
* Lieferung mit weißem Rahmen, alternativ integrierbar in 55-mm-Installationsrahmen zahlreicher Installationsserien (Berker, ELSO, GIRA, merten, JUNG)&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die Funk-Statusanzeige hat 10 Kanäle (HM-Dis-WM55_Dis_01 bis HM-Dis-WM55_Dis_10). Jedem der Kanäle können 2 Texte zugewiesen werden. Kanal 1 und 2 kommt eine Doppelrolle zu. Sie enthalten sowohl Texte, sind aber auch die beiden Tasten. Und so wird auch die Ausgabe der Displayanzeige auf diese beiden Kanäle gegeben.&lt;br /&gt;
&lt;br /&gt;
Das Display hat 6 Zeilen zur Darstellung.&lt;br /&gt;
&lt;br /&gt;
Die Zeilen können einzeln befüllt und getauscht werden, dies muss nicht in einem Rutsch passieren.&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
Es gibt hin und wieder Probleme die Register auszulesen. Abhilfe ist msgrepeat auf 3 zu setzten und hartnäckig bleiben.&lt;br /&gt;
&lt;br /&gt;
= Betrieb mit FHEM =&lt;br /&gt;
Das Gerät wird zur Zeit experimentell unterstützt.&lt;br /&gt;
msgrepeat sollte auf 3 gestellt werden, sonst gibt es öfters Timeouts:&lt;br /&gt;
 attr HM-Dis-WM55 msgRepeat 3&lt;br /&gt;
&lt;br /&gt;
Die Kanäle 1 und 2 sollten mit FHEM gepeered (zusätzlich zum pairing) werden&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 peerBulk &amp;lt;hmID&amp;gt;01&lt;br /&gt;
 set HM-Dis-WM55_Dis_02 peerBulk &amp;lt;hmID&amp;gt;01 &lt;br /&gt;
&lt;br /&gt;
Um einen Kanal mit Text zu befüllen dient der text Befehl auf einen Kanal. Es werden beide Texte in einen Kanal gleichzeitig geschrieben. Will ich einen Text tauschen muss ich den anderen mit neu setzten. Für ein Leerzeichen \_ einsetzten&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 text Fenster\_auf Fenster\_zu&lt;br /&gt;
&lt;br /&gt;
zum Übernehmen der Konfiguration den Config Taster auf der Rückseite nehmen und über das Menü übernehmen&lt;br /&gt;
&lt;br /&gt;
Nun kann man z.B. mit einem notify die Information an den Schalter senden, wenn ein Fenster offen und oder zu ist:&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 txt01_1 red error&lt;br /&gt;
&lt;br /&gt;
short bedeutet bei einem kurzen Tastendruck (es geht auch long). line bezieht sich auf die Zeile in die es geschrieben wird. Anschließend folgt der Text, die Farbe in der der Text angezeigt werden soll, sowie das Icon.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM help&lt;br /&gt;
kann eine Übersicht der gesetzten Texte angezeigt werden. Sowie der möglichen Farben und Icons.&lt;br /&gt;
&lt;br /&gt;
Folgende Farben und Icons gibt es:&lt;br /&gt;
 color is one white, red, orange, yellow, green, blue&lt;br /&gt;
 icon is one closed, error, ic12, ic13, info, newMsg, noIcon, off, ok, on, open, serviceMsg, sigGreen, sigYellow, sigRed&lt;br /&gt;
&lt;br /&gt;
Soll kein Text eingeblendet werden oder dieser nicht geändert werden kann man einfach nc schreiben Beispiel&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 nc nc error&lt;br /&gt;
Dann wird nur das Icon getauscht oder eben nur jenes angezeigt.&lt;br /&gt;
&lt;br /&gt;
== dynamische Ausgaben ==&lt;br /&gt;
Um das Display wirkungsvoll einzusetzen ist es angebracht Texte dynamisch - abhängig von irgendwelchen Readings und Auswertungen zu erzeugen. Dies ist möglich, bedarf bei strukturierten Einbau einiges an Installation - ist aber am Ende einfacher als es anfänglich scheint. Möglichkeiten, es zu realisieren gibt es einige - hier ein Beispiel über myUtils. &lt;br /&gt;
=== fhemUser.cfg ===&lt;br /&gt;
Da im fhem.cfg kein set kommando vorkommen soll/kann sollte man ein separates File einbinden welches definiert nach Systeminitialisierung ausgeführt wird. Hierzu erzeugt man ein File fhem_user.cfg. Im normalen fhem.cfg baut man eine Zeile ein um es auszuführen:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im fhem_user.cfg stellt man nun für die beiden Buttons des display folgende Zeilen ein&lt;br /&gt;
 set dis_01 displayWM short  line1 e:{myLineA(1,0)}&lt;br /&gt;
 set dis_01 displayWM short  line2 e:{myLineA(2,0)}&lt;br /&gt;
 set dis_01 displayWM short  line3 e:{myLineA(3,0)}&lt;br /&gt;
 set dis_01 displayWM short  line4 e:{myLineA(4,0)}&lt;br /&gt;
 set dis_01 displayWM short  line5 e:{myLineA(5,0)}&lt;br /&gt;
 set dis_01 displayWM short  line6 e:{myLineA(6,0)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_01 displayWM long   line1 e:{myLineA(1,1)}&lt;br /&gt;
 set dis_01 displayWM long   line2 e:{myLineA(2,1)}&lt;br /&gt;
 set dis_01 displayWM long   line3 e:{myLineA(3,1)}&lt;br /&gt;
 set dis_01 displayWM long   line4 e:{myLineA(4,1)}&lt;br /&gt;
 set dis_01 displayWM long   line5 e:{myLineA(5,1)}&lt;br /&gt;
 set dis_01 displayWM long   line6 e:{myLineA(6,1)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM short  line1 e:{myLineA(1,2)}&lt;br /&gt;
 set dis_02 displayWM short  line2 e:{myLineA(2,2)}&lt;br /&gt;
 set dis_02 displayWM short  line3 e:{myLineA(3,2)}&lt;br /&gt;
 set dis_02 displayWM short  line4 e:{myLineA(4,2)}&lt;br /&gt;
 set dis_02 displayWM short  line5 e:{myLineA(5,2)}&lt;br /&gt;
 set dis_02 displayWM short  line6 e:{myLineA(6,2)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM long   line1 e:{myLineA(1,3)}&lt;br /&gt;
 set dis_02 displayWM long   line2 e:{myLineA(2,3)}&lt;br /&gt;
 set dis_02 displayWM long   line3 e:{myLineA(3,3)}&lt;br /&gt;
 set dis_02 displayWM long   line4 e:{myLineA(4,3)}&lt;br /&gt;
 set dis_02 displayWM long   line5 e:{myLineA(5,3)}&lt;br /&gt;
 set dis_02 displayWM long   line6 e:{myLineA(6,3)}&lt;br /&gt;
&lt;br /&gt;
Nun wird beim Tastendruck die Funktion myLineA gesucht - diese werden wir in 99_myUtils definieren.&lt;br /&gt;
&lt;br /&gt;
=== 99_myUtils ===&lt;br /&gt;
Hat man evtl. schon - dann kann man es erweitern. Um es auszuführen muss es aufgerufen werden. Daher wird eine Entity in fhem.cfg definiert&lt;br /&gt;
 define mu myUtils&lt;br /&gt;
&lt;br /&gt;
nun das File 99_myUtils.pm. Die instruktionen sind in den Kommentaren. Da es flexibel ist ist es auch keine strikte Anleitung. &lt;br /&gt;
&lt;br /&gt;
  ##############################################&lt;br /&gt;
  #&lt;br /&gt;
  package main;&lt;br /&gt;
  &lt;br /&gt;
  use strict;&lt;br /&gt;
  use warnings;&lt;br /&gt;
  use POSIX;&lt;br /&gt;
  sub myLineA ($$);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # define counter and counterlimit per press-type&lt;br /&gt;
  # presstype are 0: btn1 short&lt;br /&gt;
  # presstype are 1: btn1 long&lt;br /&gt;
  # presstype are 2: btn2 short&lt;br /&gt;
  # presstype are 3: btn2 long&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  my @cnt   ; #init one counter per press&lt;br /&gt;
  my @cntMax; #number of entries per press&lt;br /&gt;
  # structure per button/itteration/press&lt;br /&gt;
  # insert the function to be executes to fill the line with test, color and icon&lt;br /&gt;
  # Number of itterations can be extended as desired. At least one should be present.&lt;br /&gt;
  # obey the end of the line (is open) and the number of parameters you send to the funktion&lt;br /&gt;
  my %lineArr = (0 =&amp;gt;{#============Btn Type 0: Btn1 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,1 =&amp;gt;{#============Btn Type 0: Btn1 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;Info&amp;quot;,&amp;quot;green&amp;quot;        ,&amp;quot;info&amp;quot; ,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;act:&amp;quot;,&amp;quot;I_actTotal&amp;quot;   ,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot;,&amp;quot;I_sum_battery&amp;quot;,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;fl:&amp;quot; ,&amp;quot;I_fail&amp;quot;       ,&amp;quot;green&amp;quot;,&#039;      &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(        &amp;quot;Error&amp;quot;        ,&amp;quot;red&amp;quot;,&amp;quot;error&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;ERR__protocol&amp;quot;,&amp;quot;red&amp;quot;   ,&#039;            &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot; ,&amp;quot;ERR_battery&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;W__protocol&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;            &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
                ,2 =&amp;gt;{#============Btn Type 2: Btn2 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myRT(&amp;quot;ca:&amp;quot;,&amp;quot;h.caro.Clima&amp;quot;,&#039;#  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myRT(&amp;quot;lg:&amp;quot;,&amp;quot;h.lnge.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myRT(&amp;quot;fh:&amp;quot;,&amp;quot;h.fsth.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myRT(&amp;quot;du:&amp;quot;,&amp;quot;h.dact.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myRT(&amp;quot;bs:&amp;quot;,&amp;quot;h.bad.Clima&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;   ,&amp;quot;&amp;quot;           ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,3 =&amp;gt;{#============Btn Type 3: Btn2 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myLi(&amp;quot;Fl:&amp;quot;,&amp;quot;LichtF&amp;quot;         ,&#039; &lt;br /&gt;
                           ,2=&amp;gt;&#039;{myLi(&amp;quot;Fh:&amp;quot;,&amp;quot;LichtFH&amp;quot;        ,&#039; &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myLi(&amp;quot;L1:&amp;quot;,&amp;quot;LichtL&amp;quot;         ,&#039; &lt;br /&gt;
                           ,4=&amp;gt;&#039;{myLi(&amp;quot;Sl:&amp;quot;,&amp;quot;sw_Sw&amp;quot;          ,&#039; &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myLi(&amp;quot;L2:&amp;quot;,&amp;quot;LichtL_Sw1_V_01&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myLi(&amp;quot;L3:&amp;quot;,&amp;quot;LichtL_Sw1_V_02&amp;quot;,&#039; &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;off&amp;quot;   ,&amp;quot;&amp;quot;,&amp;quot;off&amp;quot;   ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;on&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;on&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;open&amp;quot;  ,&amp;quot;&amp;quot;,&amp;quot;open&amp;quot;  ,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;closed&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;closed&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;error&amp;quot; ,&amp;quot;&amp;quot;,&amp;quot;error&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;ok&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;ok&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,2 =&amp;gt;{#-------itteration 2&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;info&amp;quot;      ,&amp;quot;white&amp;quot; ,&amp;quot;info&amp;quot;      ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;newMsg&amp;quot;    ,&amp;quot;red&amp;quot;   ,&amp;quot;newMsg&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;serviceMsg&amp;quot;,&amp;quot;orange&amp;quot;,&amp;quot;serviceMsg&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;sigGreen&amp;quot;  ,&amp;quot;yellow&amp;quot;,&amp;quot;sigGreen&amp;quot;  ,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;sigYellow&amp;quot; ,&amp;quot;green&amp;quot; ,&amp;quot;sigYellow&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;sigRed&amp;quot;    ,&amp;quot;blue&amp;quot;  ,&amp;quot;sigRed&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
     );&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  sub myUtils_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
  &lt;br /&gt;
  # Normal devices&lt;br /&gt;
    $hash-&amp;gt;{DefFn}   = &amp;quot;myUtil_Define&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn} = &amp;quot;myUtil_Undef&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{AttrList}= $readingFnAttributes;&lt;br /&gt;
    &lt;br /&gt;
    @cntMax = (scalar keys %{$lineArr{0}}&lt;br /&gt;
              ,scalar keys %{$lineArr{1}}&lt;br /&gt;
              ,scalar keys %{$lineArr{2}}&lt;br /&gt;
              ,scalar keys %{$lineArr{3}});&lt;br /&gt;
    push @cnt,&amp;quot;0&amp;quot; foreach (keys %lineArr);&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Define($$) {########################################################&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    return ;&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Undef($$) {#########################################################&lt;br /&gt;
    my ($hash, $arg) = @_;&lt;br /&gt;
    return undef;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  sub myLineA($$){# main entry - do not change!!!&lt;br /&gt;
    my ($line,$type) = @_;&lt;br /&gt;
    $cnt[$type] = ($cnt[$type] +1)%$cntMax[$type] if ($line == 1); # rotate counter per type&lt;br /&gt;
  &lt;br /&gt;
    return (eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;t&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;c&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;i&amp;quot;)}&#039;&lt;br /&gt;
           );&lt;br /&gt;
  }&lt;br /&gt;
  sub myRT($$$){ # function to return information of an RT. &lt;br /&gt;
    # line &#039;t&#039; calculates the text&lt;br /&gt;
    # line &#039;c&#039; calculates the color&lt;br /&gt;
    # line &#039;i&#039; calculates the icon&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;desired-temp&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,&amp;quot;no&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;ValvePosition&amp;quot;,0)    ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTh($$$){#temp sensor &lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;temperature&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;humidity&amp;quot;,&amp;quot;&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;temperature&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)    ? &amp;quot;ok&amp;quot;  : &amp;quot;no&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myPr($$$){#Sensor Pressure&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;pressure&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;luminosity&amp;quot;,&amp;quot;-&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;luminosity&amp;quot;,0)&amp;gt;1000 ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)         ? &amp;quot;ok&amp;quot;    : &amp;quot;error&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myLi($$$){#Light&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;state&amp;quot;,&amp;quot;xx&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;timedOn&amp;quot;,0) eq &amp;quot;off&amp;quot; ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;phyLevel&amp;quot;,ReadingsVal($e,&amp;quot;level&amp;quot;,&amp;quot;1&amp;quot;)) ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTx($$$$){#text only&lt;br /&gt;
    my ($p,$c,$icon,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p;  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return ($icon?$icon:&amp;quot;noIcon&amp;quot;);}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  sub myHm($$$$){#HMInfo readings&lt;br /&gt;
    my ($p,$e,$c,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.join(&amp;quot;,&amp;quot;, grep !/:0/&lt;br /&gt;
                                    , map{s/^(.).*?:/$1:/;;$_;;} &lt;br /&gt;
                                      split &amp;quot;,&amp;quot;&lt;br /&gt;
                                    , ReadingsVal(&amp;quot;hm&amp;quot;,$e,&amp;quot;-&amp;quot;))&lt;br /&gt;
                 }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return &amp;quot;noIcon&amp;quot;;}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  1;&lt;br /&gt;
&lt;br /&gt;
Die Definition, was angezeigt werden soll wird nun in der Struktur %lineArr festgelegt. &lt;br /&gt;
Die Typen der Ausgaben - z.B. Darstellung eines Werts eines RT - wird in der jeweiligen Funktion &amp;quot;myTh&amp;quot; festgelegt. Hier kann man so viele - nach den gleichen Regeln wie die Erste - definieren und in der Struktur nutzen. &lt;br /&gt;
In der Struktur werden die Namen der auszuwertenden Entities eingetragen. &lt;br /&gt;
Mit den Einträgen zur Itteration kann man erreichen dass beim Tastendruck der Text alterniert. Beim ersten Druck eine Seite, beim 2. eine weitere, nach der Letzten wieder die Erste.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29128}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schalter (Sender)]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14786</id>
		<title>HM-Dis-WM55 Funk Statusanzeige</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-Dis-WM55_Funk_Statusanzeige&amp;diff=14786"/>
		<updated>2016-03-23T17:23:11Z</updated>

		<summary type="html">&lt;p&gt;LWith: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;HM-Dis-WM55&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HomeMatic Funk-Statusanzeige WM55&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
* Farbiges OLED-Display mit 128 x 128 RGB-Bildpunkten&lt;br /&gt;
* Frei programmierbar über HomeMatic-WebUI&lt;br /&gt;
* Dynamische Zuweisung von Anzeigeplätzen, Texten, Zustand von Systemvariablen, Symbolen&lt;br /&gt;
* In den Anzeigerahmen integrierte Taster für Anmeldung, Seitenfortschaltung und Auslösen von Zentralenprogrammen, z. B. Abfrage von Fensterzuständen bei Verlassen des Hauses&lt;br /&gt;
* Nur 19 mm flach, Schraub- oder Klebmontage, ortsunabhängiger Batteriebetrieb&lt;br /&gt;
* Lieferung mit weißem Rahmen, alternativ integrierbar in 55-mm-Installationsrahmen zahlreicher Installationsserien (Berker, ELSO, GIRA, merten, JUNG)&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die Funk-Statusanzeige hat 10 Kanäle (HM-Dis-WM55_Dis_01 bis HM-Dis-WM55_Dis_10). Jedem der Kanäle können 2 Texte zugewiesen werden. Kanal 1 und 2 kommt eine Doppelrolle zu. Sie enthalten sowohl Texte, sind aber auch die beiden Tasten. Und so wird auch die Ausgabe der Displayanzeige auf diese beiden Kanäle gegeben.&lt;br /&gt;
&lt;br /&gt;
Das Display hat 6 Zeilen zur Darstellung.&lt;br /&gt;
&lt;br /&gt;
Die Zeilen können einzeln befüllt und getauscht werden, dies muss nicht in einem Rutsch passieren.&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
Es gibt hin und wieder Probleme die Register auszulesen. Abhilfe ist msgrepeat auf 3 zu setzten und hartnäckig bleiben.&lt;br /&gt;
&lt;br /&gt;
= Betrieb mit FHEM =&lt;br /&gt;
Das Gerät wird zur Zeit experimentell unterstützt.&lt;br /&gt;
msgrepeat sollte auf 3 gestellt werden, sonst gibt es öfters Timeouts:&lt;br /&gt;
 attr HM-Dis-WM55 msgRepeat 3&lt;br /&gt;
&lt;br /&gt;
Die Kanäle 1 und 2 sollten mit FHEM gepeered (zusätzlich zum pairing) werden&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 peerBulk &amp;lt;fhemID&amp;gt;01&lt;br /&gt;
 set HM-Dis-WM55_Dis_02 peerBulk &amp;lt;fhemID&amp;gt;01 &lt;br /&gt;
&lt;br /&gt;
Um einen Kanal mit Text zu befüllen dient der text Befehl auf einen Kanal. Es werden beide Texte in einen Kanal gleichzeitig geschrieben. Will ich einen Text tauschen muss ich den anderen mit neu setzten. Für ein Leerzeichen \_ einsetzten&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 text Fenster\_auf Fenster\_zu&lt;br /&gt;
&lt;br /&gt;
zum Übernehmen der Konfiguration den Config Taster auf der Rückseite nehmen und über das Menü übernehmen&lt;br /&gt;
&lt;br /&gt;
Nun kann man z.B. mit einem notify die Information an den Schalter senden, wenn ein Fenster offen und oder zu ist:&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 txt01_1 red error&lt;br /&gt;
&lt;br /&gt;
short bedeutet bei einem kurzen Tastendruck (es geht auch long). line bezieht sich auf die Zeile in die es geschrieben wird. Anschließend folgt der Text, die Farbe in der der Text angezeigt werden soll, sowie das Icon.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM help&lt;br /&gt;
kann eine Übersicht der gesetzten Texte angezeigt werden. Sowie der möglichen Farben und Icons.&lt;br /&gt;
&lt;br /&gt;
Folgende Farben und Icons gibt es:&lt;br /&gt;
 color is one white, red, orange, yellow, green, blue&lt;br /&gt;
 icon is one closed, error, ic12, ic13, info, newMsg, noIcon, off, ok, on, open, serviceMsg, sigGreen, sigYellow, sigRed&lt;br /&gt;
&lt;br /&gt;
Soll kein Text eingeblendet werden oder dieser nicht geändert werden kann man einfach nc schreiben Beispiel&lt;br /&gt;
 set HM-Dis-WM55_Dis_01 displayWM short line2 nc nc error&lt;br /&gt;
Dann wird nur das Icon getauscht oder eben nur jenes angezeigt.&lt;br /&gt;
&lt;br /&gt;
== dynamische Ausgaben ==&lt;br /&gt;
Um das Display wirkungsvoll einzusetzen ist es angebracht Texte dynamisch - abhängig von irgendwelchen Readings und Auswertungen zu erzeugen. Dies ist möglich, bedarf bei strukturierten Einbau einiges an Installation - ist aber am Ende einfacher als es anfänglich scheint. Möglichkeiten, es zu realisieren gibt es einige - hier ein Beispiel über myUtils. &lt;br /&gt;
=== fhemUser.cfg ===&lt;br /&gt;
Da im fhem.cfg kein set kommando vorkommen soll/kann sollte man ein separates File einbinden welches definiert nach Systeminitialisierung ausgeführt wird. Hierzu erzeugt man ein File fhem_user.cfg. Im normalen fhem.cfg baut man eine Zeile ein um es auszuführen:&lt;br /&gt;
&lt;br /&gt;
 define userCfg notify global:INITIALIZED include fhem_user.cfg&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im fhem_user.cfg stellt man nun für die beiden Buttons des display folgende Zeilen ein&lt;br /&gt;
 set dis_01 displayWM short  line1 e:{myLineA(1,0)}&lt;br /&gt;
 set dis_01 displayWM short  line2 e:{myLineA(2,0)}&lt;br /&gt;
 set dis_01 displayWM short  line3 e:{myLineA(3,0)}&lt;br /&gt;
 set dis_01 displayWM short  line4 e:{myLineA(4,0)}&lt;br /&gt;
 set dis_01 displayWM short  line5 e:{myLineA(5,0)}&lt;br /&gt;
 set dis_01 displayWM short  line6 e:{myLineA(6,0)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_01 displayWM long   line1 e:{myLineA(1,1)}&lt;br /&gt;
 set dis_01 displayWM long   line2 e:{myLineA(2,1)}&lt;br /&gt;
 set dis_01 displayWM long   line3 e:{myLineA(3,1)}&lt;br /&gt;
 set dis_01 displayWM long   line4 e:{myLineA(4,1)}&lt;br /&gt;
 set dis_01 displayWM long   line5 e:{myLineA(5,1)}&lt;br /&gt;
 set dis_01 displayWM long   line6 e:{myLineA(6,1)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM short  line1 e:{myLineA(1,2)}&lt;br /&gt;
 set dis_02 displayWM short  line2 e:{myLineA(2,2)}&lt;br /&gt;
 set dis_02 displayWM short  line3 e:{myLineA(3,2)}&lt;br /&gt;
 set dis_02 displayWM short  line4 e:{myLineA(4,2)}&lt;br /&gt;
 set dis_02 displayWM short  line5 e:{myLineA(5,2)}&lt;br /&gt;
 set dis_02 displayWM short  line6 e:{myLineA(6,2)}&lt;br /&gt;
                                                 &lt;br /&gt;
 set dis_02 displayWM long   line1 e:{myLineA(1,3)}&lt;br /&gt;
 set dis_02 displayWM long   line2 e:{myLineA(2,3)}&lt;br /&gt;
 set dis_02 displayWM long   line3 e:{myLineA(3,3)}&lt;br /&gt;
 set dis_02 displayWM long   line4 e:{myLineA(4,3)}&lt;br /&gt;
 set dis_02 displayWM long   line5 e:{myLineA(5,3)}&lt;br /&gt;
 set dis_02 displayWM long   line6 e:{myLineA(6,3)}&lt;br /&gt;
&lt;br /&gt;
Nun wird beim Tastendruck die Funktion myLineA gesucht - diese werden wir in 99_myUtils definieren.&lt;br /&gt;
&lt;br /&gt;
=== 99_myUtils ===&lt;br /&gt;
Hat man evtl. schon - dann kann man es erweitern. Um es auszuführen muss es aufgerufen werden. Daher wird eine Entity in fhem.cfg definiert&lt;br /&gt;
 define mu myUtils&lt;br /&gt;
&lt;br /&gt;
nun das File 99_myUtils.pm. Die instruktionen sind in den Kommentaren. Da es flexibel ist ist es auch keine strikte Anleitung. &lt;br /&gt;
&lt;br /&gt;
  ##############################################&lt;br /&gt;
  #&lt;br /&gt;
  package main;&lt;br /&gt;
  &lt;br /&gt;
  use strict;&lt;br /&gt;
  use warnings;&lt;br /&gt;
  use POSIX;&lt;br /&gt;
  sub myLineA ($$);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # define counter and counterlimit per press-type&lt;br /&gt;
  # presstype are 0: btn1 short&lt;br /&gt;
  # presstype are 1: btn1 long&lt;br /&gt;
  # presstype are 2: btn2 short&lt;br /&gt;
  # presstype are 3: btn2 long&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  my @cnt   ; #init one counter per press&lt;br /&gt;
  my @cntMax; #number of entries per press&lt;br /&gt;
  # structure per button/itteration/press&lt;br /&gt;
  # insert the function to be executes to fill the line with test, color and icon&lt;br /&gt;
  # Number of itterations can be extended as desired. At least one should be present.&lt;br /&gt;
  # obey the end of the line (is open) and the number of parameters you send to the funktion&lt;br /&gt;
  my %lineArr = (0 =&amp;gt;{#============Btn Type 0: Btn1 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTh(&amp;quot;wz:&amp;quot;,&amp;quot;h_s_s2&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTh(&amp;quot;os:&amp;quot;,&amp;quot;h_s_s1&amp;quot;,&#039;    &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTh(&amp;quot;op:&amp;quot;,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myPr(&amp;quot;p:&amp;quot; ,&amp;quot;h_s_aussen&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;             &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&#039;      &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,1 =&amp;gt;{#============Btn Type 0: Btn1 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;Info&amp;quot;,&amp;quot;green&amp;quot;        ,&amp;quot;info&amp;quot; ,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;act:&amp;quot;,&amp;quot;I_actTotal&amp;quot;   ,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot;,&amp;quot;I_sum_battery&amp;quot;,&amp;quot;green&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;fl:&amp;quot; ,&amp;quot;I_fail&amp;quot;       ,&amp;quot;green&amp;quot;,&#039;      &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;    ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;     ,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(        &amp;quot;Error&amp;quot;        ,&amp;quot;red&amp;quot;,&amp;quot;error&amp;quot;,&#039;    #  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;ERR__protocol&amp;quot;,&amp;quot;red&amp;quot;   ,&#039;            &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myHm(&amp;quot;bat:&amp;quot; ,&amp;quot;ERR_battery&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myHm(&amp;quot;prt:&amp;quot; ,&amp;quot;W__protocol&amp;quot;  ,&amp;quot;yellow&amp;quot;,&#039;            &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;     ,&amp;quot;&amp;quot;             ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
                ,2 =&amp;gt;{#============Btn Type 2: Btn2 short&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myRT(&amp;quot;ca:&amp;quot;,&amp;quot;h.caro.Clima&amp;quot;,&#039;#  line 1&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myRT(&amp;quot;lg:&amp;quot;,&amp;quot;h.lnge.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myRT(&amp;quot;fh:&amp;quot;,&amp;quot;h.fsth.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myRT(&amp;quot;du:&amp;quot;,&amp;quot;h.dact.Clima&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myRT(&amp;quot;bs:&amp;quot;,&amp;quot;h.bad.Clima&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;&amp;quot;   ,&amp;quot;&amp;quot;           ,&amp;quot;&amp;quot;,&#039;  &lt;br /&gt;
                          }&lt;br /&gt;
                     }&lt;br /&gt;
                ,3 =&amp;gt;{#============Btn Type 3: Btn2 Long&lt;br /&gt;
                      0 =&amp;gt;{#-------itteration 0&lt;br /&gt;
                            1=&amp;gt;&#039;{myLi(&amp;quot;Fl:&amp;quot;,&amp;quot;LichtF&amp;quot;         ,&#039; &lt;br /&gt;
                           ,2=&amp;gt;&#039;{myLi(&amp;quot;Fh:&amp;quot;,&amp;quot;LichtFH&amp;quot;        ,&#039; &lt;br /&gt;
                           ,3=&amp;gt;&#039;{myLi(&amp;quot;L1:&amp;quot;,&amp;quot;LichtL&amp;quot;         ,&#039; &lt;br /&gt;
                           ,4=&amp;gt;&#039;{myLi(&amp;quot;Sl:&amp;quot;,&amp;quot;sw_Sw&amp;quot;          ,&#039; &lt;br /&gt;
                           ,5=&amp;gt;&#039;{myLi(&amp;quot;L2:&amp;quot;,&amp;quot;LichtL_Sw1_V_01&amp;quot;,&#039; &lt;br /&gt;
                           ,6=&amp;gt;&#039;{myLi(&amp;quot;L3:&amp;quot;,&amp;quot;LichtL_Sw1_V_02&amp;quot;,&#039; &lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,1 =&amp;gt;{#-------itteration 1&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;off&amp;quot;   ,&amp;quot;&amp;quot;,&amp;quot;off&amp;quot;   ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;on&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;on&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;open&amp;quot;  ,&amp;quot;&amp;quot;,&amp;quot;open&amp;quot;  ,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;closed&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;closed&amp;quot;,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;error&amp;quot; ,&amp;quot;&amp;quot;,&amp;quot;error&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;ok&amp;quot;    ,&amp;quot;&amp;quot;,&amp;quot;ok&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     ,2 =&amp;gt;{#-------itteration 2&lt;br /&gt;
                            1=&amp;gt;&#039;{myTx(&amp;quot;info&amp;quot;      ,&amp;quot;white&amp;quot; ,&amp;quot;info&amp;quot;      ,&#039;&lt;br /&gt;
                           ,2=&amp;gt;&#039;{myTx(&amp;quot;newMsg&amp;quot;    ,&amp;quot;red&amp;quot;   ,&amp;quot;newMsg&amp;quot;    ,&#039;&lt;br /&gt;
                           ,3=&amp;gt;&#039;{myTx(&amp;quot;serviceMsg&amp;quot;,&amp;quot;orange&amp;quot;,&amp;quot;serviceMsg&amp;quot;,&#039;&lt;br /&gt;
                           ,4=&amp;gt;&#039;{myTx(&amp;quot;sigGreen&amp;quot;  ,&amp;quot;yellow&amp;quot;,&amp;quot;sigGreen&amp;quot;  ,&#039;&lt;br /&gt;
                           ,5=&amp;gt;&#039;{myTx(&amp;quot;sigYellow&amp;quot; ,&amp;quot;green&amp;quot; ,&amp;quot;sigYellow&amp;quot; ,&#039;&lt;br /&gt;
                           ,6=&amp;gt;&#039;{myTx(&amp;quot;sigRed&amp;quot;    ,&amp;quot;blue&amp;quot;  ,&amp;quot;sigRed&amp;quot;    ,&#039;&lt;br /&gt;
                          }                                                        &lt;br /&gt;
                     }&lt;br /&gt;
     );&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  sub myUtils_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
  &lt;br /&gt;
  # Normal devices&lt;br /&gt;
    $hash-&amp;gt;{DefFn}   = &amp;quot;myUtil_Define&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn} = &amp;quot;myUtil_Undef&amp;quot;;&lt;br /&gt;
    $hash-&amp;gt;{AttrList}= $readingFnAttributes;&lt;br /&gt;
    &lt;br /&gt;
    @cntMax = (scalar keys %{$lineArr{0}}&lt;br /&gt;
              ,scalar keys %{$lineArr{1}}&lt;br /&gt;
              ,scalar keys %{$lineArr{2}}&lt;br /&gt;
              ,scalar keys %{$lineArr{3}});&lt;br /&gt;
    push @cnt,&amp;quot;0&amp;quot; foreach (keys %lineArr);&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Define($$) {########################################################&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    return ;&lt;br /&gt;
  }&lt;br /&gt;
  sub myUtil_Undef($$) {#########################################################&lt;br /&gt;
    my ($hash, $arg) = @_;&lt;br /&gt;
    return undef;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  sub myLineA($$){# main entry - do not change!!!&lt;br /&gt;
    my ($line,$type) = @_;&lt;br /&gt;
    $cnt[$type] = ($cnt[$type] +1)%$cntMax[$type] if ($line == 1); # rotate counter per type&lt;br /&gt;
  &lt;br /&gt;
    return (eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;t&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;c&amp;quot;)}&#039;&lt;br /&gt;
           ,eval $lineArr{$type}{$cnt[$type]}{$line}.&#039;&amp;quot;i&amp;quot;)}&#039;&lt;br /&gt;
           );&lt;br /&gt;
  }&lt;br /&gt;
  sub myRT($$$){ # function to return information of an RT. &lt;br /&gt;
    # line &#039;t&#039; calculates the text&lt;br /&gt;
    # line &#039;c&#039; calculates the color&lt;br /&gt;
    # line &#039;i&#039; calculates the icon&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;desired-temp&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,&amp;quot;no&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;measured-temp&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;ValvePosition&amp;quot;,0)    ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTh($$$){#temp sensor &lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;temperature&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;humidity&amp;quot;,&amp;quot;&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;temperature&amp;quot;,0)&amp;gt;20 ? &amp;quot;red&amp;quot; : &amp;quot;blue&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)    ? &amp;quot;ok&amp;quot;  : &amp;quot;no&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myPr($$$){#Sensor Pressure&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;pressure&amp;quot;,&amp;quot;no&amp;quot;).&amp;quot;-&amp;quot;.ReadingsVal($e,&amp;quot;luminosity&amp;quot;,&amp;quot;-&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;luminosity&amp;quot;,0)&amp;gt;1000 ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;battery&amp;quot;,0)         ? &amp;quot;ok&amp;quot;    : &amp;quot;error&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myLi($$$){#Light&lt;br /&gt;
    my ($p,$e,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.ReadingsVal($e,&amp;quot;state&amp;quot;,&amp;quot;xx&amp;quot;);  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return    ReadingsVal($e,&amp;quot;timedOn&amp;quot;,0) eq &amp;quot;off&amp;quot; ? &amp;quot;green&amp;quot; : &amp;quot;red&amp;quot; }&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return    ReadingsVal($e,&amp;quot;phyLevel&amp;quot;,ReadingsVal($e,&amp;quot;level&amp;quot;,&amp;quot;1&amp;quot;)) ? &amp;quot;on&amp;quot;  : &amp;quot;off&amp;quot;  }&lt;br /&gt;
    return &amp;quot;nix&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  sub myTx($$$$){#text only&lt;br /&gt;
    my ($p,$c,$icon,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p;  }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return ($icon?$icon:&amp;quot;noIcon&amp;quot;);}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  sub myHm($$$$){#HMInfo readings&lt;br /&gt;
    my ($p,$e,$c,$t) = @_;&lt;br /&gt;
    if($t eq &amp;quot;t&amp;quot;){return $p.join(&amp;quot;,&amp;quot;, grep !/:0/&lt;br /&gt;
                                    , map{s/^(.).*?:/$1:/;;$_;;} &lt;br /&gt;
                                      split &amp;quot;,&amp;quot;&lt;br /&gt;
                                    , ReadingsVal(&amp;quot;hm&amp;quot;,$e,&amp;quot;-&amp;quot;))&lt;br /&gt;
                 }&lt;br /&gt;
    if($t eq &amp;quot;c&amp;quot;){return ($c?$c:&amp;quot;white&amp;quot;);}&lt;br /&gt;
    if($t eq &amp;quot;i&amp;quot;){return &amp;quot;noIcon&amp;quot;;}&lt;br /&gt;
    return $p;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  1;&lt;br /&gt;
&lt;br /&gt;
Die Definition, was angezeigt werden soll wird nun in der Struktur %lineArr festgelegt. &lt;br /&gt;
Die Typen der Ausgaben - z.B. Darstellung eines Werts eines RT - wird in der jeweiligen Funktion &amp;quot;myTh&amp;quot; festgelegt. Hier kann man so viele - nach den gleichen Regeln wie die Erste - definieren und in der Struktur nutzen. &lt;br /&gt;
In der Struktur werden die Namen der auszuwertenden Entities eingetragen. &lt;br /&gt;
Mit den Einträgen zur Itteration kann man erreichen dass beim Tastendruck der Text alterniert. Beim ersten Druck eine Seite, beim 2. eine weitere, nach der Letzten wieder die Erste.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29128}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schalter (Sender)]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-OU-LED16_Funk-Statusanzeige_LED16&amp;diff=14545</id>
		<title>HM-OU-LED16 Funk-Statusanzeige LED16</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-OU-LED16_Funk-Statusanzeige_LED16&amp;diff=14545"/>
		<updated>2016-03-07T15:37:11Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=HM-OU-LED16.jpg&lt;br /&gt;
|Bildbeschreibung=HomeMatic Funk-Statusanzeige LED16&lt;br /&gt;
|HWProtocol=HomeMatic&lt;br /&gt;
|HWType=Empfänger, Aktor&lt;br /&gt;
|HWCategory=HomeMatic&lt;br /&gt;
|HWComm=868MHz&lt;br /&gt;
|HWChannels=16 (3 Tasten, Hoch, Runter und Enter)&lt;br /&gt;
|HWVoltage=7,5 V DC (über mitgeliefertes Steckernetzteil&lt;br /&gt;
|HWPowerConsumption=max. 250 mA&lt;br /&gt;
|HWPoweredBy=Netz&lt;br /&gt;
|HWSize=100x100x15mm&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#CUL_HM CUL_HM]&lt;br /&gt;
|HWManufacturer=ELV / eQ-3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
Anzeige von 16 Statuswerten über rot/grün/orange LED&lt;br /&gt;
&lt;br /&gt;
= Allgemeines =&lt;br /&gt;
Die Funk-Statusanzeige LED16 kann mit ihren 16 Kanälen und insgesamt 32 LED&#039;s (je 1xGrün und 1xRot -&amp;gt; Rot+Grün=Orange) diverse Status anzeigen.&lt;br /&gt;
Das Schriftfeld ist nicht beleuchtet und kann mit einer Word-Vorlage befüllt werden.&lt;br /&gt;
Außerdem kann man sie auch als 16-Kanal Funk-Fernbedienung verwenden. Hier ist die Auswahl des Kanals allerdings etwas umständlich. Mit Hilfe der Hoch- und Runtertaste auf der Rückseite kann man den Kanal, der durch ein blinken der jeweiligen LED&#039;s angezeigt wird, auswählen und seine Wahl mit der, ebenfalls auf der Rückseite liegenden Enter-Taste bestätigen.&lt;br /&gt;
&lt;br /&gt;
= Hinweise zur Inbetriebnahme und Installation =&lt;br /&gt;
&lt;br /&gt;
Die Funk-Statusanzeige kann nicht direkt gepeered werden sondern funktioniert nur mit einer Zentrale, wie z.B. FHEM.&lt;br /&gt;
&amp;lt;Bitte ergänzen&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM den HMLan oder HMUSB in den Anlernmodus mittels &lt;br /&gt;
set hmusb hmPairForSec 60 &lt;br /&gt;
setzen&lt;br /&gt;
&lt;br /&gt;
Die Statusanzeige ebenso in den Anlernmodus versetzen. Dazu die Tas learn auf der Rückseite der Anzeige für ca 5 sec &lt;br /&gt;
drücken, bis die LED links oben anfängt, langsam grün zu blinken. &lt;br /&gt;
Die Taste loslassen.&lt;br /&gt;
&lt;br /&gt;
Im Eventmontir das Ganze beobachten. Nach kurzer Zeit erscheint das neue Gerät.&lt;br /&gt;
&lt;br /&gt;
= Probleme =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ggfls. ergänzen&amp;gt;&lt;br /&gt;
= Betrieb mit FHEM =&lt;br /&gt;
&lt;br /&gt;
== event Monitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Bitte ergänzen&amp;gt;&lt;br /&gt;
== fhem.log Auszug ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2014.12.31 16:01:11 3: CUL_HM set OG_Statusdisplay_Led_01 led red&lt;br /&gt;
2014.12.31 16:02:37 3: CUL_HM set OG_Statusdisplay_Led_01 led off&lt;br /&gt;
2014.12.31 16:03:46 3: CUL_HM set OG_Statusdisplay_Led_01 led green&lt;br /&gt;
2014.12.31 16:06:39 3: CUL_HM set OG_Statusdisplay_Led_01 led off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der vorliegenden fhem.cfg ist das Statusdisplay bereits mittels &amp;quot;set HM_ABC123 deviceRename Statusdisplay&amp;quot; in &amp;quot;statusanzeige&amp;quot; umbenannt. &lt;br /&gt;
&#039;&#039;&#039;Im weiteren wird dieser Name beibehalten&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Achtung: &lt;br /&gt;
Mit rename wird nur das Gerät selbst umbenannt, die 16 Kanäle und die Logfile behalten weiter ihren HM_ABC123 Namen. &lt;br /&gt;
Mit deviceRename Statusdisplay&amp;quot; wird der Gerätename, der Name aller Kanäle, der Logfile etc. komplett in einem Schwung umbenannt.&lt;br /&gt;
&lt;br /&gt;
Direkt nach der automatischen  Definiton in FHEM sah das ungefähr so aus:&lt;br /&gt;
&lt;br /&gt;
define HM_20F85B CUL_HM 20F85B01&lt;br /&gt;
&lt;br /&gt;
== fhem.cfg ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define statusanzeige CUL_HM 1EAB54&lt;br /&gt;
attr statusanzeige IODev HMLAN1&lt;br /&gt;
attr statusanzeige autoReadReg 4_reqStatus&lt;br /&gt;
attr statusanzeige expert 2_full&lt;br /&gt;
attr statusanzeige firmware 1.1&lt;br /&gt;
attr statusanzeige model HM-OU-LED16&lt;br /&gt;
attr statusanzeige room Wohnzimmer&lt;br /&gt;
attr statusanzeige serialNr JEQxxxxxxx&lt;br /&gt;
attr statusanzeige subType outputUnit&lt;br /&gt;
attr statusanzeige webCmd getConfig:clear msgEvents&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_01 CUL_HM 1EAB5401&lt;br /&gt;
attr statusanzeige_Led_01 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_01 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_02 CUL_HM 1EAB5402&lt;br /&gt;
attr statusanzeige_Led_02 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_02 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_03 CUL_HM 1EAB5403&lt;br /&gt;
attr statusanzeige_Led_03 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_03 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_04 CUL_HM 1EAB5404&lt;br /&gt;
attr statusanzeige_Led_04 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_04 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_05 CUL_HM 1EAB5405&lt;br /&gt;
attr statusanzeige_Led_05 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_05 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_06 CUL_HM 1EAB5406&lt;br /&gt;
attr statusanzeige_Led_06 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_06 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_07 CUL_HM 1EAB5407&lt;br /&gt;
attr statusanzeige_Led_07 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_07 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_08 CUL_HM 1EAB5408&lt;br /&gt;
attr statusanzeige_Led_08 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_08 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_09 CUL_HM 1EAB5409&lt;br /&gt;
attr statusanzeige_Led_09 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_09 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_10 CUL_HM 1EAB540A&lt;br /&gt;
attr statusanzeige_Led_10 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_10 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_11 CUL_HM 1EAB540B&lt;br /&gt;
attr statusanzeige_Led_11 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_11 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_12 CUL_HM 1EAB540C&lt;br /&gt;
attr statusanzeige_Led_12 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_12 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_13 CUL_HM 1EAB540D&lt;br /&gt;
attr statusanzeige_Led_13 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_13 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_14 CUL_HM 1EAB540E&lt;br /&gt;
attr statusanzeige_Led_14 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_14 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_15 CUL_HM 1EAB540F&lt;br /&gt;
attr statusanzeige_Led_15 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_15 peerIDs 00000000,&lt;br /&gt;
&lt;br /&gt;
define statusanzeige_Led_16 CUL_HM 1EAB5410&lt;br /&gt;
attr statusanzeige_Led_16 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_16 peerIDs 00000000,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So wie aufgelistet erscheint die Stausanzeige nach dem Anlernvorgang in der fhem.cfg.&lt;br /&gt;
&lt;br /&gt;
Will man nun zB den Zustand eines Türkontakt anzeigen so ist die Definition eines notify erforderlich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define statusanzeige_Led_01 CUL_HM 20F85B01&lt;br /&gt;
attr statusanzeige_Led_01 alias 1 TK Essen&lt;br /&gt;
attr statusanzeige_Led_01 model HM-OU-LED16&lt;br /&gt;
attr statusanzeige_Led_01 peerIDs 00000000,&lt;br /&gt;
attr statusanzeige_Led_01 room Türkontakt&lt;br /&gt;
define statusanzeige_Led_01_open notify TK_Essen:open set statusanzeige_Led_01 led red&lt;br /&gt;
define statusanzeige_Led_01_closed notify TK_Essen:closed set statusanzeige_Led_01 led green&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel signalisiert statusanzeige_Led_01 die Led 1 der Statusanzeige.&lt;br /&gt;
TK_Essen ist der Türkontakt im Esszimmer&lt;br /&gt;
statusanzeige_Led_01_open ist der Zustand Tür offen&lt;br /&gt;
statusanzeige_Led_01_closed ist der Zustand Tür geschlossen&lt;br /&gt;
das notify reagiert auf die Zustände open and closed &lt;br /&gt;
und setz die Statusanzeige LED grün oder rot&lt;br /&gt;
&lt;br /&gt;
Hat man mehr als 2 oder 3 solcher Kontakte so ist es unübersichtlich und zu aufwendig für jeden Kontakt ein eigenes Notify zu schreiben.&lt;br /&gt;
Hat man bei der Namensgebung die Empfehlungen aus dem Einsteiger Pdf beherzigt und die Namen systematisch vergeben so kann man das deutlich eleganter definieren.&lt;br /&gt;
Wenn nun die Kontakte jeweils so aussehen FK_Wohnzimmer, FK_Esszimmer, TK_Wohnzimmer, TK_Esszimmer  ( FK = Fensterkontakt, TK = Türkontakt ) so sieht das eine notify so aus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#####################  notify über die Zustände der Türen und Fenster ----------&lt;br /&gt;
define statusanzeige_Led_update notify (T|F)K_.*:(open|closed) { Update_Fenster_LED(&amp;quot;$NAME&amp;quot;) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(T|F)K_.*   ist die kurze Schreibweise für die Kontakte&lt;br /&gt;
(open|closed)  ist der aktuelle Zustand der Kontakte&lt;br /&gt;
&lt;br /&gt;
==   99_myUtils.pm ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub&lt;br /&gt;
Disp_Update {&lt;br /&gt;
if (isday() ) {&lt;br /&gt;
     fhem (&amp;quot;set statusanzeige ilum 15 0&amp;quot;)&lt;br /&gt;
   } else {&lt;br /&gt;
     fhem (&amp;quot;set statusanzeige ilum 1 15&amp;quot;)&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die erste Zahl ist die Helligkeit (0 bis 15)&lt;br /&gt;
Die zweite Zahl ist die Leuchtdauer in Sekunden (wobei 0 = dauerhaft eingeschaltet)&lt;br /&gt;
OG_Statusdisplay  ist der Name des Status Displays der mit rename nach Belieben umbenannt werden kann&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Das Statusdisplay über z:B. einen Bewegungsmelder einschalten und den aktuellen Status der Geräte anzeigen.&lt;br /&gt;
Das Gerät übernimmt beim einschalten ( ein / ausschalten nicht vorgesehen) nicht die aktuellen Zustände. &lt;br /&gt;
Dies muss über weitere notifys realisiert werden.&lt;br /&gt;
&lt;br /&gt;
Es sind zwei Schritte in der fhem.cfg erforderlich. &lt;br /&gt;
1. Erweiterung der fhem.cfg um ein notify das auf &amp;quot;poweron&amp;quot; reagiert&lt;br /&gt;
2. Die Aktualisierung der aktuellen Zustände&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LED_Anzeige_powerOn notify statusanzeige:powerOn.* define UF_LED_Anzeige_powerOn at +00:00:10 {Update_Fenster_LED(&amp;quot;Alle&amp;quot;)}&lt;br /&gt;
attr LED_Anzeige_powerOn room Türkontakt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
und eine Erweiterung der 99_myUtils.pm die die aktuellen state Zustände abfragt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my @Fenster_name = (&amp;quot;FK_Bad_EG&amp;quot;, &amp;quot;FK_Buero&amp;quot;, &amp;quot;FK_Essen&amp;quot;, &amp;quot;FK_Garage&amp;quot;, &amp;quot;FK_Keller&amp;quot;, &amp;quot;FK_Kueche&amp;quot; , &amp;quot;TK_Essen&amp;quot;, &amp;quot;TK_wohnen&amp;quot;);&lt;br /&gt;
my @Led_name = (&amp;quot;statusanzeige_Led_01&amp;quot;, &amp;quot;statusanzeige_Led_02&amp;quot;, &amp;quot;statusanzeige_Led_03&amp;quot;, &amp;quot;statusanzeige_Led_04&amp;quot;, &amp;quot;statusanzeige_Led_05&amp;quot;, &amp;quot;statusanzeige_Led_06&amp;quot; , &amp;quot;statusanzeige_Led_07&amp;quot;, &amp;quot;statusanzeige_Led_08&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
sub Update_Fenster_LED($) {&lt;br /&gt;
  my ($fenster) = @_;&lt;br /&gt;
  my $i;&lt;br /&gt;
  my $zustand;&lt;br /&gt;
  my $led;&lt;br /&gt;
  my $farbe;&lt;br /&gt;
 &lt;br /&gt;
  # Reset&lt;br /&gt;
  if ($fenster eq &amp;quot;Alle&amp;quot;) {&lt;br /&gt;
    fhem(&amp;quot;set LED_Anzeige led off&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  # Loop über alle Fenster&lt;br /&gt;
  for ($i = 0; $i &amp;lt;= $#Fenster_name; $i++) {&lt;br /&gt;
     if ($fenster eq &amp;quot;Alle&amp;quot; || $fenster eq $Fenster_name[$i]) {&lt;br /&gt;
      # Aktuellen Zustand lesen&lt;br /&gt;
      $zustand = Value($Fenster_name[$i]);&lt;br /&gt;
      # LED ermitteln&lt;br /&gt;
      $led = $Led_name[$i];&lt;br /&gt;
      # Farbe setzen&lt;br /&gt;
      if ($zustand eq &amp;quot;closed&amp;quot;) {&lt;br /&gt;
        $farbe = &amp;quot;green&amp;quot;;&lt;br /&gt;
      } elsif ($zustand eq &amp;quot;gekippt&amp;quot;) {&lt;br /&gt;
        $farbe = &amp;quot;orange&amp;quot;;&lt;br /&gt;
      } elsif ($zustand eq &amp;quot;open&amp;quot;) {&lt;br /&gt;
        $farbe = &amp;quot;red&amp;quot;;&lt;br /&gt;
      } else {&lt;br /&gt;
        $farbe = &amp;quot;off&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
      # LED senden&lt;br /&gt;
      fhem(&amp;quot;set $led led $farbe&amp;quot;);&lt;br /&gt;
      # Abbruch, falls nicht für alle Fenster&lt;br /&gt;
      if ($fenster ne &amp;quot;Alle&amp;quot;) {&lt;br /&gt;
        last;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung gekippt muss noch durch den englishen Begriff ersetzt werden !&lt;br /&gt;
Wichtig vor allem die ersten beiden Zeilen&lt;br /&gt;
wobei der 1. Fenster_name mit dem 1. Led_name korrespondieren muss. Die weiteren natürlih auch entsprechend.&lt;br /&gt;
&lt;br /&gt;
Diskussion hier:&lt;br /&gt;
http://forum.fhem.de/index.php/topic,25539.msg387495.html#msg387495&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* Anleitung: [http://www.eq-3.de/Downloads/eq3/pdf_produkte/103206_HM-OU-LED16_UM_GE_V1.3_20120815.pdf PDF]&lt;br /&gt;
* Beispiele [http://www.fischer-net.de/hausautomation/fhem/56-fhem-status-mehrerer-geraete-aggregieren.html]&lt;br /&gt;
* Helligkeit / Dauer [http://forum.fhem.de/index.php/topic,10476.msg383362.html#msg383362]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schalter (Sender)]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-OU-CFM-Pl_MP3_Funk-Gong_mit_Signalleuchte&amp;diff=14460</id>
		<title>HM-OU-CFM-Pl MP3 Funk-Gong mit Signalleuchte</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-OU-CFM-Pl_MP3_Funk-Gong_mit_Signalleuchte&amp;diff=14460"/>
		<updated>2016-03-03T21:43:14Z</updated>

		<summary type="html">&lt;p&gt;LWith: /* Hinweise zum Betrieb mit Fhem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=HM-OU-CFM-Pl.jpg &amp;lt;!-- HM-OU-CFM-Pl.jpg --&amp;gt;&lt;br /&gt;
|Bildbeschreibung=HomeMatic MP3 Funk-Gong mit Signalleuchte&lt;br /&gt;
|HWProtocol=HomeMatic&lt;br /&gt;
|HWType=Aktor&lt;br /&gt;
|HWCategory=HomeMatic&lt;br /&gt;
|HWComm=868MHz&lt;br /&gt;
|HWChannels=2&lt;br /&gt;
|HWVoltage=230V&lt;br /&gt;
|HWPowerConsumption=0,5W im Standby&lt;br /&gt;
|HWPoweredBy=Netz&lt;br /&gt;
|HWSize=63x125x42mm&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#CUL_HM CUL_HM]&lt;br /&gt;
|HWManufacturer=ELV / eQ-3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[HomeMatic]] Funk-Gong mit Signal-LED (dreifarbig, rot, orange, grün) zur akustischen oder optischen Signalisierung. Zur Tonausgabe kann der Funk-Gong auf einer FAT32-formatierten micro-SDHC gespeicherte MP3s ausgeben.&lt;br /&gt;
&lt;br /&gt;
== Features / Funktionen ==&lt;br /&gt;
Der Gong verfügt über zwei Kanäle, einen für die MP3-Ausgabe und einen für die LED. Wird der Funkgong von Fhem per [[autocreate]] angelegt, bekommen die Kanäle die Bezeichnungen &#039;&#039;&amp;lt;generierterName&amp;gt;_&#039;&#039;&#039;LED&#039;&#039;&#039;&#039;&#039; und  &#039;&#039;&amp;lt;generierterName&amp;gt;_&#039;&#039;&#039;Mp3&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
Auch wenn der Gong u.a. die folgenden Befehle kennt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:800px;&amp;quot;&amp;gt;&lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; led [redL|greenL|orangeL|redS|greenS|orangeS|pause][,&amp;lt;color2&amp;gt;...] [&amp;lt;repeat&amp;gt;] &lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; playTone &amp;lt;MP3No&amp;gt;[,&amp;lt;MP3No&amp;gt;..] [&amp;lt;repeat&amp;gt;] [&amp;lt;volume&amp;gt;]&lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; off &lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; on &lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; on-for-timer &amp;lt;sec&amp;gt; &lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; on-till &amp;lt;time&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
funktionieren die allermeisten Einstellungen &#039;&#039;&#039;nicht&#039;&#039;&#039;, wenn nicht der jeweilige Channel vorher gepeered wurde. Auch die meisten Register sind nicht sichtbar, bevor der Channel nicht gepeered wurde. &lt;br /&gt;
&lt;br /&gt;
Zum Peeren bieten sich z.B. die virtuellen Buttons einer [[Virtueller Controller VCCU|VCCU]] an: &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;vccu_Btn1&amp;gt; peerChan 0 &amp;lt;HM-OU-CFM-Pl&amp;gt;_LED single&amp;lt;/code&amp;gt;&lt;br /&gt;
Aktionen können dann über einen langen oder kurzen Druck auf den oder die gepeerten virtuellen Buttons ausgelöst werden. &lt;br /&gt;
&lt;br /&gt;
Zum Beispiel: Einstellen, dass die LED rot (&amp;lt;code&amp;gt;RedL&amp;lt;/code&amp;gt;) leuchten soll, wenn der gepeerte virtuelle Button der vccu (vccu_Btn1) lang (&amp;lt;code&amp;gt;lg&amp;lt;/code&amp;gt;) gedrückt wird.&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;HM-OU-CFM-Pl&amp;gt;_LED regSet lgActTypeLed RedL vccu_Btn1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auslösen des roten Blinkens:&lt;br /&gt;
:&amp;lt;code&amp;gt;set vccu_Btn1 press long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel: Einstellen der Lautstärke bei langem (&amp;lt;code&amp;gt;lg&amp;lt;/code&amp;gt;) Druck auf den gepeerten virtuellen Taster vccu_Btn1:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;HM-OU-CFM-Pl&amp;gt;_Led regSet lgIntense vol_100 vccu_Btn1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel: MP3 mit der Nummer 002 soll bei langem (&amp;lt;code&amp;gt;lg&amp;lt;/code&amp;gt;) Druck auf den gepeerten virtuellen Taster vccu_Btn1 gespielt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;HM-OU-CFM-Pl&amp;gt;_Mp3 regSet lgActTypeMp3 002 vccu_Btn1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Das Register &amp;quot;lgActTypeMp3&amp;quot; ist auch nach Peeren des vccu_Btn1 nicht sichtbar, erst, nachdem man es erstmalig gesetzt hat. Das immer sichtbare Register &amp;quot;lgActType&amp;quot; gibt hingegen nur die Anzahl der Wiederholungen in der Aktion - für LED &#039;&#039;&#039;und&#039;&#039;&#039; MP3 gleich gültig! - an.)&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
* Beim Pairen gibt es manchmal Probleme. Wiederholtes Pairen und/oder wiederholtes &amp;lt;code&amp;gt;set &amp;lt;HM-OU-CFM-Pl&amp;gt; getConfig&amp;lt;/code&amp;gt; können helfen.&lt;br /&gt;
* Um alle Register sehen zu können, sollte &amp;lt;code&amp;gt;attr &amp;lt;HM-OU-CFM-Pl&amp;gt; expert 2_full&amp;lt;/code&amp;gt; eingestellt werden.&lt;br /&gt;
* Der Gong hat auch interne Taster (self1), die statt der virtuellen Taster der VCCU genutzt werden können. Diese internen Taster müssen jedoch erst mit den folgenden Anweisungen sichtbar gemacht werden:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:500px;&amp;quot;&amp;gt;&lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt;_LED regSet intKeyVisib visib&lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt;_Mp3 regSet intKeyVisib visib&lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; getConfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Der Gong kann MP3-Dateien nicht von allen Speicherkarten abspielen. Ist alles richtig konfiguriert und werden dennoch keine Sounddateien abgespielt kann ein anderes Fabrikat der Micro-SD helfen.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/pdf_produkte/99060_HM-OU-CFM_4spr_V1-0_A6_KV1_20120126_web.pdf Anleitung (PDF)]&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/pdf_produkte/MP3-Funk-Gong-mit-Signalleuchte_99060_Produktdatenblatt.pdf Datenblatt (PDF)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Signalgeräte]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-OU-CFM-Pl_MP3_Funk-Gong_mit_Signalleuchte&amp;diff=14459</id>
		<title>HM-OU-CFM-Pl MP3 Funk-Gong mit Signalleuchte</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-OU-CFM-Pl_MP3_Funk-Gong_mit_Signalleuchte&amp;diff=14459"/>
		<updated>2016-03-03T21:41:33Z</updated>

		<summary type="html">&lt;p&gt;LWith: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=HM-OU-CFM-Pl.jpg &amp;lt;!-- HM-OU-CFM-Pl.jpg --&amp;gt;&lt;br /&gt;
|Bildbeschreibung=HomeMatic MP3 Funk-Gong mit Signalleuchte&lt;br /&gt;
|HWProtocol=HomeMatic&lt;br /&gt;
|HWType=Aktor&lt;br /&gt;
|HWCategory=HomeMatic&lt;br /&gt;
|HWComm=868MHz&lt;br /&gt;
|HWChannels=2&lt;br /&gt;
|HWVoltage=230V&lt;br /&gt;
|HWPowerConsumption=0,5W im Standby&lt;br /&gt;
|HWPoweredBy=Netz&lt;br /&gt;
|HWSize=63x125x42mm&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#CUL_HM CUL_HM]&lt;br /&gt;
|HWManufacturer=ELV / eQ-3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[HomeMatic]] Funk-Gong mit Signal-LED (dreifarbig, rot, orange, grün) zur akustischen oder optischen Signalisierung. Zur Tonausgabe kann der Funk-Gong auf einer FAT32-formatierten micro-SDHC gespeicherte MP3s ausgeben.&lt;br /&gt;
&lt;br /&gt;
== Features / Funktionen ==&lt;br /&gt;
Der Gong verfügt über zwei Kanäle, einen für die MP3-Ausgabe und einen für die LED. Wird der Funkgong von Fhem per [[autocreate]] angelegt, bekommen die Kanäle die Bezeichnungen &#039;&#039;&amp;lt;generierterName&amp;gt;_&#039;&#039;&#039;LED&#039;&#039;&#039;&#039;&#039; und  &#039;&#039;&amp;lt;generierterName&amp;gt;_&#039;&#039;&#039;Mp3&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
Auch wenn der Gong u.a. die folgenden Befehle kennt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:500px;&amp;quot;&amp;gt;&lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; led [redL|greenL|orangeL|redS|greenS|orangeS|pause][,&amp;lt;color2&amp;gt;...] [&amp;lt;repeat&amp;gt;] &lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; playTone &amp;lt;MP3No&amp;gt;[,&amp;lt;MP3No&amp;gt;..] [&amp;lt;repeat&amp;gt;] [&amp;lt;volume&amp;gt;]&lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; off &lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; on &lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; on-for-timer &amp;lt;sec&amp;gt; &lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; on-till &amp;lt;time&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
funktionieren die allermeisten Einstellungen &#039;&#039;&#039;nicht&#039;&#039;&#039;, wenn nicht der jeweilige Channel vorher gepeered wurde. Auch die meisten Register sind nicht sichtbar, bevor der Channel nicht gepeered wurde. &lt;br /&gt;
&lt;br /&gt;
Zum Peeren bieten sich z.B. die virtuellen Buttons einer [[Virtueller Controller VCCU|VCCU]] an: &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;vccu_Btn1&amp;gt; peerChan 0 &amp;lt;HM-OU-CFM-Pl&amp;gt;_LED single&amp;lt;/code&amp;gt;&lt;br /&gt;
Aktionen können dann über einen langen oder kurzen Druck auf den oder die gepeerten virtuellen Buttons ausgelöst werden. &lt;br /&gt;
&lt;br /&gt;
Zum Beispiel: Einstellen, dass die LED rot (&amp;lt;code&amp;gt;RedL&amp;lt;/code&amp;gt;) leuchten soll, wenn der gepeerte virtuelle Button der vccu (vccu_Btn1) lang (&amp;lt;code&amp;gt;lg&amp;lt;/code&amp;gt;) gedrückt wird.&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;HM-OU-CFM-Pl&amp;gt;_LED regSet lgActTypeLed RedL vccu_Btn1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auslösen des roten Blinkens:&lt;br /&gt;
:&amp;lt;code&amp;gt;set vccu_Btn1 press long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel: Einstellen der Lautstärke bei langem (&amp;lt;code&amp;gt;lg&amp;lt;/code&amp;gt;) Druck auf den gepeerten virtuellen Taster vccu_Btn1:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;HM-OU-CFM-Pl&amp;gt;_Led regSet lgIntense vol_100 vccu_Btn1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel: MP3 mit der Nummer 002 soll bei langem (&amp;lt;code&amp;gt;lg&amp;lt;/code&amp;gt;) Druck auf den gepeerten virtuellen Taster vccu_Btn1 gespielt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;HM-OU-CFM-Pl&amp;gt;_Mp3 regSet lgActTypeMp3 002 vccu_Btn1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Das Register &amp;quot;lgActTypeMp3&amp;quot; ist auch nach Peeren des vccu_Btn1 nicht sichtbar, erst, nachdem man es erstmalig gesetzt hat. Das immer sichtbare Register &amp;quot;lgActType&amp;quot; gibt hingegen nur die Anzahl der Wiederholungen in der Aktion - für LED &#039;&#039;&#039;und&#039;&#039;&#039; MP3 gleich gültig! - an.)&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
* Beim Pairen gibt es manchmal Probleme. Wiederholtes Pairen und/oder wiederholtes &amp;lt;code&amp;gt;set &amp;lt;HM-OU-CFM-Pl&amp;gt; getConfig&amp;lt;/code&amp;gt; können helfen.&lt;br /&gt;
* Um alle Register sehen zu können, sollte &amp;lt;code&amp;gt;attr &amp;lt;HM-OU-CFM-Pl&amp;gt; expert 2_full&amp;lt;/code&amp;gt; eingestellt werden.&lt;br /&gt;
* Der Gong hat auch interne Taster (self1), die statt der virtuellen Taster der VCCU genutzt werden können. Diese internen Taster müssen jedoch erst mit den folgenden Anweisungen sichtbar gemacht werden:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:500px;&amp;quot;&amp;gt;&lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt;_LED regSet intKeyVisib visib&lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt;_Mp3 regSet intKeyVisib visib&lt;br /&gt;
set &amp;lt;HM-OU-CFM-Pl&amp;gt; getConfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Der Gong kann MP3-Dateien nicht von allen Speicherkarten abspielen. Ist alles richtig konfiguriert und werden dennoch keine Sounddateien abgespielt kann ein anderes Fabrikat der Micro-SD helfen.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/pdf_produkte/99060_HM-OU-CFM_4spr_V1-0_A6_KV1_20120126_web.pdf Anleitung (PDF)]&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/pdf_produkte/MP3-Funk-Gong-mit-Signalleuchte_99060_Produktdatenblatt.pdf Datenblatt (PDF)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Signalgeräte]]&lt;/div&gt;</summary>
		<author><name>LWith</name></author>
	</entry>
</feed>