<?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=Martinp876</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=Martinp876"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Martinp876"/>
	<updated>2026-04-06T12:31:13Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Apptime&amp;diff=35103</id>
		<title>Apptime</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Apptime&amp;diff=35103"/>
		<updated>2021-02-28T18:25:25Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: rechtschreibb korrektur&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:apptime}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Ausführungszeit von Applikationen (Modulen) protokollieren&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=apptime&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=98_apptime.pm&lt;br /&gt;
|ModOwner=Martin/martinp876 ({{Link2FU|251|Forum}}/[[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl [[apptime]] wird das Protokollieren von Ausführungszeiten von Modulen und Funktionen gestartet. apptime hilft herauszufinden, WER blockiert; [[perfmon]] ist der Indikator, DASS ETWAS blockiert (siehe diesen {{Link2Forum|Topic=39253|Message=314155}} im Forum).&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Keine.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Aktivieren ===&lt;br /&gt;
Die Überwachung der Ausführungszeiten wird mit dem Befehl &#039;&#039;apptime&#039;&#039; (einzugeben in das [[Konfiguration|Befehlseingabefeld]]) gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Beenden ===&lt;br /&gt;
Um &#039;&#039;apptime&#039;&#039; zu beenden, muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Die aufgelaufenen protokollierten Werte können mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;apptime clear&amp;lt;/code&amp;gt;&lt;br /&gt;
zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Auswertung ===&lt;br /&gt;
Die von &#039;&#039;apptime&#039;&#039; protokollierten Informationen können durch Eingabe des Befehls&lt;br /&gt;
:&amp;lt;code&amp;gt;apptime&amp;lt;/code&amp;gt;&lt;br /&gt;
abgerufen werden. Ein (Beispiel!) Auszug aus der resultierenden Tabelle:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 name             function     max  count    total  average      maxDly &lt;br /&gt;
 myJee            JeeLink_Read 139     20      298    14.90      0 HASH(myJee) &lt;br /&gt;
 myCUL            CUL_Read      76      6      233    38.83      0 HASH(myCUL) &lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Felder haben folgende Bedeutung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 name:           Entity, für die es ausgeführt wird&lt;br /&gt;
                 Wenn &#039;tmr-&#039; vor dem Namen steht ist es durch einen Timer (InternalTimer) aufgerufen worden. &lt;br /&gt;
 function:       Name der Funktion, die ausgeführt wird&lt;br /&gt;
 param max call: Input-Parameter an die Funktion beim längsten Aufruf&lt;br /&gt;
 max:            maximale Laufzeit in ms&lt;br /&gt;
 count:          Anzahl der Aufrufe&lt;br /&gt;
 total:          akkumulierte Laufzeit der Funktion in ms&lt;br /&gt;
 average:        durchschnittliche Laufzeit (total/count) in ms. &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Bitte beachten: der Parameter für die Sortierung nach Spalte &#039;&#039;function&#039;&#039; lautet &#039;&#039;fun&#039;&#039;&#039;k&#039;&#039;&#039;tion&#039;&#039;!}}&lt;br /&gt;
Durch Angabe eines Parameters &lt;br /&gt;
:&amp;lt;code&amp;gt;apptime [count|function|average|max|name|total]&amp;lt;/code&amp;gt;&lt;br /&gt;
wird die Tabelle nach den Werten der entsprechenden Spalte sortiert.&lt;br /&gt;
&lt;br /&gt;
Soll die komplette Tabelle ausgegeben werden, muss zusätzlich zum Spaltennamen noch der Parameter &#039;&#039;all&#039;&#039; angegeben werden (z.B.):&lt;br /&gt;
:&amp;lt;code&amp;gt;apptime count all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* ...&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=31776</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=31776"/>
		<updated>2019-12-01T13:22:00Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: /* Template aus Device */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Templates sind ein Weg, die Register der HM RF Devices zu setzen, zu kontrollieren und zu replizieren. &lt;br /&gt;
Warum braucht man nun Templates? Register lassen sich doch einfach ohne Templates setzen. Warum sich damit befassen?&lt;br /&gt;
Nun, die Gründe sind vielfältig - und eigentlich unabdingbar für alle, die ein geordnetes System verwalten wollen. &lt;br /&gt;
;Register ohne Template - Schwachstellen&lt;br /&gt;
:Register werden, wie bekannt, remanent in den HM-Devices gespeichert. FHEM hat eine Kopie dieser Daten welche über getConfig aufgefrischt werden können. Setzt man nun in einem Device ein Register ist dies erst einmal erledigt. Nun kann sich das Register verändern bzw muss überprüft werden, wenn &lt;br /&gt;
* das Device ausgetauscht wird&lt;br /&gt;
* das Device reseted wird - kommt auch einmal vor&lt;br /&gt;
* ein FW bug oder ein HW Defekt vorliegt&lt;br /&gt;
* das Schreiben der Registerwerte nicht erfolgreich war&lt;br /&gt;
:Weiter ist es praktisch die gewünschten Settings, also das eingestellte Verhalten &lt;br /&gt;
* zu verifizieren&lt;br /&gt;
* zu kopieren&lt;br /&gt;
:ohne sich einzelne Registerzu merken oder wieder herzuleiten. &lt;br /&gt;
&lt;br /&gt;
Anzumerken ist, dass die Nutzung von Templates das Bedienen der Register nicht abschaltet oder übersteuert sondern nur ergänzt. &lt;br /&gt;
&lt;br /&gt;
Templates heben das Bedienen der Register von der Assembler ebene auf eine Hochsprachen-Ebene. Nicht ohne Grund ist die erste Bedienung der Register in der eq3-CCU quasi per Template. Register werden nur im Expert mode sichtbar. &lt;br /&gt;
&lt;br /&gt;
= Was bieten Templates =&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register, welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der ist-Registerwerte verwaltet lebt man erst grundsätzlich in einer fragilen Welt. Eine Soll-Wert Verwaltung der Register bietet nur in Templates. &lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren. Der Anwender holt sich ein Template und kopiert es in sein System. Nun kann er&lt;br /&gt;
* die Funktion nutzen. Es muss die Register nicht verstehen&lt;br /&gt;
* Die Funktion nutzen, testen und die Register evaluieren und daran zu lernen&lt;br /&gt;
* Die Funktion erweitern, modifizieren und an seine Bedürfnisse anpassen&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man evtl. Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen, ... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt und repliziert.&lt;br /&gt;
;Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde.&lt;br /&gt;
;Globales Anpassen aller Devices&lt;br /&gt;
:Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Template ändern und diese Änderungen allen Devices zu Gute kommen lassen. Auf einmal.&lt;br /&gt;
;Funktionen parametrieren&lt;br /&gt;
:Der Anwender hat typisch den Wunsch, eine Funktion zu relaisieren, aber einen Parameter will er bei jeder Anwendung anpassen. So will ich typischerweise, dass nach einem ON-Trigger immer eine automatische Abschaltung eingestellt wird, was das Vergessen des Ausschaltes verhindern soll. Die Anschaltzeit ist aber im Wohnzimmer eher 6h, im Treppenhaus aber 2h und bei einem Bewegungsmelder 10min. &lt;br /&gt;
:Hier kann man nun immer das gleiche Template nutzen. Die Abschaltzeit wird separat eingestellt und ist per Kommando modifizierbar. Weiter ist sie in den Readings sichtbar.&lt;br /&gt;
;Anwendungsbeispiel Lichtschalter&lt;br /&gt;
:Grundsätzlich sind Lichtschalter erst einmal einfach: An/Aus Was kann man schon &amp;quot;templaten&amp;quot;?&lt;br /&gt;
:Ich habe diverse Lichter und einige zugehörige Schalter. Da meine Fernbedienungen nur eine endliche Anzahl Knöpfe haben muss ich mir ein Konzept überlegen. Nutzen kann ich bei einem Wippschalter 2 Buttons (Knöpfe) und unterscheide bei jedem langer oder kurzer Druck. Bei Schaltern benötige ich demnach Templates für On, Off, Toggle. Nun kann ich jeder Paarung Aktor/Sensor und hier Long/Short eine Funktion zuweisen. &lt;br /&gt;
:Nun nutze ich Buttons um bei pressLong das Licht 1 zu toggeln, bei PressShort toggelt es Licht 2. &lt;br /&gt;
:Was programmiert ist kann man in HmInfo ermitteln über &lt;br /&gt;
*get hm peerUsg&lt;br /&gt;
:Wie das erstellt wird, wird weiter unten erklärt&lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, Templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgende Templates nahe:&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schalter und Dimmer bei denen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Motiondetector (also den Schaltern) stellt man ein, wann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Templatedefinition als auch die Templatezuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Register Werte setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man bspw &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register &#039;&#039;OnTime&#039;&#039; den Wert &#039;&#039;timeOn&#039;&#039; ein. Und eben das Rampenregiste den Wert &#039;&#039;rampTime&#039;&#039;. Der Wert wird dann beim Template Instanziieren - also Anwenden - durch den Individuellen ersetzt.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
Templates kann man erstellen, in dem man die Register einer Entity nimmt und bearbeitet. Auch das Kopieren und Bearbeiten eines vorhandenen Templates ist möglich. Und man kann Templates exportieren/importieren.&lt;br /&gt;
===Template aus vorhandener Programmierung erstellen===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden, programmierten Device ein Template zu erstellen. Wir haben &lt;br /&gt;
*device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
*Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
*Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen um die Anschaltzeit variabel zu steuern. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
bei Bedarf können weitere Register verändert werde. &amp;lt;br&amp;gt;&lt;br /&gt;
Nun sind wir fertig. Möglich, aber nicht notwendig ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert.&lt;br /&gt;
===Template export-import===&lt;br /&gt;
Will man Templates exportieren nutzt man &amp;lt;br&amp;gt;&lt;br /&gt;
  get ht &amp;lt;templatename&amp;gt;&lt;br /&gt;
Es wird ein kommando ausgegeben welches man in die Kommandozeile pasten kann, was dann der import ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies kann man nutzen um Templates zu tauschen. Hat man ein &#039;&#039;gutes oder komplexes&#039;&#039; Template kann man dies der Allgemeinheit zu Verfügung stellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Im besten Fall muss der User sich nicht mehr um Register kümmern, da komfortable Templates das besser abdecken.&lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long UND short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben.&lt;br /&gt;
&lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
=Verwaltung und Überblick=&lt;br /&gt;
Nun hat man Templates definiert und Instanziiert. Wie soll man den Überblick behalten? HMtemplate ist ein Editor - also nicht wirklich hierfür geeignet. HMinfo macht die Verwaltung. &lt;br /&gt;
==Template Überblick==&lt;br /&gt;
Will man sehen, was man so an Templates nutzt kann man eine Überscht unterschedliche sortiert ausgeben lassen - in HMinfo (hm).&lt;br /&gt;
  get hm templateUsgG sortTemplate&lt;br /&gt;
  get hm templateUsgG sortPeer&lt;br /&gt;
  get hm templateUsgG all&lt;br /&gt;
Sowie eine Liste von Regiserlisten, welche noch kein Template nutzen (noch in Bau!!)&lt;br /&gt;
  get hm templateUsgG noTmpl&lt;br /&gt;
Eine Liste der Verfügbaren Templates erhält man mit &lt;br /&gt;
  get hm templateList all&lt;br /&gt;
und die Register eines Templates mit &lt;br /&gt;
  get hm templateList &amp;lt;templateName&amp;gt;&lt;br /&gt;
  oder&lt;br /&gt;
  set ht select  &amp;lt;templateName&amp;gt;&lt;br /&gt;
==Template prüfen==&lt;br /&gt;
Templates werden auf korrekte Implementierung in der Entity anhand eines Vergleichs der gelesenen Registern mit den gewünschten Regitern geprüft. Es ist also notwendig, dass die Registerwerte in der FHEM Kopie aktuell sind. Dann reicht ein &lt;br /&gt;
  get hm configCheck&lt;br /&gt;
Sollte es zu Unstimmigkeiten kommen werden mit &lt;br /&gt;
  set hm templateExe&lt;br /&gt;
alle Unstimmigkeiten überschrieben. Klar, wie immer, muss FHEM warten, bis ein Device angesprochen werden kann (Übertragungsmode) und dass die IOs nicht überlastet werden. Die Gefahr einer Überlast ist gering wenn man nicht gleich alles überschreiben will. &amp;lt;br&amp;gt;&lt;br /&gt;
Wie immer ist es hilfreich den Status der Übertragung im Blick zu haben:&lt;br /&gt;
  get hm protoEvents&lt;br /&gt;
Wenn zu viel passiert ist und man protoEvents aufräumen muss dann (Achtung: es werden alle ausstehenden Kommandos gelöscht und müssen neu aktiviert werden!)&lt;br /&gt;
  set hm clearG msgEvents&lt;br /&gt;
==Template löschen==&lt;br /&gt;
  set ht delete &amp;lt;tempateName&amp;gt;&lt;br /&gt;
Achtung: vorher müssen alle Referenzen des Templates entfernt worden sein. &lt;br /&gt;
&lt;br /&gt;
=Templates in den Entites=&lt;br /&gt;
Ist eine Entity mit einem Template verknüpft wird dies in den Readings angezeigt. Dies kann man sichtbar machen - und eine Anzeige von Registern in den Readings sollte dann nicht mehr notwendig sein. Empfohlen wird, den expoer mode auf rein Templates umzustellen&lt;br /&gt;
  attr TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=virtual expert 12_templOnly&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=DEF=........    expert&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=subType=virtual expert&lt;br /&gt;
&lt;br /&gt;
=Beispiele und Ideen=&lt;br /&gt;
&lt;br /&gt;
Neben den typischen Templates für Schalter kann (sollte) man auch bspw für RTs einsetzen. Temperaturlisten sind nicht im Angebot. Hier gibt es bereits andere Verfahren die besser passen. Allerdings experimentire ich bei meinen RTs mit den Regelparametern und will diese dann generell setzen. Alle RTs (bei mir) sollen die gleiche Regelung haben. Ich nutze 3 Templates für meine RTs&lt;br /&gt;
* &#039;&#039;&#039;HeatDefDev&#039;&#039;&#039;: Das Device des RT wird auf Standartwerte gesetzt. Hier nutze ich einen Parameter um die Tasten zu sperren. Dies brauche ich nicht bei allen RTs sondern nur bei denen, welche ich mit einem TC gepeert habe. Hier ist eine Lokale Änderung am TC vorzunehmen. &lt;br /&gt;
* &#039;&#039;&#039;HeatDefault&#039;&#039;&#039;:Die Standart-Regelung. Auch hier habe ich Parameter vorgesehen. Die Devices sind identisch... bis auf die Boostzeit und die maximals Ventilöffnung. Je nach Hk begrenze ich ValveMax - hängt von den baulichen Gegebenheiten ab. Boost nutze ich im Bad zum entfeuchten.&lt;br /&gt;
* &#039;&#039;&#039;HeatRemote&#039;&#039;&#039;: mein &#039;&#039;guteNacht&#039;&#039; Knopf macht auch vor RTs nicht halt. Ich haben an einer Remote einen Button mit allen Lichtern und RTs im Wohnbereich gekoppelt. Beim Drücken wird das Licht abgeschaltet und dieHeizung gedrosselt - bspw wenn ich als letzter ins Bett gehe. Daher brauche ich einen Parameter &#039;&#039;Temperatur&#039;&#039; um das induviduell je RT einzustellen. &lt;br /&gt;
  set hm templateDef HeatDefDev BtnLock &amp;quot;Default RT Device register&amp;quot; globalBtnLock:off localResDis:off modusBtnLock:off backOnTime:10 cyclicInfoMsg:on lowBatLimitRT:2.1 burstRx:on cyclicInfoMsgDis:0 btnLock:p0&lt;br /&gt;
  set hm templateDef HeatDefault boost:valveMax &amp;quot;myDefault RT settings, enter boostTime and valveMax&amp;quot; regAdaptive:offDeter reguIntI:20 nightTemp:17 tempOffset:0.0K dayTemp:21 reguIntPstart:5 reguExtI:20 showWeekday:off reguExtP:25 reguIntP:25 tempMax:30.5 tempMin:4.5 valveMaxPos:p1 valveOffsetRt:0 modePrioManu:all daylightSaveTime:on boostPos:30 decalcWeekday:Sat showInfo:time decalcTime:11:00 btnNoBckLight:off reguExtPstart:5 noMinMax4Manu:off modePrioParty:all valveErrPos:15 boostPeriod:p0&lt;br /&gt;
  set hm templateDef HeatRemote temp &amp;quot;heatRemote set temperature&amp;quot; CtrlRc:autoAndTemp TempRC:p0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In der Übersicht für 2 RTs ergibt ein get hm templateUsg&lt;br /&gt;
  haEss               |0              |HeatDefDev|BtnLock:off &lt;br /&gt;
  haEss_Clima         |0              |HeatDefault|boost:5 valveMax:15 &lt;br /&gt;
  haEss_remote        |FB8_1:short    |HeatRemote|temp:13 &lt;br /&gt;
  haEss_remote        |FB8_5:long     |HeatRemote|temp:13 &lt;br /&gt;
  haEss_remote        |FB8_5:short    |HeatRemote|temp:19 &lt;br /&gt;
  haLnge              |0              |HeatDefDev|BtnLock:off &lt;br /&gt;
  haLnge_Clima        |0              |HeatDefault|boost:5 valveMax:15 &lt;br /&gt;
  haLnge_remote       |FB8_1:short    |HeatRemote|temp:13 &lt;br /&gt;
  haLnge_remote       |FB8_5:long     |HeatRemote|temp:13 &lt;br /&gt;
  haLnge_remote       |FB8_5:short    |HeatRemote|temp:19 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=31775</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=31775"/>
		<updated>2019-12-01T13:14:17Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: /* Was bieten Templates */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Templates sind ein Weg, die Register der HM RF Devices zu setzen, zu kontrollieren und zu replizieren. &lt;br /&gt;
Warum braucht man nun Templates? Register lassen sich doch einfach ohne Templates setzen. Warum sich damit befassen?&lt;br /&gt;
Nun, die Gründe sind vielfältig - und eigentlich unabdingbar für alle, die ein geordnetes System verwalten wollen. &lt;br /&gt;
;Register ohne Template - Schwachstellen&lt;br /&gt;
:Register werden, wie bekannt, remanent in den HM-Devices gespeichert. FHEM hat eine Kopie dieser Daten welche über getConfig aufgefrischt werden können. Setzt man nun in einem Device ein Register ist dies erst einmal erledigt. Nun kann sich das Register verändern bzw muss überprüft werden, wenn &lt;br /&gt;
* das Device ausgetauscht wird&lt;br /&gt;
* das Device reseted wird - kommt auch einmal vor&lt;br /&gt;
* ein FW bug oder ein HW Defekt vorliegt&lt;br /&gt;
* das Schreiben der Registerwerte nicht erfolgreich war&lt;br /&gt;
:Weiter ist es praktisch die gewünschten Settings, also das eingestellte Verhalten &lt;br /&gt;
* zu verifizieren&lt;br /&gt;
* zu kopieren&lt;br /&gt;
:ohne sich einzelne Registerzu merken oder wieder herzuleiten. &lt;br /&gt;
&lt;br /&gt;
Anzumerken ist, dass die Nutzung von Templates das Bedienen der Register nicht abschaltet oder übersteuert sondern nur ergänzt. &lt;br /&gt;
&lt;br /&gt;
Templates heben das Bedienen der Register von der Assembler ebene auf eine Hochsprachen-Ebene. Nicht ohne Grund ist die erste Bedienung der Register in der eq3-CCU quasi per Template. Register werden nur im Expert mode sichtbar. &lt;br /&gt;
&lt;br /&gt;
= Was bieten Templates =&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register, welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der ist-Registerwerte verwaltet lebt man erst grundsätzlich in einer fragilen Welt. Eine Soll-Wert Verwaltung der Register bietet nur in Templates. &lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren. Der Anwender holt sich ein Template und kopiert es in sein System. Nun kann er&lt;br /&gt;
* die Funktion nutzen. Es muss die Register nicht verstehen&lt;br /&gt;
* Die Funktion nutzen, testen und die Register evaluieren und daran zu lernen&lt;br /&gt;
* Die Funktion erweitern, modifizieren und an seine Bedürfnisse anpassen&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man evtl. Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen, ... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt und repliziert.&lt;br /&gt;
;Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde.&lt;br /&gt;
;Globales Anpassen aller Devices&lt;br /&gt;
:Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Template ändern und diese Änderungen allen Devices zu Gute kommen lassen. Auf einmal.&lt;br /&gt;
;Funktionen parametrieren&lt;br /&gt;
:Der Anwender hat typisch den Wunsch, eine Funktion zu relaisieren, aber einen Parameter will er bei jeder Anwendung anpassen. So will ich typischerweise, dass nach einem ON-Trigger immer eine automatische Abschaltung eingestellt wird, was das Vergessen des Ausschaltes verhindern soll. Die Anschaltzeit ist aber im Wohnzimmer eher 6h, im Treppenhaus aber 2h und bei einem Bewegungsmelder 10min. &lt;br /&gt;
:Hier kann man nun immer das gleiche Template nutzen. Die Abschaltzeit wird separat eingestellt und ist per Kommando modifizierbar. Weiter ist sie in den Readings sichtbar.&lt;br /&gt;
;Anwendungsbeispiel Lichtschalter&lt;br /&gt;
:Grundsätzlich sind Lichtschalter erst einmal einfach: An/Aus Was kann man schon &amp;quot;templaten&amp;quot;?&lt;br /&gt;
:Ich habe diverse Lichter und einige zugehörige Schalter. Da meine Fernbedienungen nur eine endliche Anzahl Knöpfe haben muss ich mir ein Konzept überlegen. Nutzen kann ich bei einem Wippschalter 2 Buttons (Knöpfe) und unterscheide bei jedem langer oder kurzer Druck. Bei Schaltern benötige ich demnach Templates für On, Off, Toggle. Nun kann ich jeder Paarung Aktor/Sensor und hier Long/Short eine Funktion zuweisen. &lt;br /&gt;
:Nun nutze ich Buttons um bei pressLong das Licht 1 zu toggeln, bei PressShort toggelt es Licht 2. &lt;br /&gt;
:Was programmiert ist kann man in HmInfo ermitteln über &lt;br /&gt;
*get hm peerUsg&lt;br /&gt;
:Wie das erstellt wird, wird weiter unten erklärt&lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, Templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgende Templates nahe:&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schalter und Dimmer bei denen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Motiondetector (also den Schaltern) stellt man ein, wann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Templatedefinition als auch die Templatezuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Register Werte setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man bspw &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register &#039;&#039;OnTime&#039;&#039; den Wert &#039;&#039;timeOn&#039;&#039; ein. Und eben das Rampenregiste den Wert &#039;&#039;rampTime&#039;&#039;. Der Wert wird dann beim Template Instanziieren - also Anwenden - durch den Individuellen ersetzt.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
Templates kann man erstellen, in dem man die Register einer Entity nimmt und bearbeitet. Auch das Kopieren und Bearbeiten eines vorhandenen Templates ist möglich. Und man kann Templates exportieren/importieren.&lt;br /&gt;
===Template aus Device===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert.&lt;br /&gt;
===Template export-import===&lt;br /&gt;
Will man Templates exportieren nutzt man &amp;lt;br&amp;gt;&lt;br /&gt;
  get ht &amp;lt;templatename&amp;gt;&lt;br /&gt;
Es wird ein kommando ausgegeben welches man in die Kommandozeile pasten kann, was dann der import ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies kann man nutzen um Templates zu tauschen. Hat man ein &#039;&#039;gutes oder komplexes&#039;&#039; Template kann man dies der Allgemeinheit zu Verfügung stellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Im besten Fall muss der User sich nicht mehr um Register kümmern, da komfortable Templates das besser abdecken.&lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long UND short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben.&lt;br /&gt;
&lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
=Verwaltung und Überblick=&lt;br /&gt;
Nun hat man Templates definiert und Instanziiert. Wie soll man den Überblick behalten? HMtemplate ist ein Editor - also nicht wirklich hierfür geeignet. HMinfo macht die Verwaltung. &lt;br /&gt;
==Template Überblick==&lt;br /&gt;
Will man sehen, was man so an Templates nutzt kann man eine Überscht unterschedliche sortiert ausgeben lassen - in HMinfo (hm).&lt;br /&gt;
  get hm templateUsgG sortTemplate&lt;br /&gt;
  get hm templateUsgG sortPeer&lt;br /&gt;
  get hm templateUsgG all&lt;br /&gt;
Sowie eine Liste von Regiserlisten, welche noch kein Template nutzen (noch in Bau!!)&lt;br /&gt;
  get hm templateUsgG noTmpl&lt;br /&gt;
Eine Liste der Verfügbaren Templates erhält man mit &lt;br /&gt;
  get hm templateList all&lt;br /&gt;
und die Register eines Templates mit &lt;br /&gt;
  get hm templateList &amp;lt;templateName&amp;gt;&lt;br /&gt;
  oder&lt;br /&gt;
  set ht select  &amp;lt;templateName&amp;gt;&lt;br /&gt;
==Template prüfen==&lt;br /&gt;
Templates werden auf korrekte Implementierung in der Entity anhand eines Vergleichs der gelesenen Registern mit den gewünschten Regitern geprüft. Es ist also notwendig, dass die Registerwerte in der FHEM Kopie aktuell sind. Dann reicht ein &lt;br /&gt;
  get hm configCheck&lt;br /&gt;
Sollte es zu Unstimmigkeiten kommen werden mit &lt;br /&gt;
  set hm templateExe&lt;br /&gt;
alle Unstimmigkeiten überschrieben. Klar, wie immer, muss FHEM warten, bis ein Device angesprochen werden kann (Übertragungsmode) und dass die IOs nicht überlastet werden. Die Gefahr einer Überlast ist gering wenn man nicht gleich alles überschreiben will. &amp;lt;br&amp;gt;&lt;br /&gt;
Wie immer ist es hilfreich den Status der Übertragung im Blick zu haben:&lt;br /&gt;
  get hm protoEvents&lt;br /&gt;
Wenn zu viel passiert ist und man protoEvents aufräumen muss dann (Achtung: es werden alle ausstehenden Kommandos gelöscht und müssen neu aktiviert werden!)&lt;br /&gt;
  set hm clearG msgEvents&lt;br /&gt;
==Template löschen==&lt;br /&gt;
  set ht delete &amp;lt;tempateName&amp;gt;&lt;br /&gt;
Achtung: vorher müssen alle Referenzen des Templates entfernt worden sein. &lt;br /&gt;
&lt;br /&gt;
=Templates in den Entites=&lt;br /&gt;
Ist eine Entity mit einem Template verknüpft wird dies in den Readings angezeigt. Dies kann man sichtbar machen - und eine Anzeige von Registern in den Readings sollte dann nicht mehr notwendig sein. Empfohlen wird, den expoer mode auf rein Templates umzustellen&lt;br /&gt;
  attr TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=virtual expert 12_templOnly&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=DEF=........    expert&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=subType=virtual expert&lt;br /&gt;
&lt;br /&gt;
=Beispiele und Ideen=&lt;br /&gt;
&lt;br /&gt;
Neben den typischen Templates für Schalter kann (sollte) man auch bspw für RTs einsetzen. Temperaturlisten sind nicht im Angebot. Hier gibt es bereits andere Verfahren die besser passen. Allerdings experimentire ich bei meinen RTs mit den Regelparametern und will diese dann generell setzen. Alle RTs (bei mir) sollen die gleiche Regelung haben. Ich nutze 3 Templates für meine RTs&lt;br /&gt;
* &#039;&#039;&#039;HeatDefDev&#039;&#039;&#039;: Das Device des RT wird auf Standartwerte gesetzt. Hier nutze ich einen Parameter um die Tasten zu sperren. Dies brauche ich nicht bei allen RTs sondern nur bei denen, welche ich mit einem TC gepeert habe. Hier ist eine Lokale Änderung am TC vorzunehmen. &lt;br /&gt;
* &#039;&#039;&#039;HeatDefault&#039;&#039;&#039;:Die Standart-Regelung. Auch hier habe ich Parameter vorgesehen. Die Devices sind identisch... bis auf die Boostzeit und die maximals Ventilöffnung. Je nach Hk begrenze ich ValveMax - hängt von den baulichen Gegebenheiten ab. Boost nutze ich im Bad zum entfeuchten.&lt;br /&gt;
* &#039;&#039;&#039;HeatRemote&#039;&#039;&#039;: mein &#039;&#039;guteNacht&#039;&#039; Knopf macht auch vor RTs nicht halt. Ich haben an einer Remote einen Button mit allen Lichtern und RTs im Wohnbereich gekoppelt. Beim Drücken wird das Licht abgeschaltet und dieHeizung gedrosselt - bspw wenn ich als letzter ins Bett gehe. Daher brauche ich einen Parameter &#039;&#039;Temperatur&#039;&#039; um das induviduell je RT einzustellen. &lt;br /&gt;
  set hm templateDef HeatDefDev BtnLock &amp;quot;Default RT Device register&amp;quot; globalBtnLock:off localResDis:off modusBtnLock:off backOnTime:10 cyclicInfoMsg:on lowBatLimitRT:2.1 burstRx:on cyclicInfoMsgDis:0 btnLock:p0&lt;br /&gt;
  set hm templateDef HeatDefault boost:valveMax &amp;quot;myDefault RT settings, enter boostTime and valveMax&amp;quot; regAdaptive:offDeter reguIntI:20 nightTemp:17 tempOffset:0.0K dayTemp:21 reguIntPstart:5 reguExtI:20 showWeekday:off reguExtP:25 reguIntP:25 tempMax:30.5 tempMin:4.5 valveMaxPos:p1 valveOffsetRt:0 modePrioManu:all daylightSaveTime:on boostPos:30 decalcWeekday:Sat showInfo:time decalcTime:11:00 btnNoBckLight:off reguExtPstart:5 noMinMax4Manu:off modePrioParty:all valveErrPos:15 boostPeriod:p0&lt;br /&gt;
  set hm templateDef HeatRemote temp &amp;quot;heatRemote set temperature&amp;quot; CtrlRc:autoAndTemp TempRC:p0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In der Übersicht für 2 RTs ergibt ein get hm templateUsg&lt;br /&gt;
  haEss               |0              |HeatDefDev|BtnLock:off &lt;br /&gt;
  haEss_Clima         |0              |HeatDefault|boost:5 valveMax:15 &lt;br /&gt;
  haEss_remote        |FB8_1:short    |HeatRemote|temp:13 &lt;br /&gt;
  haEss_remote        |FB8_5:long     |HeatRemote|temp:13 &lt;br /&gt;
  haEss_remote        |FB8_5:short    |HeatRemote|temp:19 &lt;br /&gt;
  haLnge              |0              |HeatDefDev|BtnLock:off &lt;br /&gt;
  haLnge_Clima        |0              |HeatDefault|boost:5 valveMax:15 &lt;br /&gt;
  haLnge_remote       |FB8_1:short    |HeatRemote|temp:13 &lt;br /&gt;
  haLnge_remote       |FB8_5:long     |HeatRemote|temp:13 &lt;br /&gt;
  haLnge_remote       |FB8_5:short    |HeatRemote|temp:19 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=31774</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=31774"/>
		<updated>2019-12-01T13:13:35Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: /* Was bieten Templates */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Templates sind ein Weg, die Register der HM RF Devices zu setzen, zu kontrollieren und zu replizieren. &lt;br /&gt;
Warum braucht man nun Templates? Register lassen sich doch einfach ohne Templates setzen. Warum sich damit befassen?&lt;br /&gt;
Nun, die Gründe sind vielfältig - und eigentlich unabdingbar für alle, die ein geordnetes System verwalten wollen. &lt;br /&gt;
;Register ohne Template - Schwachstellen&lt;br /&gt;
:Register werden, wie bekannt, remanent in den HM-Devices gespeichert. FHEM hat eine Kopie dieser Daten welche über getConfig aufgefrischt werden können. Setzt man nun in einem Device ein Register ist dies erst einmal erledigt. Nun kann sich das Register verändern bzw muss überprüft werden, wenn &lt;br /&gt;
* das Device ausgetauscht wird&lt;br /&gt;
* das Device reseted wird - kommt auch einmal vor&lt;br /&gt;
* ein FW bug oder ein HW Defekt vorliegt&lt;br /&gt;
* das Schreiben der Registerwerte nicht erfolgreich war&lt;br /&gt;
:Weiter ist es praktisch die gewünschten Settings, also das eingestellte Verhalten &lt;br /&gt;
* zu verifizieren&lt;br /&gt;
* zu kopieren&lt;br /&gt;
:ohne sich einzelne Registerzu merken oder wieder herzuleiten. &lt;br /&gt;
&lt;br /&gt;
Anzumerken ist, dass die Nutzung von Templates das Bedienen der Register nicht abschaltet oder übersteuert sondern nur ergänzt. &lt;br /&gt;
&lt;br /&gt;
Templates heben das Bedienen der Register von der Assembler ebene auf eine Hochsprachen-Ebene. Nicht ohne Grund ist die erste Bedienung der Register in der eq3-CCU quasi per Template. Register werden nur im Expert mode sichtbar. &lt;br /&gt;
&lt;br /&gt;
= Was bieten Templates =&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register, welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der ist-Registerwerte verwaltet lebt man erst grundsätzlich in einer fragilen Welt. Eine Soll-Wert Verwaltung der Register bietet nur in Templates. &lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren. Der Anwender holt sich ein Template und kopiert es in sein System. Nun kann er&lt;br /&gt;
* die Funktion nutzen. Es muss die Register nicht verstehen&lt;br /&gt;
* Die Funktion nutzen, testen und die Register evaluieren und daran zu lernen&lt;br /&gt;
* Die Funktion erweitern, modifizieren und an seine Bedürfnisse anpassen&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man evtl. Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen, ... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt und repliziert.&lt;br /&gt;
;Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde.&lt;br /&gt;
;Globales Anpassen aller Devices&lt;br /&gt;
:Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Template ändern und diese Änderungen allen Devices zu Gute kommen lassen. Auf einmal.&lt;br /&gt;
;Funktionen parametrieren&lt;br /&gt;
:Der Anwender hat typisch den Wunsch, eine Funktion zu relaisieren, aber einen Parameter will er bei jeder Anwendung anpassen. So will ich typischerweise, dass nach einem ON-Trigger immer eine automatische Abschaltung eingestellt wird, was das Vergessen des Ausschaltes verhindern soll. Die Anschaltzeit ist aber im Wohnzimmer eher 6h, im Treppenhaus aber 2h und bei einem Bewegungsmelder 10min. &lt;br /&gt;
:Hier kann man nun immer das gleiche Template nutzen. Die Abschaltzeit wird separat eingestellt und ist per Kommando modifizierbar. Weiter ist sie in den Readings sichtbar.&lt;br /&gt;
;Anwendungsbeispiel Lichtschalter&lt;br /&gt;
:Grundsätzlich sind Lichtschalter erst einmal einfach: An/Aus Was kann man schon &amp;quot;templaten&amp;quot;?&lt;br /&gt;
:Ich habe diverse Lichter und einige zugehörige Schalter. Da meine Fernbedienungen nur eine endliche Anzahl Knöpfe haben muss ich mir ein Konzept überlegen. Nutzen kann ich bei einem Wippschalter 2 Buttons (Knöpfe) und unterscheide bei jedem langer oder kurzer Druck. Bei Schaltern benötige ich demnach Templates für On, Off, Toggle. Nun kann ich jeder Paarung Aktor/Sensor und hier Long/Short eine Funktion zuweisen. &lt;br /&gt;
:Nun nutze ich Buttons um bei pressLong das Licht 1 zu toggeln, bei PressShort toggelt es Licht 2. &lt;br /&gt;
:Was programmiert ist kann man in HmInfo ermitteln über &lt;br /&gt;
*get hm peerUsg&lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, Templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgende Templates nahe:&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schalter und Dimmer bei denen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Motiondetector (also den Schaltern) stellt man ein, wann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Templatedefinition als auch die Templatezuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Register Werte setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man bspw &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register &#039;&#039;OnTime&#039;&#039; den Wert &#039;&#039;timeOn&#039;&#039; ein. Und eben das Rampenregiste den Wert &#039;&#039;rampTime&#039;&#039;. Der Wert wird dann beim Template Instanziieren - also Anwenden - durch den Individuellen ersetzt.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
Templates kann man erstellen, in dem man die Register einer Entity nimmt und bearbeitet. Auch das Kopieren und Bearbeiten eines vorhandenen Templates ist möglich. Und man kann Templates exportieren/importieren.&lt;br /&gt;
===Template aus Device===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert.&lt;br /&gt;
===Template export-import===&lt;br /&gt;
Will man Templates exportieren nutzt man &amp;lt;br&amp;gt;&lt;br /&gt;
  get ht &amp;lt;templatename&amp;gt;&lt;br /&gt;
Es wird ein kommando ausgegeben welches man in die Kommandozeile pasten kann, was dann der import ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies kann man nutzen um Templates zu tauschen. Hat man ein &#039;&#039;gutes oder komplexes&#039;&#039; Template kann man dies der Allgemeinheit zu Verfügung stellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Im besten Fall muss der User sich nicht mehr um Register kümmern, da komfortable Templates das besser abdecken.&lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long UND short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben.&lt;br /&gt;
&lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
=Verwaltung und Überblick=&lt;br /&gt;
Nun hat man Templates definiert und Instanziiert. Wie soll man den Überblick behalten? HMtemplate ist ein Editor - also nicht wirklich hierfür geeignet. HMinfo macht die Verwaltung. &lt;br /&gt;
==Template Überblick==&lt;br /&gt;
Will man sehen, was man so an Templates nutzt kann man eine Überscht unterschedliche sortiert ausgeben lassen - in HMinfo (hm).&lt;br /&gt;
  get hm templateUsgG sortTemplate&lt;br /&gt;
  get hm templateUsgG sortPeer&lt;br /&gt;
  get hm templateUsgG all&lt;br /&gt;
Sowie eine Liste von Regiserlisten, welche noch kein Template nutzen (noch in Bau!!)&lt;br /&gt;
  get hm templateUsgG noTmpl&lt;br /&gt;
Eine Liste der Verfügbaren Templates erhält man mit &lt;br /&gt;
  get hm templateList all&lt;br /&gt;
und die Register eines Templates mit &lt;br /&gt;
  get hm templateList &amp;lt;templateName&amp;gt;&lt;br /&gt;
  oder&lt;br /&gt;
  set ht select  &amp;lt;templateName&amp;gt;&lt;br /&gt;
==Template prüfen==&lt;br /&gt;
Templates werden auf korrekte Implementierung in der Entity anhand eines Vergleichs der gelesenen Registern mit den gewünschten Regitern geprüft. Es ist also notwendig, dass die Registerwerte in der FHEM Kopie aktuell sind. Dann reicht ein &lt;br /&gt;
  get hm configCheck&lt;br /&gt;
Sollte es zu Unstimmigkeiten kommen werden mit &lt;br /&gt;
  set hm templateExe&lt;br /&gt;
alle Unstimmigkeiten überschrieben. Klar, wie immer, muss FHEM warten, bis ein Device angesprochen werden kann (Übertragungsmode) und dass die IOs nicht überlastet werden. Die Gefahr einer Überlast ist gering wenn man nicht gleich alles überschreiben will. &amp;lt;br&amp;gt;&lt;br /&gt;
Wie immer ist es hilfreich den Status der Übertragung im Blick zu haben:&lt;br /&gt;
  get hm protoEvents&lt;br /&gt;
Wenn zu viel passiert ist und man protoEvents aufräumen muss dann (Achtung: es werden alle ausstehenden Kommandos gelöscht und müssen neu aktiviert werden!)&lt;br /&gt;
  set hm clearG msgEvents&lt;br /&gt;
==Template löschen==&lt;br /&gt;
  set ht delete &amp;lt;tempateName&amp;gt;&lt;br /&gt;
Achtung: vorher müssen alle Referenzen des Templates entfernt worden sein. &lt;br /&gt;
&lt;br /&gt;
=Templates in den Entites=&lt;br /&gt;
Ist eine Entity mit einem Template verknüpft wird dies in den Readings angezeigt. Dies kann man sichtbar machen - und eine Anzeige von Registern in den Readings sollte dann nicht mehr notwendig sein. Empfohlen wird, den expoer mode auf rein Templates umzustellen&lt;br /&gt;
  attr TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=virtual expert 12_templOnly&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=DEF=........    expert&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=subType=virtual expert&lt;br /&gt;
&lt;br /&gt;
=Beispiele und Ideen=&lt;br /&gt;
&lt;br /&gt;
Neben den typischen Templates für Schalter kann (sollte) man auch bspw für RTs einsetzen. Temperaturlisten sind nicht im Angebot. Hier gibt es bereits andere Verfahren die besser passen. Allerdings experimentire ich bei meinen RTs mit den Regelparametern und will diese dann generell setzen. Alle RTs (bei mir) sollen die gleiche Regelung haben. Ich nutze 3 Templates für meine RTs&lt;br /&gt;
* &#039;&#039;&#039;HeatDefDev&#039;&#039;&#039;: Das Device des RT wird auf Standartwerte gesetzt. Hier nutze ich einen Parameter um die Tasten zu sperren. Dies brauche ich nicht bei allen RTs sondern nur bei denen, welche ich mit einem TC gepeert habe. Hier ist eine Lokale Änderung am TC vorzunehmen. &lt;br /&gt;
* &#039;&#039;&#039;HeatDefault&#039;&#039;&#039;:Die Standart-Regelung. Auch hier habe ich Parameter vorgesehen. Die Devices sind identisch... bis auf die Boostzeit und die maximals Ventilöffnung. Je nach Hk begrenze ich ValveMax - hängt von den baulichen Gegebenheiten ab. Boost nutze ich im Bad zum entfeuchten.&lt;br /&gt;
* &#039;&#039;&#039;HeatRemote&#039;&#039;&#039;: mein &#039;&#039;guteNacht&#039;&#039; Knopf macht auch vor RTs nicht halt. Ich haben an einer Remote einen Button mit allen Lichtern und RTs im Wohnbereich gekoppelt. Beim Drücken wird das Licht abgeschaltet und dieHeizung gedrosselt - bspw wenn ich als letzter ins Bett gehe. Daher brauche ich einen Parameter &#039;&#039;Temperatur&#039;&#039; um das induviduell je RT einzustellen. &lt;br /&gt;
  set hm templateDef HeatDefDev BtnLock &amp;quot;Default RT Device register&amp;quot; globalBtnLock:off localResDis:off modusBtnLock:off backOnTime:10 cyclicInfoMsg:on lowBatLimitRT:2.1 burstRx:on cyclicInfoMsgDis:0 btnLock:p0&lt;br /&gt;
  set hm templateDef HeatDefault boost:valveMax &amp;quot;myDefault RT settings, enter boostTime and valveMax&amp;quot; regAdaptive:offDeter reguIntI:20 nightTemp:17 tempOffset:0.0K dayTemp:21 reguIntPstart:5 reguExtI:20 showWeekday:off reguExtP:25 reguIntP:25 tempMax:30.5 tempMin:4.5 valveMaxPos:p1 valveOffsetRt:0 modePrioManu:all daylightSaveTime:on boostPos:30 decalcWeekday:Sat showInfo:time decalcTime:11:00 btnNoBckLight:off reguExtPstart:5 noMinMax4Manu:off modePrioParty:all valveErrPos:15 boostPeriod:p0&lt;br /&gt;
  set hm templateDef HeatRemote temp &amp;quot;heatRemote set temperature&amp;quot; CtrlRc:autoAndTemp TempRC:p0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In der Übersicht für 2 RTs ergibt ein get hm templateUsg&lt;br /&gt;
  haEss               |0              |HeatDefDev|BtnLock:off &lt;br /&gt;
  haEss_Clima         |0              |HeatDefault|boost:5 valveMax:15 &lt;br /&gt;
  haEss_remote        |FB8_1:short    |HeatRemote|temp:13 &lt;br /&gt;
  haEss_remote        |FB8_5:long     |HeatRemote|temp:13 &lt;br /&gt;
  haEss_remote        |FB8_5:short    |HeatRemote|temp:19 &lt;br /&gt;
  haLnge              |0              |HeatDefDev|BtnLock:off &lt;br /&gt;
  haLnge_Clima        |0              |HeatDefault|boost:5 valveMax:15 &lt;br /&gt;
  haLnge_remote       |FB8_1:short    |HeatRemote|temp:13 &lt;br /&gt;
  haLnge_remote       |FB8_5:long     |HeatRemote|temp:13 &lt;br /&gt;
  haLnge_remote       |FB8_5:short    |HeatRemote|temp:19 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=31771</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=31771"/>
		<updated>2019-12-01T11:48:02Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: /* Warum Templates */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Templates sind ein Weg, die Register der HM RF Devices zu setzen, zu kontrollieren und zu replizieren. &lt;br /&gt;
Warum braucht man nun Templates? Register lassen sich doch einfach ohne Templates setzen. Warum sich damit befassen?&lt;br /&gt;
Nun, die Gründe sind vielfältig - und eigentlich unabdingbar für alle, die ein geordnetes System verwalten wollen. &lt;br /&gt;
;Register ohne Template - Schwachstellen&lt;br /&gt;
:Register werden, wie bekannt, remanent in den HM-Devices gespeichert. FHEM hat eine Kopie dieser Daten welche über getConfig aufgefrischt werden können. Setzt man nun in einem Device ein Register ist dies erst einmal erledigt. Nun kann sich das Register verändern bzw muss überprüft werden, wenn &lt;br /&gt;
* das Device ausgetauscht wird&lt;br /&gt;
* das Device reseted wird - kommt auch einmal vor&lt;br /&gt;
* ein FW bug oder ein HW Defekt vorliegt&lt;br /&gt;
* das Schreiben der Registerwerte nicht erfolgreich war&lt;br /&gt;
:Weiter ist es praktisch die gewünschten Settings, also das eingestellte Verhalten &lt;br /&gt;
* zu verifizieren&lt;br /&gt;
* zu kopieren&lt;br /&gt;
:ohne sich einzelne Registerzu merken oder wieder herzuleiten. &lt;br /&gt;
&lt;br /&gt;
Anzumerken ist, dass die Nutzung von Templates das Bedienen der Register nicht abschaltet oder übersteuert sondern nur ergänzt. &lt;br /&gt;
&lt;br /&gt;
Templates heben das Bedienen der Register von der Assembler ebene auf eine Hochsprachen-Ebene. Nicht ohne Grund ist die erste Bedienung der Register in der eq3-CCU quasi per Template. Register werden nur im Expert mode sichtbar. &lt;br /&gt;
&lt;br /&gt;
= Was bieten Templates =&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register, welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der ist-Registerwerte verwaltet lebt man erst grundsätzlich in einer fragilen Welt. Eine Soll-Wert Verwaltung der Register bietet nur in Templates. &lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren. Der Anwender holt sich ein Template und kopiert es in sein System. Nun kann er&lt;br /&gt;
* die Funktion nutzen. Es muss die Register nicht verstehen&lt;br /&gt;
* Die Funktion nutzen, testen und die Register evaluieren und daran zu lernen&lt;br /&gt;
* Die Funktion erweitern, modifizieren und an seine Bedürfnisse anpassen&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man evtl. Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen, ... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt und repliziert.&lt;br /&gt;
;Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde.&lt;br /&gt;
;Globales Anpassen aller Devices&lt;br /&gt;
:Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Template ändern und diese Änderungen allen Devices zu Gute kommen lassen. Auf einmal.&lt;br /&gt;
;Funktionen parametrieren&lt;br /&gt;
:Der Anwender hat typisch den Wunsch, eine Funktion zu relaisieren, aber einen Parameter will er bei jeder Anwendung anpassen. So will ich typischerweise, dass nach einem ON-Trigger immer eine automatische Abschaltung eingestellt wird, was das Vergessen des Ausschaltes verhindern soll. Die Anschaltzeit ist aber im Wohnzimmer eher 6h, im Treppenhaus aber 2h und bei einem Bewegungsmelder 10min. &lt;br /&gt;
:Hier kann man nun immer das gleiche Template nutzen. Die Abschaltzeit wird separat eingestellt und ist per Kommando modifizierbar. Weiter ist sie in den Readings sichtbar.&lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, Templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgende Templates nahe:&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schalter und Dimmer bei denen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Motiondetector (also den Schaltern) stellt man ein, wann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Templatedefinition als auch die Templatezuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Register Werte setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man bspw &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register &#039;&#039;OnTime&#039;&#039; den Wert &#039;&#039;timeOn&#039;&#039; ein. Und eben das Rampenregiste den Wert &#039;&#039;rampTime&#039;&#039;. Der Wert wird dann beim Template Instanziieren - also Anwenden - durch den Individuellen ersetzt.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
Templates kann man erstellen, in dem man die Register einer Entity nimmt und bearbeitet. Auch das Kopieren und Bearbeiten eines vorhandenen Templates ist möglich. Und man kann Templates exportieren/importieren.&lt;br /&gt;
===Template aus Device===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert.&lt;br /&gt;
===Template export-import===&lt;br /&gt;
Will man Templates exportieren nutzt man &amp;lt;br&amp;gt;&lt;br /&gt;
  get ht &amp;lt;templatename&amp;gt;&lt;br /&gt;
Es wird ein kommando ausgegeben welches man in die Kommandozeile pasten kann, was dann der import ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies kann man nutzen um Templates zu tauschen. Hat man ein &#039;&#039;gutes oder komplexes&#039;&#039; Template kann man dies der Allgemeinheit zu Verfügung stellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Im besten Fall muss der User sich nicht mehr um Register kümmern, da komfortable Templates das besser abdecken.&lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long UND short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben.&lt;br /&gt;
&lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
=Verwaltung und Überblick=&lt;br /&gt;
Nun hat man Templates definiert und Instanziiert. Wie soll man den Überblick behalten? HMtemplate ist ein Editor - also nicht wirklich hierfür geeignet. HMinfo macht die Verwaltung. &lt;br /&gt;
==Template Überblick==&lt;br /&gt;
Will man sehen, was man so an Templates nutzt kann man eine Überscht unterschedliche sortiert ausgeben lassen - in HMinfo (hm).&lt;br /&gt;
  get hm templateUsgG sortTemplate&lt;br /&gt;
  get hm templateUsgG sortPeer&lt;br /&gt;
  get hm templateUsgG all&lt;br /&gt;
Sowie eine Liste von Regiserlisten, welche noch kein Template nutzen (noch in Bau!!)&lt;br /&gt;
  get hm templateUsgG noTmpl&lt;br /&gt;
Eine Liste der Verfügbaren Templates erhält man mit &lt;br /&gt;
  get hm templateList all&lt;br /&gt;
und die Register eines Templates mit &lt;br /&gt;
  get hm templateList &amp;lt;templateName&amp;gt;&lt;br /&gt;
  oder&lt;br /&gt;
  set ht select  &amp;lt;templateName&amp;gt;&lt;br /&gt;
==Template prüfen==&lt;br /&gt;
Templates werden auf korrekte Implementierung in der Entity anhand eines Vergleichs der gelesenen Registern mit den gewünschten Regitern geprüft. Es ist also notwendig, dass die Registerwerte in der FHEM Kopie aktuell sind. Dann reicht ein &lt;br /&gt;
  get hm configCheck&lt;br /&gt;
Sollte es zu Unstimmigkeiten kommen werden mit &lt;br /&gt;
  set hm templateExe&lt;br /&gt;
alle Unstimmigkeiten überschrieben. Klar, wie immer, muss FHEM warten, bis ein Device angesprochen werden kann (Übertragungsmode) und dass die IOs nicht überlastet werden. Die Gefahr einer Überlast ist gering wenn man nicht gleich alles überschreiben will. &amp;lt;br&amp;gt;&lt;br /&gt;
Wie immer ist es hilfreich den Status der Übertragung im Blick zu haben:&lt;br /&gt;
  get hm protoEvents&lt;br /&gt;
Wenn zu viel passiert ist und man protoEvents aufräumen muss dann (Achtung: es werden alle ausstehenden Kommandos gelöscht und müssen neu aktiviert werden!)&lt;br /&gt;
  set hm clearG msgEvents&lt;br /&gt;
==Template löschen==&lt;br /&gt;
  set ht delete &amp;lt;tempateName&amp;gt;&lt;br /&gt;
Achtung: vorher müssen alle Referenzen des Templates entfernt worden sein. &lt;br /&gt;
&lt;br /&gt;
=Templates in den Entites=&lt;br /&gt;
Ist eine Entity mit einem Template verknüpft wird dies in den Readings angezeigt. Dies kann man sichtbar machen - und eine Anzeige von Registern in den Readings sollte dann nicht mehr notwendig sein. Empfohlen wird, den expoer mode auf rein Templates umzustellen&lt;br /&gt;
  attr TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=virtual expert 12_templOnly&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=DEF=........    expert&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=subType=virtual expert&lt;br /&gt;
&lt;br /&gt;
=Beispiele und Ideen=&lt;br /&gt;
&lt;br /&gt;
Neben den typischen Templates für Schalter kann (sollte) man auch bspw für RTs einsetzen. Temperaturlisten sind nicht im Angebot. Hier gibt es bereits andere Verfahren die besser passen. Allerdings experimentire ich bei meinen RTs mit den Regelparametern und will diese dann generell setzen. Alle RTs (bei mir) sollen die gleiche Regelung haben. Ich nutze 3 Templates für meine RTs&lt;br /&gt;
* &#039;&#039;&#039;HeatDefDev&#039;&#039;&#039;: Das Device des RT wird auf Standartwerte gesetzt. Hier nutze ich einen Parameter um die Tasten zu sperren. Dies brauche ich nicht bei allen RTs sondern nur bei denen, welche ich mit einem TC gepeert habe. Hier ist eine Lokale Änderung am TC vorzunehmen. &lt;br /&gt;
* &#039;&#039;&#039;HeatDefault&#039;&#039;&#039;:Die Standart-Regelung. Auch hier habe ich Parameter vorgesehen. Die Devices sind identisch... bis auf die Boostzeit und die maximals Ventilöffnung. Je nach Hk begrenze ich ValveMax - hängt von den baulichen Gegebenheiten ab. Boost nutze ich im Bad zum entfeuchten.&lt;br /&gt;
* &#039;&#039;&#039;HeatRemote&#039;&#039;&#039;: mein &#039;&#039;guteNacht&#039;&#039; Knopf macht auch vor RTs nicht halt. Ich haben an einer Remote einen Button mit allen Lichtern und RTs im Wohnbereich gekoppelt. Beim Drücken wird das Licht abgeschaltet und dieHeizung gedrosselt - bspw wenn ich als letzter ins Bett gehe. Daher brauche ich einen Parameter &#039;&#039;Temperatur&#039;&#039; um das induviduell je RT einzustellen. &lt;br /&gt;
  set hm templateDef HeatDefDev BtnLock &amp;quot;Default RT Device register&amp;quot; globalBtnLock:off localResDis:off modusBtnLock:off backOnTime:10 cyclicInfoMsg:on lowBatLimitRT:2.1 burstRx:on cyclicInfoMsgDis:0 btnLock:p0&lt;br /&gt;
  set hm templateDef HeatDefault boost:valveMax &amp;quot;myDefault RT settings, enter boostTime and valveMax&amp;quot; regAdaptive:offDeter reguIntI:20 nightTemp:17 tempOffset:0.0K dayTemp:21 reguIntPstart:5 reguExtI:20 showWeekday:off reguExtP:25 reguIntP:25 tempMax:30.5 tempMin:4.5 valveMaxPos:p1 valveOffsetRt:0 modePrioManu:all daylightSaveTime:on boostPos:30 decalcWeekday:Sat showInfo:time decalcTime:11:00 btnNoBckLight:off reguExtPstart:5 noMinMax4Manu:off modePrioParty:all valveErrPos:15 boostPeriod:p0&lt;br /&gt;
  set hm templateDef HeatRemote temp &amp;quot;heatRemote set temperature&amp;quot; CtrlRc:autoAndTemp TempRC:p0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In der Übersicht für 2 RTs ergibt ein get hm templateUsg&lt;br /&gt;
  haEss               |0              |HeatDefDev|BtnLock:off &lt;br /&gt;
  haEss_Clima         |0              |HeatDefault|boost:5 valveMax:15 &lt;br /&gt;
  haEss_remote        |FB8_1:short    |HeatRemote|temp:13 &lt;br /&gt;
  haEss_remote        |FB8_5:long     |HeatRemote|temp:13 &lt;br /&gt;
  haEss_remote        |FB8_5:short    |HeatRemote|temp:19 &lt;br /&gt;
  haLnge              |0              |HeatDefDev|BtnLock:off &lt;br /&gt;
  haLnge_Clima        |0              |HeatDefault|boost:5 valveMax:15 &lt;br /&gt;
  haLnge_remote       |FB8_1:short    |HeatRemote|temp:13 &lt;br /&gt;
  haLnge_remote       |FB8_5:long     |HeatRemote|temp:13 &lt;br /&gt;
  haLnge_remote       |FB8_5:short    |HeatRemote|temp:19 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMinfo_Protokoll&amp;diff=24315</id>
		<title>HMinfo Protokoll</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMinfo_Protokoll&amp;diff=24315"/>
		<updated>2018-01-04T20:13:25Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=HM Protokollereignisse kontrollieren&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMinfo&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMinfo.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Homematic Geräte mit Funkprotokoll haben Eigenheiten welche man verstehen und überwachen muss, so man sein System unter Konrolle haben will. &lt;br /&gt;
HMInfo ist ein Modul welches Methoden zu Verfügung stellt, damit umzugehen. &lt;br /&gt;
Behandelt wird hier ausschliesslich die Homematic Funkprotokoll. &lt;br /&gt;
&lt;br /&gt;
=Das Protokoll=&lt;br /&gt;
Das Protokoll beruht in der Regel auf einem Handshake Verfahren. Nachrichten müssen von Empfänger quittert werden. Um mit einem Device kommunizieren zu können muss es allerdings empfangsbereit sein. Man muss die Devicetypen daher unterscheiden&lt;br /&gt;
==Kommunikationstypen==&lt;br /&gt;
Homematic bietet unterschiedliche Devices, teils batteriebetrieben. Die Energieversorgung ist der wesentliche Grund unterschiedliche Typen zu etablieren. Sollte ein batteriebetriebenes Device kontinuierlich auf Empfang sein senkt das die Lebensdauer der Batterie erheblich. Somit unterscheidet man&lt;br /&gt;
* &#039;&#039;&#039;[[Config]]&#039;&#039;&#039;:Dieser Modus wird von [[allen]] Devices unterstützt. Hierbei wird das Device durch drücken einer Taste (typisch einer separaten, versteckten Taste) in den Mode versetzt. Die Taste wird gelegentlich auch Anlerntaste genannt. Das Device sendet hierbei eine Konfigmessage und bleibt einige Sekunden auf Empfang. Ein anderes Device hat nun die Chance mit dem Device zu kommunizieren.&lt;br /&gt;
:Dieser Mode wird gerne zum Pairen genutzt. &lt;br /&gt;
:Die FHEM Zentrale erkennt die Message und startet die Abarbeitung eventuell anhängiger Messages&lt;br /&gt;
* &#039;&#039;&#039;[[normal]]&#039;&#039;&#039;:Typischerweise wird dieser Mode von allen Devices mit permanenter Stromversorgung unterstützt. Das Device ist kontinuierlich auf Empfang. Config wird von diesen Devices typisch nur zum pairen genutzt&lt;br /&gt;
* &#039;&#039;&#039;[[wakeup]]&#039;&#039;&#039;:Batteriebetriebene Devices welche regelmäßig senden stellen gerne diesen Modus bereit. Einige Devices welche regelmäßig senden (Thermostate oder Fühler) bleiben nach senden der zyklischen Nachricht kurz auf Empfang. FHEM erkennt dies und sendet gegebenenfalls anhängige Nachrichten und Abfragen. &lt;br /&gt;
* &#039;&#039;&#039;[[lazyConf]]&#039;&#039;&#039;:Einige modernere Devices, betteriebetrieben und unregemäßig sendent, stellen einen trägen Config mode bereit. Hierbei bleibt das Device auf Empfang, wenn dies einen Trigger gesendet hat. &lt;br /&gt;
:Beispiel ist eine Fernbedienung welche nach drücken eines Buttons den Trigger sendet und dann kurz auf weitere Nachrichten wartet. Auch einige Bewegungsmelder unterstützen dies. Hier muss man also einen Trigger auslösen (Bewegung). Das Device reagiert nicht nach dem Senden der zyklischen Nachrichten.&lt;br /&gt;
:Erfahrungsgemäß funktioniert dies allerdings nur, wenn das Device den Trigger an die Zentrale sendet. Es ist also ratsam, alle Kanäle (jeden einzeln) mit einem Kanal der Zentrale zu peeren. Es biete sich an, einen virtuellen Button der Zentrale zu nutzen, welche man mit allen Kanälen aller LazyConfig Devices peert.&lt;br /&gt;
* &#039;&#039;&#039;[[burst]]&#039;&#039;&#039;:Burst ist ein Verfahren, schlafende Devices aufzuwecken. Einige sind im Dämmerschlaf und können durch einen Burst aufgeweckt werden. Burst ist ein Kommandosequenz welche der Initiator senden muss. Diese ist aufwändig, verbraucht einiges an Funkperformance (1% Regel) und weckt [[alle]] Burst Devices gleichzeitig auf. Als Daumenregel kann ein Device in einer Stunde 100 Bursts senden bevor die 1% Regel zuschlägt. &lt;br /&gt;
:SD (Rauchdetektoren) verwenden tyisch burst. Sie müssen empfangsbereit sein, laufen mit Batterie und müssen demnach Sparsam sein. &lt;br /&gt;
* &#039;&#039;&#039;[[burstCond]]&#039;&#039;&#039;:ist eine Variante des Burst. Der Burstmode kann bei ihnen freigeschaltet werden. Beispielsweise RT (Heizungsthermosrate) nutzen diesen Mode. Ein RT sendet regelmäßig seinen Status - und hierbei kann man über wakeup mit dem Device alle 3min kommunizieren. Nun muss ein RT aber auf Fensterkontakte reagieren können. Diese senden Asynchron. Man muss also sicherstellen, dass der Fensterkontakt einen Burst sendet und der RT auf Burst reagiert. &lt;br /&gt;
:Conditional Burst wird in einem Register freigeschaltet. &lt;br /&gt;
:Devices mit CondBurst stellen ein Kommando BurstXmit bereit. Hierbei wird von FHEM ein Burst gesendet und ene eventuell anstehende Kommunikation wird durhgeführt. &lt;br /&gt;
:BurstXmit sollte nur bei Bedarf, beim Configurieren, genutzt werden. Typisch sollte man auf das normale erwachen des Devices warten um die Kommunikation nicht zu belasten. &lt;br /&gt;
:In einem Sender (Fensterkontakt) Muss &amp;quot;peerNeedsBurst&amp;quot; einegeschaltet werden, wenn dieses mit einem Burst-Device gepeert ist. &lt;br /&gt;
===HMinfo Kommandos zum Devicetyp===&lt;br /&gt;
Um nun festzustellen, welchen Devicetyp man vorliegen hat kann man über das Attribut model seines Device in HMinfo klären&lt;br /&gt;
  get hm models&lt;br /&gt;
  get hm models -f &amp;lt;regexp&amp;gt;&lt;br /&gt;
  get hm models -f SD&lt;br /&gt;
==FHEM Kommunikation==&lt;br /&gt;
FHEM kennt alle Kommunikationstypen und behandelt diese entsprechend. Zu beachten ist, dass ein HM Gerät aus mehreren Entities besteht: Ein Device und ein oder mehrere Kanäle. Man kann mit den Kanälen nicht direkt kommunizieren. Die Kommunikation geht immer über das Device. So ist es in FHEM auch organisiert. Löst man ein Kommando für einen Kanal aus wir dies in die Abarbeitungsliste der Device gestellt. Je nach Komminukationstyp arbeitet FHEM die Liste schnellstmöglch ab. &amp;lt;br&amp;gt;&lt;br /&gt;
Hierbei ist zu beachten, dass an die Devices über ein oder mehrere IOs gesendet wird. Auch hier wird wieder der Reihe nach vorgegangen, ein Device nach dem anderen. &amp;lt;br&amp;gt;&lt;br /&gt;
Wir haben also gelernt, dass Kommandos, welche FHEM senden will, in den Kommando-Queues der Devices abgelegt werden. Will nun sehen, ob schon alles erledigt ist, oder ob Fehler aufgetreten sind, muss man den Status der Kommando-queue lesen. Dieser wird in den &#039;&#039;&#039;Internals&#039;&#039;&#039; welche mit &#039;&#039;&#039;[[prot]]&#039;&#039;&#039; (Protokol) beginnend ermittelt.&lt;br /&gt;
*&#039;&#039;&#039;protState&#039;&#039;&#039;:Der gesamt-Zustand der Queue. &lt;br /&gt;
**[[CMDs_done]]: Alle Kommandos übertragen, es sind bei [[der letzten]] Übertragung keine Fehler aufgetreten&lt;br /&gt;
**[[CMDs_done_Errors:&amp;lt;no&amp;gt;]]: Alle Kommandos übertragen, es sind bei [[der letzten]] Fehler aufgetreten&lt;br /&gt;
**[[CMDs_pending]]: Es stehen Kommandos zur Übertragung an. Es wird auf die Möglichkeit der Übertragung gewartet. Bspw. auf das Aufwachen eine wakeup Devices.&lt;br /&gt;
**[[CMDs_processing...]]: Die Kommandos aus der Queue werden gerade abgearbeitet. Dies kann je nach Device und Menge auch etwas dauern. &lt;br /&gt;
*&#039;&#039;&#039;protLastRcv&#039;&#039;&#039;: Zeitpunkt der letzten empfangenen Nachricht dieses Device&lt;br /&gt;
*&#039;&#039;&#039;protSnd&#039;&#039;&#039;: Zählt die gesenderen Nachrichten und zeigt den letzten Sendezetpunkt an. &lt;br /&gt;
*&#039;&#039;&#039;protCmdPend&#039;&#039;&#039;: Anzahl der in der Kommando-Queue wartenden Nachrichten&lt;br /&gt;
*&#039;&#039;&#039;protResnd&#039;&#039;&#039;: Anzahl der (erfolgreich) wiederholten Nachrichten &lt;br /&gt;
*&#039;&#039;&#039;protCmdDel&#039;&#039;&#039;: Anzahl der auf Grund von Übertragungsproblemen gelöchten Nachrichten&lt;br /&gt;
*&#039;&#039;&#039;protResndFail&#039;&#039;&#039;: Anzahl der Wiederholungen welche nicht erfolgreich abgschlossen werden konnten&lt;br /&gt;
*&#039;&#039;&#039;protNack&#039;&#039;&#039;: Anzahl der negativen Acknowledges, welche vom Devices empfangen wurden. &lt;br /&gt;
*&#039;&#039;&#039;protIOerr&#039;&#039;&#039;: Anzahl der Fehler, IO bedingt.&lt;br /&gt;
===HMinfo Support zu Protokoll Ereignissen===&lt;br /&gt;
Da nun einiges kontinuierlich passiert und die Anzahl der Devices typisch steigt bedarf es eine Übersicht, den Zustand des Systems zu überwachen:&lt;br /&gt;
  get hm protoEvents&lt;br /&gt;
zeigt eine Tabelle aller Devices, deren Zustand der Kommando-Queue und eine Statitik der Übertragungen. Nach dem &#039;#&#039; sollten keine Zähler stehen. Die dortigen bedeuten, dass einige Kommandos gelöscht wurden. &lt;br /&gt;
Im Nachspann stehen Informationen über weitere Queues con CUL_HM. So bspw devices bei welchen FHEM die Register noch lesen will (autoReadReg) falls dies über ein entsprechendes Attribut eingestellt wurde. &amp;lt;br&amp;gt;&lt;br /&gt;
Will man aufräumen kann man &lt;br /&gt;
  set hm clearG msgEvents # löscht alle Zähler und [[leert die Kommando-Queue]] &#039;&#039;&#039;aller&#039;&#039;&#039; Devices&lt;br /&gt;
  set hm clearG msgErrors # löscht alle Zähler der Devices welche Fehler anzeigen.&lt;br /&gt;
Ein Löschen ist gelegentlich sinnvoll, da Fehler kontinuierlch akkumuliert werden. Wenn man die Fehler nun erfasst hat kann man diese zurücksetzen um neu auftretende besser zu erkennen. &lt;br /&gt;
==Kommunikation Timing==&lt;br /&gt;
Die Kommunikation setzt ein straffes Timing der Nachrichtenübermittlung voraus. Eine Nachricht muss in einem Zeitfenster von 100ms-250ms nach senden beantwortet werden. Aufgrund der Natur von FHEM mit IOs welche über unzureichende Betriebssysteme angeschlossen werden  kann das Timing nur schwer gewährleistet werden. Verzogerungen durch LAN oder USB müssen berechnet werden&lt;br /&gt;
*HM-IOs: IO Devices von eq3 stellen eine Zeitstempel bereit welcher zur Kalkulation der Verzögerung genutzt werden kann. Das funktioniert in der Regel problemlos&lt;br /&gt;
*CUL: Da die CUL keinen Zeitstempel zu Verfügung stellt ist sie für HM Kommunikation nicht zu brauchen. Siehe TSCUL&lt;br /&gt;
*TSCUL: Durch einen FW Update kann eine CUL einen Zeitstempel generieren und schicken welcher diese dann &lt;br /&gt;
einem HM-IO gleichwertig macht. &lt;br /&gt;
Das Timing kann aber auch durch Verzögerungen auf den Rechner, innerhalb oder ausserhalb von FHEM gestört werden, wenn langsame oder hochpriore Tasks den Ablauf stören. apptime kann genutzt werden um verzögerungen im System aufzudecken.&lt;br /&gt;
  pairen: ist eine besondere Herausforderung. Hier müssen ggf. erst entities in FHEM angelegt werden, bevor geantwortet werden kann. Es ist nicht sinnvoll nach einem ersten pairing Versuch alle Entites aus FHEM wieder zu löschen. Sollte das pairen nicht funktioniert haben kann man die Kommando Queue leeren (set hm clearG msgEvents) und dann einen neuen Versuch starten. &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMinfo_Protokoll&amp;diff=24314</id>
		<title>HMinfo Protokoll</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMinfo_Protokoll&amp;diff=24314"/>
		<updated>2018-01-04T20:12:40Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=HM Protokollereignisse kontrollieren&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMinfo&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMinfo.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Homematic Geräte mit Funkprotokoll haben Eigenheiten welche man verstehen und überwachen muss, so man sein System unter Konrolle haben will. &lt;br /&gt;
HMInfo ist ein Modul welches Methoden zu Verfügung stellt, damit umzugehen. &lt;br /&gt;
Behandelt wird hier ausschliesslich die Homematic Funkprotokoll. &lt;br /&gt;
&lt;br /&gt;
=Das Protokoll=&lt;br /&gt;
Das Protokoll beruht in der Regel auf einem Handshake Verfahren. Nachrichten müssen von Empfänger quittert werden. Um mit einem Device kommunizieren zu können muss es allerdings empfangsbereit sein. Man muss die Devicetypen daher unterscheiden&lt;br /&gt;
==Kommunikationstypen==&lt;br /&gt;
Homematic bietet unterschiedliche Devices, teils batteriebetrieben. Die Energieversorgung ist der wesentliche Grund unterschiedliche Typen zu etablieren. Sollte ein batteriebetriebenes Device kontinuierlich auf Empfang sein senkt das die Lebensdauer der Batterie erheblich. Somit unterscheidet man&lt;br /&gt;
* &#039;&#039;&#039;[[Config]]&#039;&#039;&#039;:Dieser Modus wird von [[allen]] Devices unterstützt. Hierbei wird das Device durch drücken einer Taste (typisch einer separaten, versteckten Taste) in den Mode versetzt. Die Taste wird gelegentlich auch Anlerntaste genannt. Das Device sendet hierbei eine Konfigmessage und bleibt einige Sekunden auf Empfang. Ein anderes Device hat nun die Chance mit dem Device zu kommunizieren.&lt;br /&gt;
:Dieser Mode wird gerne zum Pairen genutzt. &lt;br /&gt;
:Die FHEM Zentrale erkennt die Message und startet die Abarbeitung eventuell anhängiger Messages&lt;br /&gt;
* &#039;&#039;&#039;[[normal]]&#039;&#039;&#039;:Typischerweise wird dieser Mode von allen Devices mit permanenter Stromversorgung unterstützt. Das Device ist kontinuierlich auf Empfang. Config wird von diesen Devices typisch nur zum pairen genutzt&lt;br /&gt;
* &#039;&#039;&#039;[[wakeup]]&#039;&#039;&#039;:Batteriebetriebene Devices welche regelmäßig senden stellen gerne diesen Modus bereit. Einige Devices welche regelmäßig senden (Thermostate oder Fühler) bleiben nach senden der zyklischen Nachricht kurz auf Empfang. FHEM erkennt dies und sendet gegebenenfalls anhängige Nachrichten und Abfragen. &lt;br /&gt;
* &#039;&#039;&#039;[[lazyConf]]&#039;&#039;&#039;:Einige modernere Devices, betteriebetrieben und unregemäßig sendent, stellen einen trägen Config mode bereit. Hierbei bleibt das Device auf Empfang, wenn dies einen Trigger gesendet hat. &lt;br /&gt;
:Beispiel ist eine Fernbedienung welche nach drücken eines Buttons den Trigger sendet und dann kurz auf weitere Nachrichten wartet. Auch einige Bewegungsmelder unterstützen dies. Hier muss man also einen Trigger auslösen (Bewegung). Das Device reagiert nicht nach dem Senden der zyklischen Nachrichten.&lt;br /&gt;
:Erfahrungsgemäß funktioniert dies allerdings nur, wenn das Device den Trigger an die Zentrale sendet. Es ist also ratsam, alle Kanäle (jeden einzeln) mit einem Kanal der Zentrale zu peeren. Es biete sich an, einen virtuellen Button der Zentrale zu nutzen, welche man mit allen Kanälen aller LazyConfig Devices peert.&lt;br /&gt;
* &#039;&#039;&#039;[[burst]]&#039;&#039;&#039;:Burst ist ein Verfahren, schlafende Devices aufzuwecken. Einige sind im Dämmerschlaf und können durch einen Burst aufgeweckt werden. Burst ist ein Kommandosequenz welche der Initiator senden muss. Diese ist aufwändig, verbraucht einiges an Funkperformance (1% Regel) und weckt [[alle]] Burst Devices gleichzeitig auf. Als Daumenregel kann ein Device in einer Stunde 100 Bursts senden bevor die 1% Regel zuschlägt. &lt;br /&gt;
:SD (Rauchdetektoren) verwenden tyisch burst. Sie müssen empfangsbereit sein, laufen mit Batterie und müssen demnach Sparsam sein. &lt;br /&gt;
* &#039;&#039;&#039;[[burstCond]]&#039;&#039;&#039;:ist eine Variante des Burst. Der Burstmode kann bei ihnen freigeschaltet werden. Beispielsweise RT (Heizungsthermosrate) nutzen diesen Mode. Ein RT sendet regelmäßig seinen Status - und hierbei kann man über wakeup mit dem Device alle 3min kommunizieren. Nun muss ein RT aber auf Fensterkontakte reagieren können. Diese senden Asynchron. Man muss also sicherstellen, dass der Fensterkontakt einen Burst sendet und der RT auf Burst reagiert. &lt;br /&gt;
:Conditional Burst wird in einem Register freigeschaltet. &lt;br /&gt;
:Devices mit CondBurst stellen ein Kommando BurstXmit bereit. Hierbei wird von FHEM ein Burst gesendet und ene eventuell anstehende Kommunikation wird durhgeführt. &lt;br /&gt;
:BurstXmit sollte nur bei Bedarf, beim Configurieren, genutzt werden. Typisch sollte man auf das normale erwachen des Devices warten um die Kommunikation nicht zu belasten. &lt;br /&gt;
:In einem Sender (Fensterkontakt) Muss &amp;quot;peerNeedsBurst&amp;quot; einegeschaltet werden, wenn dieses mit einem Burst-Device gepeert ist. &lt;br /&gt;
===HMinfo Kommandos zum Devicetyp===&lt;br /&gt;
Um nun festzustellen, welchen Devicetyp man vorliegen hat kann man über das Attribut model seines Device in HMinfo klären&lt;br /&gt;
  get hm models&lt;br /&gt;
  get hm models -f &amp;lt;regexp&amp;gt;&lt;br /&gt;
  get hm models -f SD&lt;br /&gt;
==FHEM Kommunikation==&lt;br /&gt;
FHEM kennt alle Kommunikationstypen und behandelt diese entsprechend. Zu beachten ist, dass ein HM Gerät aus mehreren Entities besteht: Ein Device und ein oder mehrere Kanäle. Man kann mit den Kanälen nicht direkt kommunizieren. Die Kommunikation geht immer über das Device. So ist es in FHEM auch organisiert. Löst man ein Kommando für einen Kanal aus wir dies in die Abarbeitungsliste der Device gestellt. Je nach Komminukationstyp arbeitet FHEM die Liste schnellstmöglch ab. &amp;lt;br&amp;gt;&lt;br /&gt;
Hierbei ist zu beachten, dass an die Devices über ein oder mehrere IOs gesendet wird. Auch hier wird wieder der Reihe nach vorgegangen, ein Device nach dem anderen. &amp;lt;br&amp;gt;&lt;br /&gt;
Wir haben also gelernt, dass Kommandos, welche FHEM senden will, in den Kommando-Queues der Devices abgelegt werden. Will nun sehen, ob schon alles erledigt ist, oder ob Fehler aufgetreten sind, muss man den Status der Kommando-queue lesen. Dieser wird in den &#039;&#039;&#039;Internals&#039;&#039;&#039; welche mit &#039;&#039;&#039;[[prot]]&#039;&#039;&#039; (Protokol) beginnend ermittelt.&lt;br /&gt;
*&#039;&#039;&#039;protState&#039;&#039;&#039;:Der gesamt-Zustand der Queue. &lt;br /&gt;
**[[CMDs_done]]: Alle Kommandos übertragen, es sind bei [[der letzten]] Übertragung keine Fehler aufgetreten&lt;br /&gt;
**[[CMDs_done_Errors:&amp;lt;no&amp;gt;]]: Alle Kommandos übertragen, es sind bei [[der letzten]] Fehler aufgetreten&lt;br /&gt;
**[[CMDs_pending]]: Es stehen Kommandos zur Übertragung an. Es wird auf die Möglichkeit der Übertragung gewartet. Bspw. auf das Aufwachen eine wakeup Devices.&lt;br /&gt;
**[[CMDs_processing...]]: Die Kommandos aus der Queue werden gerade abgearbeitet. Dies kann je nach Device und Menge auch etwas dauern. &lt;br /&gt;
*&#039;&#039;&#039;protLastRcv&#039;&#039;&#039;: Zeitpunkt der letzten empfangenen Nachricht dieses Device&lt;br /&gt;
*&#039;&#039;&#039;protSnd&#039;&#039;&#039;: Zählt die gesenderen Nachrichten und zeigt den letzten Sendezetpunkt an. &lt;br /&gt;
*&#039;&#039;&#039;protCmdPend&#039;&#039;&#039;: Anzahl der in der Kommando-Queue wartenden Nachrichten&lt;br /&gt;
*&#039;&#039;&#039;protResnd&#039;&#039;&#039;: Anzahl der (erfolgreich) wiederholten Nachrichten &lt;br /&gt;
*&#039;&#039;&#039;protCmdDel&#039;&#039;&#039;: Anzahl der auf Grund von Übertragungsproblemen gelöchten Nachrichten&lt;br /&gt;
*&#039;&#039;&#039;protResndFail&#039;&#039;&#039;: Anzahl der Wiederholungen welche nicht erfolgreich abgschlossen werden konnten&lt;br /&gt;
*&#039;&#039;&#039;protNack&#039;&#039;&#039;: Anzahl der negativen Acknowledges, welche vom Devices empfangen wurden. &lt;br /&gt;
*&#039;&#039;&#039;protIOerr&#039;&#039;&#039;: Anzahl der Fehler, IO bedingt.&lt;br /&gt;
===HMinfo Support zu Protokoll Ereignissen===&lt;br /&gt;
Da nun einiges kontinuierlich passiert und die Anzahl der Devices typisch steigt bedarf es eine Übersicht, den Zustand des Systems zu überwachen:&lt;br /&gt;
  get hm protoEvents&lt;br /&gt;
zeigt eine Tabelle aller Devices, deren Zustand der Kommando-Queue und eine Statitik der Übertragungen. Nach dem &#039;#&#039; sollten keine Zähler stehen. Die dortigen bedeuten, dass einige Kommandos gelöscht wurden. &lt;br /&gt;
Im Nachspann stehen Informationen über weitere Queues con CUL_HM. So bspw devices bei welchen FHEM die Register noch lesen will (autoReadReg) falls dies über ein entsprechendes Attribut eingestellt wurde. &amp;lt;br&amp;gt;&lt;br /&gt;
Will man aufräumen kann man &lt;br /&gt;
  set hm clearG msgEvents # löscht alle Zähler und [[leert die Kommando-Queue]] &#039;&#039;&#039;aller&#039;&#039;&#039; Devices&lt;br /&gt;
  set hm clearG msgErrors # löscht alle Zähler der Devices welche Fehler anzeigen.&lt;br /&gt;
Ein Löschen ist gelegentlich sinnvoll, da Fehler kontinuierlch akkumuliert werden. Wenn man die Fehler nun erfasst hat kann man diese zurücksetzen um neu auftretende besser zu erkennen. &lt;br /&gt;
==Kommunikation Timing==&lt;br /&gt;
Die Kommunikation setzt ein straffes Timing der Nachrichtenübermittlung voraus. Eine Nachricht muss in einem Zeitfenster von 100ms-250ms nach senden beantwortet werden. Aufgrund der Natur von FHEM mit IOs welche über unzureichende Betriebssysteme angeschlossen werden  kann das Timing nur schwer gewährleistet werden. Verzogerungen durch LAN oder USB müssen berechnet werden&lt;br /&gt;
*HM-IOs: IO Devices von eq3 stellen eine Zeitstempel bereit welcher zur Kalkulation der Verzögerung genutzt werden kann. Das funktioniert in der Regel problemlos&lt;br /&gt;
*CUL: Da die CUL keinen Zeitstempel zu verfügung stellt ist sie für HM Kommunikation nicht zu brauchen. Siehe TSCUL&lt;br /&gt;
*TSCUL: Durch einen FW Update kann eine CUL einen Zeitstempel generieren und schicken welcher diese dann &lt;br /&gt;
einem HM-IO gleichwertig macht. &lt;br /&gt;
Das Timing kann aber auch durch Verzögerungen auf den Rechner, innerhalb oder ausserhalb von FHEM gestört werden, wenn langsame oder hochpriore Tasks den Ablauf stören. apptime kann genutzt werden um verzögerungen im System aufzudecken.&lt;br /&gt;
  pairen: ist eine besondere Herausforderung. Hier müssen ggf. erst entities in FHEM angelegt werden, bevor geantwortet werden kann. Es ist nicht sinnvoll nach einem ersten pairing Versuch alle Entites aus FHEM wieder zu löschen. Sollte das pairen nicht funktioniert haben kann man die Kommando Queue leeren (set hm clearG msgEvents) und dann einen neuen Versuch starten. &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMinfo_Protokoll&amp;diff=24312</id>
		<title>HMinfo Protokoll</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMinfo_Protokoll&amp;diff=24312"/>
		<updated>2018-01-04T19:58:58Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=HM Protokollereignisse kontrollieren&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMinfo&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMinfo.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Homematic Geräte mit Funkprotokoll haben Eigenheiten welche man verstehen und überwachen muss, so man sein System unter Konrolle haben will. &lt;br /&gt;
HMInfo ist ein Modul welches Methoden zu Verfügung stellt, damit umzugehen. &lt;br /&gt;
Behandelt wird hier ausschliesslich die Homematic Funkprotokoll. &lt;br /&gt;
&lt;br /&gt;
=Das Protokoll=&lt;br /&gt;
Das Protokoll beruht in der Regel auf einem Handshake Verfahren. Nachrichten müssen von Empfänger quittert werden. Um mit einem Device kommunizieren zu können muss es allerdings empfangsbereit sein. Man muss die Devicetypen daher unterscheiden&lt;br /&gt;
==Kommunikationstypen==&lt;br /&gt;
Homematic bietet unterschiedliche Devices, teils batteriebetrieben. Die Energieversorgung ist der wesentliche Grund unterschiedliche Typen zu etablieren. Sollte ein batteriebetriebenes Device kontinuierlich auf Empfang sein senkt das die Lebensdauer der Batterie erheblich. Somit unterscheidet man&lt;br /&gt;
* &#039;&#039;&#039;[[Config]]&#039;&#039;&#039;:Dieser Modus wird von [[allen]] Devices unterstützt. Hierbei wird das Device durch drücken einer Taste (typisch einer separaten, versteckten Taste) in den Mode versetzt. Die Taste wird gelegentlich auch Anlerntaste genannt. Das Device sendet hierbei eine Konfigmessage und bleibt einige Sekunden auf Empfang. Ein anderes Device hat nun die Chance mit dem Device zu kommunizieren.&lt;br /&gt;
:Dieser Mode wird gerne zum Pairen genutzt. &lt;br /&gt;
:Die FHEM Zentrale erkennt die Message und startet die Abarbeitung eventuell anhängiger Messages&lt;br /&gt;
* &#039;&#039;&#039;[[normal]]&#039;&#039;&#039;:Typischerweise wird dieser Mode von allen Devices mit permanenter Stromversorgung unterstützt. Das Device ist kontinuierlich auf Empfang. Config wird von diesen Devices typisch nur zum pairen genutzt&lt;br /&gt;
* &#039;&#039;&#039;[[wakeup]]&#039;&#039;&#039;:Batteriebetriebene Devices welche regelmäßig senden stellen gerne diesen Modus bereit. Einige Devices welche regelmäßig senden (Thermostate oder Fühler) bleiben nach senden der zyklischen Nachricht kurz auf Empfang. FHEM erkennt dies und sendet gegebenenfalls anhängige Nachrichten und Abfragen. &lt;br /&gt;
* &#039;&#039;&#039;[[lazyConf]]&#039;&#039;&#039;:Einige modernere Devices, betteriebetrieben und unregemäßig sendent, stellen einen trägen Config mode bereit. Hierbei bleibt das Device auf Empfang, wenn dies einen Trigger gesendet hat. &lt;br /&gt;
:Beispiel ist eine Fernbedienung welche nach drücken eines Buttons den Trigger sendet und dann kurz auf weitere Nachrichten wartet. Auch einige Bewegungsmelder unterstützen dies. Hier muss man also einen Trigger auslösen (Bewegung). Das Device reagiert nicht nach dem Senden der zyklischen Nachrichten.&lt;br /&gt;
:Erfahrungsgemäß funktioniert dies allerdings nur, wenn das Device den Trigger an die Zentrale sendet. Es ist also ratsam, alle Kanäle (jeden einzeln) mit einem Kanal der Zentrale zu peeren. Es biete sich an, einen virtuellen Button der Zentrale zu nutzen, welche man mit allen Kanälen aller LazyConfig Devices peert.&lt;br /&gt;
* &#039;&#039;&#039;[[burst]]&#039;&#039;&#039;:Burst ist ein Verfahren, schlafende Devices aufzuwecken. Einige sind im Dämmerschlaf und können durch einen Burst aufgeweckt werden. Burst ist ein Kommandosequenz welche der Initiator senden muss. Diese ist aufwändig, verbraucht einiges an Funkperformance (1% Regel) und weckt [[alle]] Burst Devices gleichzeitig auf. Als Daumenregel kann ein Device in einer Stunde 100 Bursts senden bevor die 1% Regel zuschlägt. &lt;br /&gt;
:SD (Rauchdetektoren) verwenden tyisch burst. Sie müssen empfangsbereit sein, laufen mit Batterie und müssen demnach Sparsam sein. &lt;br /&gt;
* &#039;&#039;&#039;[[burstCond]]&#039;&#039;&#039;:ist eine Variante des Burst. Der Burstmode kann bei ihnen freigeschaltet werden. Beispielsweise RT (Heizungsthermosrate) nutzen diesen Mode. Ein RT sendet regelmäßig seinen Status - und hierbei kann man über wakeup mit dem Device alle 3min kommunizieren. Nun muss ein RT aber auf Fensterkontakte reagieren können. Diese senden Asynchron. Man muss also sicherstellen, dass der Fensterkontakt einen Burst sendet und der RT auf Burst reagiert. &lt;br /&gt;
:Conditional Burst wird in einem Register freigeschaltet. &lt;br /&gt;
:Devices mit CondBurst stellen ein Kommando BurstXmit bereit. Hierbei wird von FHEM ein Burst gesendet und ene eventuell anstehende Kommunikation wird durhgeführt. &lt;br /&gt;
:BurstXmit sollte nur bei Bedarf, beim Configurieren, genutzt werden. Typisch sollte man auf das normale erwachen des Devices warten um die Kommunikation nicht zu belasten. &lt;br /&gt;
:In einem Sender (Fensterkontakt) Muss &amp;quot;peerNeedsBurst&amp;quot; einegeschaltet werden, wenn dieses mit einem Burst-Device gepeert ist. &lt;br /&gt;
===HMinfo Kommandos zum Devicetyp===&lt;br /&gt;
Um nun festzustellen, welchen Devicetyp man vorliegen hat kann man über das Attribut model seines Device in HMinfo klären&lt;br /&gt;
  get hm models&lt;br /&gt;
  get hm models -f &amp;lt;regexp&amp;gt;&lt;br /&gt;
  get hm models -f SD&lt;br /&gt;
==FHEM Kommunikation==&lt;br /&gt;
FHEM kennt alle Kommunikationstypen und behandelt diese entsprechend. Zu beachten ist, dass ein HM Gerät aus mehreren Entities besteht: Ein Device und ein oder mehrere Kanäle. Man kann mit den Kanälen nicht direkt kommunizieren. Die Kommunikation geht immer über das Device. So ist es in FHEM auch organisiert. Löst man ein Kommando für einen Kanal aus wir dies in die Abarbeitungsliste der Device gestellt. Je nach Komminukationstyp arbeitet FHEM die Liste schnellstmöglch ab. &amp;lt;br&amp;gt;&lt;br /&gt;
Hierbei ist zu beachten, dass an die Devices über ein oder mehrere IOs gesendet wird. Auch hier wird wieder der Reihe nach vorgegangen, ein Device nach dem anderen. &amp;lt;br&amp;gt;&lt;br /&gt;
Wir haben also gelernt, dass Kommandos, welche FHEM senden will, in den Kommando-Queues der Devices abgelegt werden. Will nun sehen, ob schon alles erledigt ist, oder ob Fehler aufgetreten sind, muss man den Status der Kommando-queue lesen. Dieser wird in den &#039;&#039;&#039;Internals&#039;&#039;&#039; welche mit &#039;&#039;&#039;[[prot]]&#039;&#039;&#039; (Protokol) beginnend ermittelt.&lt;br /&gt;
*&#039;&#039;&#039;protState&#039;&#039;&#039;:Der gesamt-Zustand der Queue. &lt;br /&gt;
**[[CMDs_done]]: Alle Kommandos übertragen, es sind bei [[der letzten]] Übertragung keine Fehler aufgetreten&lt;br /&gt;
**[[CMDs_done_Errors:&amp;lt;no&amp;gt;]]: Alle Kommandos übertragen, es sind bei [[der letzten]] Fehler aufgetreten&lt;br /&gt;
**[[CMDs_pending]]: Es stehen Kommandos zur Übertragung an. Es wird auf die Möglichkeit der Übertragung gewartet. Bspw. auf das Aufwachen eine wakeup Devices.&lt;br /&gt;
**[[CMDs_processing...]]: Die Kommandos aus der Queue werden gerade abgearbeitet. Dies kann je nach Device und Menge auch etwas dauern. &lt;br /&gt;
*&#039;&#039;&#039;protLastRcv&#039;&#039;&#039;: Zeitpunkt der letzten empfangenen Nachricht dieses Device&lt;br /&gt;
*&#039;&#039;&#039;protSnd&#039;&#039;&#039;: Zählt die gesenderen Nachrichten und zeigt den letzten Sendezetpunkt an. &lt;br /&gt;
*&#039;&#039;&#039;protCmdPend&#039;&#039;&#039;: Anzahl der in der Kommando-Queue wartenden Nachrichten&lt;br /&gt;
*&#039;&#039;&#039;protResnd&#039;&#039;&#039;: Anzahl der (erfolgreich) wiederholten Nachrichten &lt;br /&gt;
*&#039;&#039;&#039;protCmdDel&#039;&#039;&#039;: Anzahl der auf Grund von Übertragungsproblemen gelöchten Nachrichten&lt;br /&gt;
*&#039;&#039;&#039;protResndFail&#039;&#039;&#039;: Anzahl der Wiederholungen welche nicht erfolgreich abgschlossen werden konnten&lt;br /&gt;
*&#039;&#039;&#039;protNack&#039;&#039;&#039;: Anzahl der negativen Acknowledges, welche vom Devices empfangen wurden. &lt;br /&gt;
*&#039;&#039;&#039;protIOerr&#039;&#039;&#039;: Anzahl der Fehler, IO bedingt.&lt;br /&gt;
===HMinfo Support zu Protokoll Ereignissen===&lt;br /&gt;
Da nun einiges kontinuierlich passiert und die Anzahl der Devices typisch steigt bedarf es eine Übersicht, den Zustand des Systems zu überwachen:&lt;br /&gt;
  get hm protoEvents&lt;br /&gt;
zeigt eine Tabelle aller Devices, deren Zustand der Kommando-Queue und eine Statitik der Übertragungen. Nach dem &#039;#&#039; sollten keine Zähler stehen. Die dortigen bedeuten, dass einige Kommandos gelöscht wurden. &lt;br /&gt;
Im Nachspann stehen Informationen über weitere Queues con CUL_HM. So bspw devices bei welchen FHEM die Register noch lesen will (autoReadReg) falls dies über ein entsprechendes Attribut eingestellt wurde. &amp;lt;br&amp;gt;&lt;br /&gt;
Will man aufräumen kann man &lt;br /&gt;
  set hm clearG msgEvents # löscht alle Zähler und [[leert die Kommando-Queue]] &#039;&#039;&#039;aller&#039;&#039;&#039; Devices&lt;br /&gt;
  set hm clearG msgErrors # löscht alle Zähler der Devices welche Fehler anzeigen.&lt;br /&gt;
Ein Löschen ist gelegentlich sinnvoll, da Fehler kontinuierlch akkumuliert werden. Wenn man die Fehler nun erfasst hat kann man diese zurücksetzen um neu auftretende besser zu erkennen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMinfo_Protokoll&amp;diff=24311</id>
		<title>HMinfo Protokoll</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMinfo_Protokoll&amp;diff=24311"/>
		<updated>2018-01-04T19:28:32Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=HM Protokollereignisse kontrollieren&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMinfo&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMinfo.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Homematic Geräte mit Funkprotokoll haben Eigenheiten welche man verstehen und überwachen muss, so man sein System unter Konrolle haben will. &lt;br /&gt;
HMInfo ist ein Modul welches Methoden zu Verfügung stellt, damit umzugehen. &lt;br /&gt;
Behandelt wird hier ausschliesslich die Homematic Funkprotokoll. &lt;br /&gt;
&lt;br /&gt;
=Das Protokoll=&lt;br /&gt;
Das Protokoll beruht in der Regel auf einem Handshake Verfahren. Nachrichten müssen von Empfänger quittert werden. Um mit einem Device kommunizieren zu können muss es allerdings empfangsbereit sein. Man muss die Devicetypen daher unterscheiden&lt;br /&gt;
==Kommunikationstypen==&lt;br /&gt;
Homematic bietet unterschiedliche Devices, teils batteriebetrieben. Die Energieversorgung ist der wesentliche Grund unterschiedliche Typen zu etablieren. Sollte ein batteriebetriebenes Device kontinuierlich auf Empfang sein senkt das die Lebensdauer der Batterie erheblich. Somit unterscheidet man&lt;br /&gt;
* &#039;&#039;&#039;[[Config]]&#039;&#039;&#039;:Dieser Modus wird von [[allen]] Devices unterstützt. Hierbei wird das Device durch drücken einer Taste (typisch einer separaten, versteckten Taste) in den Mode versetzt. Die Taste wird gelegentlich auch Anlerntaste genannt. Das Device sendet hierbei eine Konfigmessage und bleibt einige Sekunden auf Empfang. Ein anderes Device hat nun die Chance mit dem Device zu kommunizieren.&lt;br /&gt;
:Dieser Mode wird gerne zum Pairen genutzt. &lt;br /&gt;
:Die FHEM Zentrale erkennt die Message und startet die Abarbeitung eventuell anhängiger Messages&lt;br /&gt;
* &#039;&#039;&#039;[[normal]]&#039;&#039;&#039;:Typischerweise wird dieser Mode von allen Devices mit permanenter Stromversorgung unterstützt. Das Device ist kontinuierlich auf Empfang. Config wird von diesen Devices typisch nur zum pairen genutzt&lt;br /&gt;
* &#039;&#039;&#039;[[wakeup]]&#039;&#039;&#039;:Batteriebetriebene Devices welche regelmäßig senden stellen gerne diesen Modus bereit. Einige Devices welche regelmäßig senden (Thermostate oder Fühler) bleiben nach senden der zyklischen Nachricht kurz auf Empfang. FHEM erkennt dies und sendet gegebenenfalls anhängige Nachrichten und Abfragen. &lt;br /&gt;
* &#039;&#039;&#039;[[lazyConf]]&#039;&#039;&#039;:Einige modernere Devices, betteriebetrieben und unregemäßig sendent, stellen einen trägen Config mode bereit. Hierbei bleibt das Device auf Empfang, wenn dies einen Trigger gesendet hat. &lt;br /&gt;
:Beispiel ist eine Fernbedienung welche nach drücken eines Buttons den Trigger sendet und dann kurz auf weitere Nachrichten wartet. Auch einige Bewegungsmelder unterstützen dies. Hier muss man also einen Trigger auslösen (Bewegung). Das Device reagiert nicht nach dem Senden der zyklischen Nachrichten.&lt;br /&gt;
:Erfahrungsgemäß funktioniert dies allerdings nur, wenn das Device den Trigger an die Zentrale sendet. Es ist also ratsam, alle Kanäle (jeden einzeln) mit einem Kanal der Zentrale zu peeren. Es biete sich an, einen virtuellen Button der Zentrale zu nutzen, welche man mit allen Kanälen aller LazyConfig Devices peert.&lt;br /&gt;
* &#039;&#039;&#039;[[burst]]&#039;&#039;&#039;:Burst ist ein Verfahren, schlafende Devices aufzuwecken. Einige sind im Dämmerschlaf und können durch einen Burst aufgeweckt werden. Burst ist ein Kommandosequenz welche der Initiator senden muss. Diese ist aufwändig, verbraucht einiges an Funkperformance (1% Regel) und weckt [[alle]] Burst Devices gleichzeitig auf. Als Daumenregel kann ein Device in einer Stunde 100 Bursts senden bevor die 1% Regel zuschlägt. &lt;br /&gt;
:SD (Rauchdetektoren) verwenden tyisch burst. Sie müssen empfangsbereit sein, laufen mit Batterie und müssen demnach Sparsam sein. &lt;br /&gt;
* &#039;&#039;&#039;[[burstCond]]&#039;&#039;&#039;:ist eine Variante des Burst. Der Burstmode kann bei ihnen freigeschaltet werden. Beispielsweise RT (Heizungsthermosrate) nutzen diesen Mode. Ein RT sendet regelmäßig seinen Status - und hierbei kann man über wakeup mit dem Device alle 3min kommunizieren. Nun muss ein RT aber auf Fensterkontakte reagieren können. Diese senden Asynchron. Man muss also sicherstellen, dass der Fensterkontakt einen Burst sendet und der RT auf Burst reagiert. &lt;br /&gt;
:Conditional Burst wird in einem Register freigeschaltet. &lt;br /&gt;
:Devices mit CondBurst stellen ein Kommando BurstXmit bereit. Hierbei wird von FHEM ein Burst gesendet und ene eventuell anstehende Kommunikation wird durhgeführt. &lt;br /&gt;
:BurstXmit sollte nur bei Bedarf, beim Configurieren, genutzt werden. Typisch sollte man auf das normale erwachen des Devices warten um die Kommunikation nicht zu belasten. &lt;br /&gt;
:In einem Sender (Fensterkontakt) Muss &amp;quot;peerNeedsBurst&amp;quot; einegeschaltet werden, wenn dieses mit einem Burst-Device gepeert ist. &lt;br /&gt;
===HMinfo Kommandos zum Devicetyp===&lt;br /&gt;
Um nun festzustellen, welchen Devicetyp man vorliegen hat kann man über das Attribut model seines Device in HMinfo klären&lt;br /&gt;
  get hm models&lt;br /&gt;
  get hm models -f &amp;lt;regexp&amp;gt;&lt;br /&gt;
  get hm models -f SD&lt;br /&gt;
==FHEM Kommunikation==&lt;br /&gt;
FHEM kennt alle Kommunikationstypen und behandelt diese entsprechend. Zu beachten ist, dass ein HM Gerät aus mehreren Entities besteht: Ein Device und ein oder mehrere Kanäle. Man kann mit den Kanälen nicht direkt kommunizieren. Die Kommunikation geht immer über das Device. So ist es in FHEM auch organisiert. Löst man ein Kommando für einen Kanal aus wir dies in die Abarbeitungsliste der Device gestellt. Je nach Komminukationstyp arbeitet FHEM die Liste schnellstmöglch ab. &amp;lt;br&amp;gt;&lt;br /&gt;
Hierbei ist zu beachten, dass an die Devices über ein oder mehrere IOs gesendet wird. Auch hier wird wieder der Reihe nach vorgegangen, ein Device nach dem anderen. &amp;lt;br&amp;gt;&lt;br /&gt;
Wir haben also gelernt, dass Kommandos, welche FHEM senden will, in den Kommando-Queues der Devices abgelegt werden. Will nun sehen, ob schon alles erledigt ist, oder ob Fehler aufgetreten sind, muss man den Status der Kommando-queue lesen. Dieser wird in den &#039;&#039;&#039;Internals&#039;&#039;&#039; welche mit &#039;&#039;&#039;[[prot]]&#039;&#039;&#039; (Protokol) beginnend ermittelt.&lt;br /&gt;
*&#039;&#039;&#039;protState&#039;&#039;&#039;:Der gesamt-Zustand der Queue. &lt;br /&gt;
**[[CMDs_done]]: Alle Kommandos übertragen, es sind bei [[der letzten]] Übertragung keine Fehler aufgetreten&lt;br /&gt;
**[[CMDs_done_Errors:&amp;lt;no&amp;gt;]]: Alle Kommandos übertragen, es sind bei [[der letzten]] Fehler aufgetreten&lt;br /&gt;
**[[CMDs_pending]]: Es stehen Kommandos zur Übertragung an. Es wird auf die Möglichkeit der Übertragung gewartet. Bspw. auf das Aufwachen eine wakeup Devices.&lt;br /&gt;
**[[CMDs_processing...]]: Die Kommandos aus der Queue werden gerade abgearbeitet. Dies kann je nach Device und Menge auch etwas dauern. &lt;br /&gt;
*&#039;&#039;&#039;protLastRcv&#039;&#039;&#039;: Zeitpunkt der letzten empfangenen Nachricht dieses Device&lt;br /&gt;
*&#039;&#039;&#039;protSnd&#039;&#039;&#039;: Zählt die gesenderen Nachrichten und zeigt den letzten Sendezetpunkt an. &lt;br /&gt;
*&#039;&#039;&#039;protCmdPend&#039;&#039;&#039;: Anzahl der in der Kommando-Queue wartenden Nachrichten&lt;br /&gt;
*&#039;&#039;&#039;protResnd&#039;&#039;&#039;: Anzahl der (erfolgreich) wiederholten Nachrichten &lt;br /&gt;
*&#039;&#039;&#039;protCmdDel&#039;&#039;&#039;: Anzahl der auf Grund von Übertragungsproblemen gelöchten Nachrichten&lt;br /&gt;
*&#039;&#039;&#039;protResndFail&#039;&#039;&#039;: Anzahl der Wiederholungen welche nicht erfolgreich abgschlossen werden konnten&lt;br /&gt;
*&#039;&#039;&#039;protNack&#039;&#039;&#039;: Anzahl der negativen Acknowledges, welche vom Devices empfangen wurden. &lt;br /&gt;
*&#039;&#039;&#039;protIOerr&#039;&#039;&#039;: Anzahl der Fehler, IO bedingt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMinfo_Protokoll&amp;diff=24310</id>
		<title>HMinfo Protokoll</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMinfo_Protokoll&amp;diff=24310"/>
		<updated>2018-01-04T19:09:02Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=HM Protokollereignisse kontrollieren&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMinfo&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMinfo.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Homematic Geräte mit Funkprotokoll haben Eigenheiten welche man verstehen und überwachen muss, so man sein System unter Konrolle haben will. &lt;br /&gt;
HMInfo ist ein Modul welches Methoden zu Verfügung stellt, damit umzugehen. &lt;br /&gt;
Behandelt wird hier ausschliesslich die Homematic Funkprotokoll. &lt;br /&gt;
&lt;br /&gt;
=Das Protokoll=&lt;br /&gt;
Das Protokoll beruht in der Regel auf einem Handshake Verfahren. Nachrichten müssen von Empfänger quittert werden. Um mit einem Device kommunizieren zu können muss es allerdings empfangsbereit sein. Man muss die Devicetypen daher unterscheiden&lt;br /&gt;
==Kommunikationstypen==&lt;br /&gt;
Homematic bietet unterschiedliche Devices, teils batteriebetrieben. Die Energieversorgung ist der wesentliche Grund unterschiedliche Typen zu etablieren. Sollte ein batteriebetriebenes Device kontinuierlich auf Empfang sein senkt das die Lebensdauer der Batterie erheblich. Somit unterscheidet man&lt;br /&gt;
* &#039;&#039;&#039;[[Config]]&#039;&#039;&#039;:Dieser Modus wird von [[allen]] Devices unterstützt. Hierbei wird das Device durch drücken einer Taste (typisch einer separaten, versteckten Taste) in den Mode versetzt. Die Taste wird gelegentlich auch Anlerntaste genannt. Das Device sendet hierbei eine Konfigmessage und bleibt einige Sekunden auf Empfang. Ein anderes Device hat nun die Chance mit dem Device zu kommunizieren.&lt;br /&gt;
:Dieser Mode wird gerne zum Pairen genutzt. &lt;br /&gt;
:Die FHEM Zentrale erkennt die Message und startet die Abarbeitung eventuell anhängiger Messages&lt;br /&gt;
* &#039;&#039;&#039;[[normal]]&#039;&#039;&#039;:Typischerweise wird dieser Mode von allen Devices mit permanenter Stromversorgung unterstützt. Das Device ist kontinuierlich auf Empfang. Config wird von diesen Devices typisch nur zum pairen genutzt&lt;br /&gt;
* &#039;&#039;&#039;[[wakeup]]&#039;&#039;&#039;:Batteriebetriebene Devices welche regelmäßig senden stellen gerne diesen Modus bereit. Einige Devices welche regelmäßig senden (Thermostate oder Fühler) bleiben nach senden der zyklischen Nachricht kurz auf Empfang. FHEM erkennt dies und sendet gegebenenfalls anhängige Nachrichten und Abfragen. &lt;br /&gt;
* &#039;&#039;&#039;[[lazyConf]]&#039;&#039;&#039;:Einige modernere Devices, betteriebetrieben und unregemäßig sendent, stellen einen trägen Config mode bereit. Hierbei bleibt das Device auf Empfang, wenn dies einen Trigger gesendet hat. &lt;br /&gt;
:Beispiel ist eine Fernbedienung welche nach drücken eines Buttons den Trigger sendet und dann kurz auf weitere Nachrichten wartet. Auch einige Bewegungsmelder unterstützen dies. Hier muss man also einen Trigger auslösen (Bewegung). Das Device reagiert nicht nach dem Senden der zyklischen Nachrichten.&lt;br /&gt;
:Erfahrungsgemäß funktioniert dies allerdings nur, wenn das Device den Trigger an die Zentrale sendet. Es ist also ratsam, alle Kanäle (jeden einzeln) mit einem Kanal der Zentrale zu peeren. Es biete sich an, einen virtuellen Button der Zentrale zu nutzen, welche man mit allen Kanälen aller LazyConfig Devices peert.&lt;br /&gt;
* &#039;&#039;&#039;[[burst]]&#039;&#039;&#039;:Burst ist ein Verfahren, schlafende Devices aufzuwecken. Einige sind im Dämmerschlaf und können durch einen Burst aufgeweckt werden. Burst ist ein Kommandosequenz welche der Initiator senden muss. Diese ist aufwändig, verbraucht einiges an Funkperformance (1% Regel) und weckt [[alle]] Burst Devices gleichzeitig auf. Als Daumenregel kann ein Device in einer Stunde 100 Bursts senden bevor die 1% Regel zuschlägt. &lt;br /&gt;
:SD (Rauchdetektoren) verwenden tyisch burst. Sie müssen empfangsbereit sein, laufen mit Batterie und müssen demnach Sparsam sein. &lt;br /&gt;
* &#039;&#039;&#039;[[burstCond]]&#039;&#039;&#039;:ist eine Variante des Burst. Der Burstmode kann bei ihnen freigeschaltet werden. Beispielsweise RT (Heizungsthermosrate) nutzen diesen Mode. Ein RT sendet regelmäßig seinen Status - und hierbei kann man über wakeup mit dem Device alle 3min kommunizieren. Nun muss ein RT aber auf Fensterkontakte reagieren können. Diese senden Asynchron. Man muss also sicherstellen, dass der Fensterkontakt einen Burst sendet und der RT auf Burst reagiert. &lt;br /&gt;
:Conditional Burst wird in einem Register freigeschaltet. &lt;br /&gt;
:Devices mit CondBurst stellen ein Kommando BurstXmit bereit. Hierbei wird von FHEM ein Burst gesendet und ene eventuell anstehende Kommunikation wird durhgeführt. &lt;br /&gt;
:BurstXmit sollte nur bei Bedarf, beim Configurieren, genutzt werden. Typisch sollte man auf das normale erwachen des Devices warten um die Kommunikation nicht zu belasten. &lt;br /&gt;
:In einem Sender (Fensterkontakt) Muss &amp;quot;peerNeedsBurst&amp;quot; einegeschaltet werden, wenn dieses mit einem Burst-Device gepeert ist. &lt;br /&gt;
===HMinfo Kommandos zum Devicetyp===&lt;br /&gt;
Um nun festzustellen, welchen Devicetyp man vorliegen hat kann man über das Attribut model seines Device in HMinfo klären&lt;br /&gt;
  get hm models&lt;br /&gt;
  get hm models -f &amp;lt;regexp&amp;gt;&lt;br /&gt;
  get hm models -f SD&lt;br /&gt;
==FHEM Kommunikation==&lt;br /&gt;
FHEM kennt alle Kommunikationstypen und behandelt diese entsprechend. Zu beachten ist, dass ein HM Gerät aus mehreren Entities besteht: Ein Device und ein oder mehrere Kanäle. Man kann mit den Kanälen nicht direkt kommunizieren. Die Kommunikation geht immer über das Device. So ist es in FHEM auch organisiert. Löst man ein Kommando für einen Kanal aus wir dies in die Abarbeitungsliste der Device gestellt. Je nach Komminukationstyp arbeitet FHEM die Liste schnellstmöglch ab. &amp;lt;br&amp;gt;&lt;br /&gt;
Hierbei ist zu beachten, dass an die Devices über ein oder mehrere IOs gesendet wird. Auch hier wird wieder der Reihe nach vorgegangen, ein Device nach dem anderen. &amp;lt;br&amp;gt;&lt;br /&gt;
Wir haben also gelernt, dass Kommandos, welche FHEM senden will, in den Kommando-Queues der Devices abgelegt werden. Will nun sehen, ob schon alles erledigt ist, oder ob Fehler aufgetreten sind, muss man den Status der Kommando-queue lesen. Dieser wird in den &#039;&#039;&#039;Internals&#039;&#039;&#039; welche mit &#039;&#039;&#039;[[prot]]&#039;&#039;&#039; (Protokol) beginnend ermittelt.&lt;br /&gt;
*&#039;&#039;&#039;protState&#039;&#039;&#039;:Der gesamt-Zustand der Queue. &lt;br /&gt;
**CMDs_done&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMinfo_Protokoll&amp;diff=24309</id>
		<title>HMinfo Protokoll</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMinfo_Protokoll&amp;diff=24309"/>
		<updated>2018-01-04T18:56:10Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: Die Seite wurde neu angelegt: „{{Infobox Modul |ModPurpose=HM Protokollereignisse kontrollieren |ModType=h |ModCmdRef=HMinfo |ModForumArea=HomeMatic |ModTechName=98_HMinfo.pm |ModOwner=marti…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=HM Protokollereignisse kontrollieren&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMinfo&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMinfo.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Homematic Geräte mit Funkprotokoll haben Eigenheiten welche man verstehen und überwachen muss, so man sein System unter Konrolle haben will. &lt;br /&gt;
HMInfo ist ein Modul welches Methoden zu Verfügung stellt, damit umzugehen. &lt;br /&gt;
Behandelt wird hier ausschliesslich die Homematic Funkprotokoll. &lt;br /&gt;
&lt;br /&gt;
=Das Protokoll=&lt;br /&gt;
Das Protokoll beruht in der Regel auf einem Handshake Verfahren. Nachrichten müssen von Empfänger quittert werden. Um mit einem Device kommunizieren zu können muss es allerdings empfangsbereit sein. Man muss die Devicetypen daher unterscheiden&lt;br /&gt;
==Kommunikationstypen==&lt;br /&gt;
Homematic bietet unterschiedliche Devices, teils batteriebetrieben. Die Energieversorgung ist der wesentliche Grund unterschiedliche Typen zu etablieren. Sollte ein batteriebetriebenes Device kontinuierlich auf Empfang sein senkt das die Lebensdauer der Batterie erheblich. Somit unterscheidet man&lt;br /&gt;
* &#039;&#039;&#039;[[Config]]&#039;&#039;&#039;:Dieser Modus wird von [[allen]] Devices unterstützt. Hierbei wird das Device durch drücken einer Taste (typisch einer separaten, versteckten Taste) in den Mode versetzt. Die Taste wird gelegentlich auch Anlerntaste genannt. Das Device sendet hierbei eine Konfigmessage und bleibt einige Sekunden auf Empfang. Ein anderes Device hat nun die Chance mit dem Device zu kommunizieren.&lt;br /&gt;
:Dieser Mode wird gerne zum Pairen genutzt. &lt;br /&gt;
:Die FHEM Zentrale erkennt die Message und startet die Abarbeitung eventuell anhängiger Messages&lt;br /&gt;
* &#039;&#039;&#039;[[normal]]&#039;&#039;&#039;:Typischerweise wird dieser Mode von allen Devices mit permanenter Stromversorgung unterstützt. Das Device ist kontinuierlich auf Empfang. Config wird von diesen Devices typisch nur zum pairen genutzt&lt;br /&gt;
* &#039;&#039;&#039;[[wakeup]]&#039;&#039;&#039;:Batteriebetriebene Devices welche regelmäßig senden stellen gerne diesen Modus bereit. Einige Devices welche regelmäßig senden (Thermostate oder Fühler) bleiben nach senden der zyklischen Nachricht kurz auf Empfang. FHEM erkennt dies und sendet gegebenenfalls anhängige Nachrichten und Abfragen. &lt;br /&gt;
* &#039;&#039;&#039;[[lazyConf]]&#039;&#039;&#039;:Einige modernere Devices, betteriebetrieben und unregemäßig sendent, stellen einen trägen Config mode bereit. Hierbei bleibt das Device auf Empfang, wenn dies einen Trigger gesendet hat. &lt;br /&gt;
:Beispiel ist eine Fernbedienung welche nach drücken eines Buttons den Trigger sendet und dann kurz auf weitere Nachrichten wartet. Auch einige Bewegungsmelder unterstützen dies. Hier muss man also einen Trigger auslösen (Bewegung). Das Device reagiert nicht nach dem Senden der zyklischen Nachrichten.&lt;br /&gt;
:Erfahrungsgemäß funktioniert dies allerdings nur, wenn das Device den Trigger an die Zentrale sendet. Es ist also ratsam, alle Kanäle (jeden einzeln) mit einem Kanal der Zentrale zu peeren. Es biete sich an, einen virtuellen Button der Zentrale zu nutzen, welche man mit allen Kanälen aller LazyConfig Devices peert.&lt;br /&gt;
* &#039;&#039;&#039;[[burst]]&#039;&#039;&#039;:Burst ist ein Verfahren, schlafende Devices aufzuwecken. Einige sind im Dämmerschlaf und können durch einen Burst aufgeweckt werden. Burst ist ein Kommandosequenz welche der Initiator senden muss. Diese ist aufwändig, verbraucht einiges an Funkperformance (1% Regel) und weckt [[alle]] Burst Devices gleichzeitig auf. Als Daumenregel kann ein Device in einer Stunde 100 Bursts senden bevor die 1% Regel zuschlägt. &lt;br /&gt;
:SD (Rauchdetektoren) verwenden tyisch burst. Sie müssen empfangsbereit sein, laufen mit Batterie und müssen demnach Sparsam sein. &lt;br /&gt;
* &#039;&#039;&#039;[[burstCond]]&#039;&#039;&#039;:ist eine Variante des Burst. Der Burstmode kann bei ihnen freigeschaltet werden. Beispielsweise RT (Heizungsthermosrate) nutzen diesen Mode. Ein RT sendet regelmäßig seinen Status - und hierbei kann man über wakeup mit dem Device alle 3min kommunizieren. Nun muss ein RT aber auf Fensterkontakte reagieren können. Diese senden Asynchron. Man muss also sicherstellen, dass der Fensterkontakt einen Burst sendet und der RT auf Burst reagiert. &lt;br /&gt;
:Conditional Burst wird in einem Register freigeschaltet. &lt;br /&gt;
:Devices mit CondBurst stellen ein Kommando BurstXmit bereit. Hierbei wird von FHEM ein Burst gesendet und ene eventuell anstehende Kommunikation wird durhgeführt. &lt;br /&gt;
:BurstXmit sollte nur bei Bedarf, beim Configurieren, genutzt werden. Typisch sollte man auf das normale erwachen des Devices warten um die Kommunikation nicht zu belasten. &lt;br /&gt;
:In einem Sender (Fensterkontakt) Muss &amp;quot;peerNeedsBurst&amp;quot; einegeschaltet werden, wenn dieses mit einem Burst-Device gepeert ist. &lt;br /&gt;
==HMinfo Kommandos zum Devicetyp==&lt;br /&gt;
Um nun festzustellen, welchen Devicetyp man vorliegen hat kann man über das Attribut model seines Device in HMinfo klären&lt;br /&gt;
  get hm models&lt;br /&gt;
  get hm models -f &amp;lt;regexp&amp;gt;&lt;br /&gt;
  get hm models -f SD&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMinfo&amp;diff=24308</id>
		<title>HMinfo</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMinfo&amp;diff=24308"/>
		<updated>2018-01-04T16:39:15Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Übersicht über alle HomeMatic Geräte&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMinfo&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMinfo.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HMInfo&#039;&#039;&#039; ist ein Modul, das einen Überblick über alle definierten [[HomeMatic]] Geräte gibt. Es bietet Funktionen zur Übersicht, Kontrolle, Archivierung  und, begrenzt, zur Programmierung der HomeMatic Komponenten. Somit soll es eine Hilfestellung bei Konfiguration und Fehlerbehandlung geben. &lt;br /&gt;
 &lt;br /&gt;
== Definition == &lt;br /&gt;
HMInfo wird erstellt / angelegt mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;define hm HMinfo&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach können alle Funktionen aufgelistet werden mit&lt;br /&gt;
:&amp;lt;code&amp;gt;get hm help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integritätsprüfungen ==&lt;br /&gt;
Zur berücksichtigen bei allen Funktionen von HMInfo ist die Tatsache, dass die Prüfung jeweils auf den innerhalb von FHEM vorliegenden Informationen passiert. Erste Korrekturmaßnahme ist daher immer von den betroffenen Devices die Informationen mit einem set &amp;lt;Device&amp;gt; getConfig zu aktualisieren. Dabei ist darüber hinaus zu berücksichtigen, dass entsprechend der konfigurierten Kommunikationsmethode (z.B. config) einige Devices erst nach einer gewissen Zeit oder nach Betätigen der Anlerntaste die Informationen als Antwort zurückliefern.&lt;br /&gt;
&lt;br /&gt;
Befehle, um die Gültigkeit von verschiedenen HomeMatic Eigenschaften zu überprüfen:&lt;br /&gt;
&lt;br /&gt;
=== peerCheck ===&lt;br /&gt;
Mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;get hm peerCheck&amp;lt;/code&amp;gt;&lt;br /&gt;
wird der Zustand der Peerings überprüft, d.h., ob alle [[Peering (HomeMatic)|Peerings]] auch beidseitig sind. Mögliche Meldungen, die eine Überarbeitung und/oder Korrektur von Definitionen erforderlich machen können:&lt;br /&gt;
;peer not verified. Check that peer is set on both sides &lt;br /&gt;
:ausgegebener Wert (z.B.): actorChan p:switchChan&lt;br /&gt;
:erforderliche Korrekturmaßnahme: Erneutes setzen des Links und Sicherstellen, dass das Kommando das entsprechende Device auch erreicht hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
&lt;br /&gt;
=== regCheck ===&lt;br /&gt;
Mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;get hm regCheck&amp;lt;/code&amp;gt;&lt;br /&gt;
wird überprüft, ob alle Register korrekt gelesen wurden. Mögliche Meldungen:&lt;br /&gt;
;missing register list &lt;br /&gt;
:ausgegebener Wert (z.B.): &amp;lt;code&amp;gt;dev01Ch01:  RegL_01: &amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: &amp;lt;code&amp;gt;set dev01Ch01 getConfig&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder &amp;lt;code&amp;gt;device01Ch01:	.RegL_03:sensor01Ch01,.RegL_03:sensor01Ch02&amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: Deutet darauf hin, dass nicht alle Informationen aus einem Device gelesen wurden. Ein set &amp;lt;Device&amp;gt; getConfig sollte alle Register auslesen. Sicherstellen, dass das Kommando zum Auslesen das entsprechende Device auch erreicht und eine Antwort geliefert hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
;Register changes pending &lt;br /&gt;
:ausgegebener Wert (z.B.): &amp;lt;code&amp;gt;sensor01Ch01&amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: Ein set &amp;lt;Device&amp;gt; getConfig sollte alle Register auslesen. Sicherstellen, dass das Kommando das entsprechende Device auch erreicht und eine Antwort geliefert hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
&lt;br /&gt;
=== configCheck ===&lt;br /&gt;
Mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;get hm configCheck&amp;lt;/code&amp;gt; werden die Befehle &#039;&#039;&#039;peerCheck&#039;&#039;&#039; und &#039;&#039;&#039;regCheck&#039;&#039;&#039; ausgeführt. Zusätzlich können noch Ergebnisse auftauchen wie&lt;br /&gt;
;PairedTo mismatch to IODev&lt;br /&gt;
:ausgegebener Wert (z.B.): &amp;lt;code&amp;gt;sensor01Ch01 paired:0x000000 IO attr: xxxxxx.&amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: IODevice in den hmPairForSec Modus versetzen, Pairing-Modus am Device aktivieren und dadurch das pairing wiederholen. Ein Anschließendes set &amp;lt;Device&amp;gt; getConfig kann nicht schaden. Sicherstellen, dass das Kommando zum Auslesen das entsprechende Device auch erreicht und eine Antwort geliefert hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
&lt;br /&gt;
== Anzeigen zur Übertragungssituation ==&lt;br /&gt;
===RSSI ===&lt;br /&gt;
;&amp;lt;code&amp;gt;get hm rssi [&amp;lt;filter&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erzeugt eine Tabelle aller RSSI Werte.&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm clear [&amp;lt;filter&amp;gt;] rssi&amp;lt;/code&amp;gt;&lt;br /&gt;
:setzt die RSSI Werte aller devices gemäß filter zurück. Eine neue Messung kann beginnen&lt;br /&gt;
&lt;br /&gt;
===protoEvents ===&lt;br /&gt;
;&amp;lt;code&amp;gt;get hm protoEvents [&amp;lt;filter&amp;gt;][short|long] &amp;lt;/code&amp;gt;&lt;br /&gt;
Siehe [[Himfo Protokol]]&lt;br /&gt;
:Es wird eine Tabelle mit allen wichtigen Ereignissen zur Datenübertragung erzeugt. Dies beinhaltet Wiederholungen sowie Übertragungsfehler. &lt;br /&gt;
&amp;lt;code&amp;gt;short&amp;lt;/code&amp;gt; ist eine Fassung ohne Zeitstempel und lässt sich besser am Bildschirm darstellen.&lt;br /&gt;
Ausserdem kann man sehen, welche Abfragen noch in der Queue sind, z.B. durch &amp;lt;code&amp;gt;autoReadReg&amp;lt;/code&amp;gt; erzeugt. &lt;br /&gt;
Die Zustände aller für HM zuständigen IOs sind beinhaltet. &lt;br /&gt;
Alles in allem ist hier ein kompletter Überblick zur Kommunikation zu sehen. Der Befehl&lt;br /&gt;
 set hm clear [&amp;lt;filter&amp;gt;] Protocol&lt;br /&gt;
setzt die Protokoleinträge aller HomeMatic-Geräte gemäß Filter zurück. Das kann gut vor einer Konfigurationsaktion genutzt werden um zu kontrollieren, ob Fehler aufgetreten sind.&amp;lt;br&amp;gt;&lt;br /&gt;
Für tieferes Verständnis siehe [[Himfo Protokol]]&lt;br /&gt;
&lt;br /&gt;
===msgStat===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm msgStat &amp;lt;/code&amp;gt;&lt;br /&gt;
:Statistic der Übertragenen Messages insgesamt. Es gibt eine Tabelle über die letzten 24h und eine über die letzte Woche. &lt;br /&gt;
&lt;br /&gt;
== Speichern von Konfigurationen==&lt;br /&gt;
HMInfo speichert Konfigurationen der Geräte in Files. Mit dem Attribut configDir kann man ein Verzeichnis festlegen, in das alles geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
=== saveConfig===&lt;br /&gt;
[[Peering (HomeMatic)|Peers]] und Register werden in eine Datei geschrieben. Die Daten kann man ggf. wieder in ein Gerät oder ein Austauschgerät schreiben. Die Speicherung erfolgt kumulativ, man kann alles in eine Datei schreiben. &lt;br /&gt;
:&amp;lt;code&amp;gt;set hm saveConfig [&amp;lt;filter&amp;gt;] [&amp;lt;file&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== archConfig ===&lt;br /&gt;
Arbeitet prinzipiell wie saveConfig. Es werden jedoch nur vollständige Registersätze gespeichert, was einen höheren Level an Sicherheit der Dateninhalte gewährt.  &lt;br /&gt;
:&amp;lt;code&amp;gt;set hm archConfig [-a] [&amp;lt;file&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
Mit dem &#039;&#039;&#039;Attribut autoArchive&#039;&#039;&#039; kann man einstellen, dass automatisch nach erfolgreichem Lesen einer Device-Konfiguration diese archiviert wird. &lt;br /&gt;
Das Speichern erfolgt kumulativ. Ab einer Dateigröße von 1MB wird gepurged, also alles bis auf den neusten Eintrag jeder Entity gelöscht.  &lt;br /&gt;
&lt;br /&gt;
Um eine Konfiguration zu sichern, sollte eine Kopie des Archivs gemacht werden. Das Archiv wird bei Gelegenheit überschrieben. &lt;br /&gt;
&lt;br /&gt;
Template erstellen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set hm saveConfig -f ^meinDevice$ &amp;lt;myTemplateFile&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== loadConfig ===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm loadConfig [&amp;lt;filter&amp;gt;] [&amp;lt;filename&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest die Registerwerte, die für eine Entity in einem File gespeichert sind, zurück in die Readings. Sollten die Register schon in FHEM vorhanden sein, wird &#039;&#039;&#039;nicht&#039;&#039;&#039; überschrieben. &lt;br /&gt;
Sinn macht dies beispielsweise für remotes, die nicht automatisch gelesen werden sollen. Man kann somit nach einem system-reboot die Register &amp;quot;rekonstruieren&amp;quot; und wieder darstellen. &lt;br /&gt;
Es liegt im ermessen des User, eine bekannt aktuelle Version der Register einzulesen. &lt;br /&gt;
&lt;br /&gt;
=== purgeConfig===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm purgeConfig [&amp;lt;filename&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
:Löscht alle älteren Datensätze in einem File.&lt;br /&gt;
&lt;br /&gt;
== Konfigurationen bearbeiten ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
HMInfo erlaubt das Erstellen und Nutzen von Templates. Das sind Schablonen, die das Setzen von Registern abstrahieren und auf eine höhere Ebene heben. So kann man das Setzen der Konfiguration eines Aktors beispielsweise um mit einem Bewegungsmelder zusammen zu arbeiten in einem Kommando zusammenfassen.&lt;br /&gt;
Faktisch setzt das Template also eine Gruppe von Registern auf einmal.&lt;br /&gt;
&lt;br /&gt;
====templateList ====&lt;br /&gt;
Die vorhandenen templates kann man mit templateList sehen. &lt;br /&gt;
  get hm templateList&lt;br /&gt;
  &lt;br /&gt;
  SwOnCond         params:level cond               Info:switch: execute only if condition [geLo|ltLo] level is below limit&lt;br /&gt;
  SwToggle         params:                         Info:Switch: toggle on trigger&lt;br /&gt;
  autoOff          params:time                     Info:staircase - auto off after &amp;lt;time&amp;gt;, extend time with each trigger&lt;br /&gt;
  motionOnDim      params:ontime brightness        Info:Dimmer: on for time if MDIR-brightness below level&lt;br /&gt;
  motionOnSw       params:ontime brightness        Info:Switch: on for time if MDIR-brightness below level&lt;br /&gt;
Die Liste der verfügbaren Tempaltes, deren Parameter falls nötig und eine kurze Info, was das Template bewirken soll&lt;br /&gt;
&lt;br /&gt;
  get hm templateList autoOff&lt;br /&gt;
&lt;br /&gt;
  autoOff          params:time                     Info:staircase - auto off after &amp;lt;time&amp;gt;, extend time with each trigger&lt;br /&gt;
    ActionType       :jmpToTarget&lt;br /&gt;
    OffTime          :111600&lt;br /&gt;
    OnTime           :time&lt;br /&gt;
    SwJtDlyOff       :dlyOn&lt;br /&gt;
    SwJtDlyOn        :no&lt;br /&gt;
    SwJtOff          :dlyOn&lt;br /&gt;
    SwJtOn           :on&lt;br /&gt;
Ein templateList auf ein einzelnes Template zeigt im Detail, was das Template verändern wird.&lt;br /&gt;
&lt;br /&gt;
====templateSet ====&lt;br /&gt;
Um ein Template auf einen Aktor anzuwenden,muss man den Bereich wählen, auf den er angewendet werden soll. Je nach template kann das die Gruppe der Register zu einem [[Peering (HomeMatic)|Peer]], zu short oder long eines Peer oder Register ohne peer sein. &lt;br /&gt;
  set hm templateSet &amp;lt;entity&amp;gt; &amp;lt;templateName&amp;gt; &amp;lt;peer:[long|short]&amp;gt; [&amp;lt;param1&amp;gt; ...] &lt;br /&gt;
  set hm templateSet Licht1 autoOff FB1_Btn2:short 10&lt;br /&gt;
  set hm templateSet Licht1 SwOn FB1_Btn2:long&lt;br /&gt;
  set hm templateSet Licht1 SwOff FB1_Btn2:short&lt;br /&gt;
  set hm templateSet Licht1 SwOnOff FB1_Btn2:both&lt;br /&gt;
  set hm templateSet LichtDev setHost 0&lt;br /&gt;
Licht1 soll, wenn ein kurzer Trigger von FB1_Btn2 kommt für 10 sec eingeschaltet werden, dann ausgehen (Treppenhausfunktion). Kommt aber ein langer Tastendruck wird das Licht dauerhaft eingeschaltet. &lt;br /&gt;
  set hm templateSet Licht1 motionOnSw MD1:short 30 20&lt;br /&gt;
Der Switch Aktor Licht1 soll mit einem Bewegungsmelder betrieben werden. Der Bewegungsmelder sendet keine &#039;langen&#039; Trigger sondern nur kurze. Im Beispiel wird Licht1 für 30 Sekunden eingeschaltet, wenn der Bewegungsmelder einen Trigger sendet UND es dunkler ist als &amp;quot;20&amp;quot; (Brightness level).&lt;br /&gt;
&lt;br /&gt;
====templateDef ====&lt;br /&gt;
Neben den vorbereiteten Templates kann der User eigene definieren oder von anderen Usern sich Templates geben lassen. Die Definition von Templates ist für erfahrene User gedacht, im Gegensatz zur Nutzung eines Templates mit set - das ist für Anfänger gedacht. Man kann sein template manuell definieren oder ein bekanntes Device als Muster nutzen (fromMaster). Ein Template kann nur Gruppen von Registern setzen, nicht alle Register eines Device. Um die Gruppen anzusprechen muss man &amp;quot;peer&amp;quot; wie folgt setzen:&lt;br /&gt;
  0            Register ohne peer&lt;br /&gt;
  &amp;lt;peer&amp;gt;:both  Register eines peers&lt;br /&gt;
  &amp;lt;peer&amp;gt;:short Register eines peers nur Short&lt;br /&gt;
  &amp;lt;peer&amp;gt;:long  Register eines peers nur Long&lt;br /&gt;
setzen.&lt;br /&gt;
Man kann das template &amp;quot;dynamisch&amp;quot; gestalten, indem man einzelne Register beim templateSet übergibt. &lt;br /&gt;
Erst einmal statische Templates. Param ist hier &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  set hm templateDef &amp;lt;templateName&amp;gt; &amp;lt;param1[:&amp;lt;param2&amp;gt;...]&amp;gt; &amp;lt;description&amp;gt; &amp;lt;reg1&amp;gt;:&amp;lt;val1&amp;gt; [&amp;lt;reg2&amp;gt;:&amp;lt;val2&amp;gt;] ... &lt;br /&gt;
&lt;br /&gt;
  set hm templateDef t1 0 &amp;quot;TP1&amp;quot; OnTime:10 OffTime:20 OnDly:0 &lt;br /&gt;
&lt;br /&gt;
  set hm templateDef t1 fromMaster &amp;lt;entity&amp;gt; 0 &lt;br /&gt;
  set hm templateDef t2 fromMaster &amp;lt;entity&amp;gt; &amp;lt;peer&amp;gt;:both &lt;br /&gt;
  set hm templateDef t3 fromMaster &amp;lt;entity&amp;gt; &amp;lt;peer&amp;gt;:short&lt;br /&gt;
  set hm templateDef t4 fromMaster &amp;lt;entity&amp;gt; &amp;lt;peer&amp;gt;:long&lt;br /&gt;
&lt;br /&gt;
  set hm templateDef t4 fromMaster LichtWz remoteBtn1:long&lt;br /&gt;
&lt;br /&gt;
Dynamische Templates haben eine Parameterliste (bis zu 9) &amp;lt;param1[:&amp;lt;param2&amp;gt;...]&amp;gt;. Diese werden als p0 bis p8 genutzt - der Name ist dabei egal, er dient dem User also Hilfe beim templateList&lt;br /&gt;
 &lt;br /&gt;
  set hm templateDef myTemplate anzeit:auszeit &amp;quot;licht schaltet ständig an und aus&amp;quot; OnTime:p0 OffTime:p1 OnDly:0&lt;br /&gt;
&lt;br /&gt;
  set hm templateDef myAutoOff AnZeit &amp;quot;treppenhausschalter&amp;quot; ActionType:jmpToTarget OffTime:unused OnTime:p0 SwJtDlyOff:dlyOn SwJtDlyOn:no SwJtOff:dlyOn SwJtOn:on&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;Anzeit&amp;quot; ist der erste Parameter, also p0. Der Wert, den man bei Set einträgt wird in OnTime geschrieben. OnTime:p0&lt;br /&gt;
&lt;br /&gt;
Beim Definieren eines Templates wird die Registergültigkeit nicht geprüft. Das kommt beim Set.&lt;br /&gt;
&lt;br /&gt;
Mit dem Parameter del kann ein (fehlerhaftes) Template (hier myTemplate) wieder gelöscht werden. &lt;br /&gt;
&lt;br /&gt;
  set hm templateDef myTemplate del&lt;br /&gt;
&lt;br /&gt;
====templateChk ====&lt;br /&gt;
Template definitionen und zuweisungen (set) kann man mit &lt;br /&gt;
  set hm archConfig&lt;br /&gt;
speichern und mit &lt;br /&gt;
  set hm loadConfig&lt;br /&gt;
mach einem reboot laden. Welche templates einer entity zugewiesen sind kann man mit &lt;br /&gt;
  attr &amp;lt;entity&amp;gt; expert 12&lt;br /&gt;
in den Readings sichtbar machen. Siehe auch templateUsg.&lt;br /&gt;
&lt;br /&gt;
Man kann prüfen, ob ein Aktor/[[Peering (HomeMatic)|Peer]] gemäss einem Template programmiert ist. Sinnvoll ist eine komplette Prüfung aller zugewiesenen templates. Man kann aber auch filtern. &lt;br /&gt;
  get hm templateChk &lt;br /&gt;
  get hm templateChk [&amp;lt;filter&amp;gt;] &lt;br /&gt;
  get hm templateChk [&amp;lt;filter&amp;gt;] &amp;lt;templateName&amp;gt; &amp;lt;peer:[long|short]&amp;gt; [&amp;lt;param1&amp;gt; ...] &lt;br /&gt;
  get hm templateChk -f Rollo RolloHoch self01 5&lt;br /&gt;
Es wird geprüft für alle HM-Komponenten, die &amp;quot;Rollo&amp;quot; im Namen haben (siehe [[Homematic HMInfo#Filter|Filter]]) dem (hoffentlich vorhandenen) template &amp;quot;RolloHoch&amp;quot; verglichen. Geprüft wird nur der Peer &amp;quot;self01&amp;quot;, aber für long UND short.&lt;br /&gt;
  get hm templateChk -f Rollo RolloHoch self01:sort 5&lt;br /&gt;
das selbe, nur für short Einträge&lt;br /&gt;
&lt;br /&gt;
====templateUsg ====&lt;br /&gt;
Gibt eine Liste der zugewiesenen templates zurück&lt;br /&gt;
  get hm templateUsg  &lt;br /&gt;
  get hm templateUsg sortTemplate&lt;br /&gt;
  get hm templateUsg sortPeer&lt;br /&gt;
&lt;br /&gt;
====templateExe ====&lt;br /&gt;
Nach einem loadConfig oder einem templateChk können Fehler erkannt worden sein, die Register entspreche nicht dem Template. Mit diesem Kommando werden alle nicht korrekten Register in die Devices geschrieben. Sollte die Werte stimmen wird nichts gemacht. &lt;br /&gt;
  set hm templateExe&lt;br /&gt;
&lt;br /&gt;
Das Kommando kann also bedenkenlos eingesetzt werden, wenn die templates schon stimmen. Es wird nichts gesendet, keine Funklast erzeugt.&lt;br /&gt;
&lt;br /&gt;
====templateDel ====&lt;br /&gt;
eine zuweisung des Templates kann gelöscht werden&lt;br /&gt;
  set hm templateDel &amp;lt;entity&amp;gt; &amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Temperaturlisten===&lt;br /&gt;
HMInfo bietet verschiedene Methoden, Temperaturlisten für Thermostate (CC-TC, TC-IT oder RT) zu verwalten und zu nutzen. Siehe hierzu [[HomeMatic HMInfo TempList/Weekplan|Homematic Weekplan]]&lt;br /&gt;
&lt;br /&gt;
=== Registersätze kopieren ===&lt;br /&gt;
HMInfo erlaubt das Kopieren von Register-Listen. Über Register wird ein HM-Gerät eingestellt und die Register sind in Listen gruppiert. Die Reaktion und das Verhalten eines Aktors auf einen Trigger eines Sensors wird in dem Registersatz zu diesem [[Peering (HomeMatic)|Peer]] komplett beschrieben. &lt;br /&gt;
Durch die Möglichkeit einen solchen Registersatz im Device zu kopieren kann man das Verhalten, das man für einen Knopf/Sensor festgelegt hat identisch in einen zweiten kopieren. &lt;br /&gt;
HMInfo geht davon aus, dass die vom Gerät gelesene Konfiguration vor dem Kommando aktuell und komplett ist. &lt;br /&gt;
 set hm cpRegs Licht1:FB3_Btn2 Licht3:FB1_Btn4&lt;br /&gt;
 set hm cpRegs Licht2:FB3_Btn2 Licht2:FB1_Btn4&lt;br /&gt;
 set hm cpRegs Licht4:FB3_Btn2 Licht4:FB5_Btn2&lt;br /&gt;
Die obigen Beispiele bewirken der Reihe nach:&lt;br /&gt;
Duplizieren das Verhalten, das Fernbedienungsknopf 2 der Fernbedienung 3 bei Aktor Licht1 hervorruft auch nach Licht3 für Fernbedienungsknopf4 der Fernbedienung 1.&lt;br /&gt;
Duplizieren das Verhalten, das Fernbedienungsknopf 2 der Fernbedienung 3 bei Aktor Licht2 hervorruft auch nach Licht2 (selber Aktor) für Fernbedienungsknopf4 der Fernbedienung 1.&lt;br /&gt;
&lt;br /&gt;
== Web Einträge und Readings ==&lt;br /&gt;
Readings und Internals von HMInfo bieten eine Zusammenfassung des Zustands aller HM Komponenten. Diese sind in Fehler &#039;&#039;&#039;ERR&#039; , Warnungen &#039;&#039;&#039;W_&#039;&#039;&#039; und Information &#039;&#039;&#039;I_&#039;&#039;&#039; untergliedert. Die Prüfung und Erneuerung der Zähler und Werte wird mit:&lt;br /&gt;
:&amp;lt;code&amp;gt;set hm update &amp;lt;/code&amp;gt;&lt;br /&gt;
erreicht. Mit dem Attribut autoUpdate kann man es automatisch regelmäßig starten.&lt;br /&gt;
&lt;br /&gt;
=== Fehlermeldungen ===&lt;br /&gt;
Als Fehler erkannte Zustände werden in Variablen beginnend mit &#039;&#039;&#039;ERR&#039;&#039;&#039; dargestellt. Erfasste Fehler sind kritische RSSI Werte und Protokoll-/Übertragungsfehler. Ausserdem kann man im Attribut sumERROR eintragen, welche Readings zu einer Fehlermeldung führen sollen. Eingetragen werden:&lt;br /&gt;
Reading:&amp;lt;gutwert&amp;gt;. Wenn ein Reading mit einen anderen als dem &amp;quot;gutwert&amp;quot; gefunden wird, wird dies alarmiert. &lt;br /&gt;
Beispiel: &lt;br /&gt;
:&amp;lt;code&amp;gt;battery:ok &amp;lt;/code&amp;gt;&lt;br /&gt;
hat eine HM Komponente ein Reading &amp;quot;battery&amp;quot; und dieses hat einen anderen Wert als &amp;quot;ok&amp;quot; wird dies alarmiert. &lt;br /&gt;
In den Readings von HMInfo würde im Feherfall&lt;br /&gt;
  internal:&lt;br /&gt;
    ERR_names &amp;lt;devicename1&amp;gt;,&amp;lt;devicename2&amp;gt;&lt;br /&gt;
  Readings:&lt;br /&gt;
    ERR_battery low:2&lt;br /&gt;
&lt;br /&gt;
Der default aller Error-meldungen ist&lt;br /&gt;
battery:ok,sabotageError:off,powerError:ok,overload:off,overheat:off,reduced:off,motorError:no,error:none,uncertain:yes,smoke_detect:none,cover:closed&lt;br /&gt;
&lt;br /&gt;
Diese Zusammenfassung der Fehlermeldungen könnte man nutzen, um über notify einen Alarm auszulösen oder eine E-Mail zu senden. &lt;br /&gt;
&lt;br /&gt;
=== Warnungen===&lt;br /&gt;
Hierzu gehören Wiederholungen von Nachrichten (nicht aber Abbrüche, das sind Fehler). Es wird auch ausstehendes Lesen der Konfiguration, das durch autoReadReg getriggert wird, hier angezeigt. &lt;br /&gt;
&lt;br /&gt;
=== Statusmeldungen ===&lt;br /&gt;
Analog zu den Fehlermeldungen kann man mit dem Attribut sumStatus gewisse Readings zählen lassen. Beipiel wäre &lt;br /&gt;
  attr HM sumStatus motor&lt;br /&gt;
HMInfo zeigt in dem Reading I_sum_motor dann an, welcher Inhalt des Readings &amp;quot;motor&amp;quot;  wie oft gefunden wurde. Es könnte so aussehen&lt;br /&gt;
  stop:on:4;stop:1;&lt;br /&gt;
Vier Komponenten stehen auf motor: stop:on und eine steht auf motor: stop&lt;br /&gt;
&lt;br /&gt;
Das Internal &#039;&#039;&#039;I_HM_IOdevices&#039;&#039;&#039; zeigt die von HM Komponenten genutzten IOs und deren State. &lt;br /&gt;
&lt;br /&gt;
== Infos ==&lt;br /&gt;
  get hm models [-f &amp;lt;regexp&amp;gt;]&lt;br /&gt;
  get hm models&lt;br /&gt;
  get hm models -f remote&lt;br /&gt;
  get hm models -f HM_RC&lt;br /&gt;
Zeigt alle in FHEM unterstützten Modelle und deren wesentliche Parameter. Man kann mittels regexp die Liste filtern.&lt;br /&gt;
&lt;br /&gt;
  get hm param [&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;] parameter1 parameter2&lt;br /&gt;
  get hm param -d IODev DEF model&lt;br /&gt;
  get hm param -c -f Rollo peerList&lt;br /&gt;
man kann sich listen von Parametern anzeigen lassen  &lt;br /&gt;
&lt;br /&gt;
  get hm register [&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;]&lt;br /&gt;
zeigt Register in tabellarischer Form. &lt;br /&gt;
&lt;br /&gt;
  get hm peerXref[&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;]&lt;br /&gt;
gibt an, wer mit wem [[Peering (HomeMatic)|gepeert]] ist&lt;br /&gt;
&lt;br /&gt;
== Rücksetzen von Variablen und Zählern ==&lt;br /&gt;
 set HM clear [&amp;lt;typeFilter&amp;gt;] [Protocol|readings|msgStat|register|rssi]&lt;br /&gt;
*register löscht alle Register-readings&lt;br /&gt;
*readings löscht &#039;&#039;&#039;alle&#039;&#039;&#039; readings&lt;br /&gt;
*Protocol löscht alle Protokol-einträge, pending Kommandos und Protokoll-fehler. &lt;br /&gt;
*rssi löscht alle ermittelten RSSI Werte&lt;br /&gt;
*msgStat setzt die Message Statistik zurück&lt;br /&gt;
&lt;br /&gt;
== Filter ==&lt;br /&gt;
Kommandos in HMInfo wirken auf alle HM Komponenten. Man kann dies mit Hilfe der Filter einschränken. Zum einen gibt es &#039;&#039;&#039;modelsFilter&#039;&#039;&#039;, womit man nur devices, nur channels, nur virtuelle Entities bearbeiten kann&lt;br /&gt;
     set &amp;lt;name&amp;gt; &amp;lt;cmd&amp;gt; &#039;&#039;&#039;[-dcasevi]&#039;&#039;&#039;  [params]&lt;br /&gt;
        entities according to list will be processed&amp;quot;&lt;br /&gt;
          d - device   :include devices&amp;quot;&lt;br /&gt;
          c - channels :include channels&amp;quot;&lt;br /&gt;
          i - ignore   :include devices marked as ignore&amp;quot;&lt;br /&gt;
          v - virtual  :supress fhem virtual&amp;quot;&lt;br /&gt;
          p - physical :supress physical&amp;quot;&lt;br /&gt;
          a - aktor    :supress actor&amp;quot;&lt;br /&gt;
          s - sensor   :supress sensor&amp;quot;&lt;br /&gt;
          e - empty    :include results even if requested fields are empty&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein auf &#039;&#039;&#039;-d&#039;&#039;&#039; gefiltertes Kommando wird nur auf devices, nicht aber auf channels angewendet. &lt;br /&gt;
&lt;br /&gt;
Dann gibt es noch den &#039;&#039;&#039;nameFilter&#039;&#039;&#039;, mit dem mittels regexp auf den Namen der Entity gefiltert werden kann&lt;br /&gt;
  -f Rollo # alle Entities mit Rollo im Namen&lt;br /&gt;
  -f ^Rollo$ # nur Entity mit Namen &amp;quot;Rollo&amp;quot;&lt;br /&gt;
  -f Rollo$ # nur Entity deren Name auf Rollo endet&lt;br /&gt;
&lt;br /&gt;
Die Filter kann man kombinieren mit &lt;br /&gt;
  -c -f Rollo # alle Kanäle mit Rollo im Namen&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
Zeige mir die Parameter IODev und room der Devices mit Rollo im Namen&lt;br /&gt;
  set hm param -d -f Rollo IODev room&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
* &#039;&#039;&#039;autoArchive &#039;&#039;&#039; automatisch archivieren von vollständigen Konfigurationen.&lt;br /&gt;
* &#039;&#039;&#039;autoUpdate&#039;&#039;&#039; startet regelmäßig das Komamndo &amp;quot;update&amp;quot;. Die Wiederholzeit wird eingestellt mit hh:mm. Sinnvoll erscheint z.B. alle 5 Minuten, also 00:05.&lt;br /&gt;
* &#039;&#039;&#039;configDir&#039;&#039;&#039; bietet die Möglichkeit, ein Verzeichnis zu definieren, in das HMInfo Dateien ablegen und von dem es die Dateien lesen wird. Default ist fhem_root.&lt;br /&gt;
* &#039;&#039;&#039;configFilename&#039;&#039;&#039; legt einen default Namen fest, der bei save und archive genutzt wird. Default ist regSave.cfg.&lt;br /&gt;
* &#039;&#039;&#039;hmAutoReadScan&#039;&#039;&#039; zeitinterval in Minuten, in denen CUL_HM prüft, ob offene autoRead bereitstehen und die IOs die Kapazität haben. Default ist 4 min.&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
* [[HomeMatic Templates]]&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
* Thread [http://forum.fhem.de/index.php?topic=11035.0 HMinfo] im FHEM Forum&lt;br /&gt;
* Thread {{Link2Forum|Topic=20119|LinkText=HMINfo, Intention, Sinn und Zweck}} im FHEM Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMinfo&amp;diff=24307</id>
		<title>HMinfo</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMinfo&amp;diff=24307"/>
		<updated>2018-01-04T16:38:45Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Übersicht über alle HomeMatic Geräte&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMinfo&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMinfo.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HMInfo&#039;&#039;&#039; ist ein Modul, das einen Überblick über alle definierten [[HomeMatic]] Geräte gibt. Es bietet Funktionen zur Übersicht, Kontrolle, Archivierung  und, begrenzt, zur Programmierung der HomeMatic Komponenten. Somit soll es eine Hilfestellung bei Konfiguration und Fehlerbehandlung geben. &lt;br /&gt;
 &lt;br /&gt;
== Definition == &lt;br /&gt;
HMInfo wird erstellt / angelegt mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;define hm HMinfo&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach können alle Funktionen aufgelistet werden mit&lt;br /&gt;
:&amp;lt;code&amp;gt;get hm help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integritätsprüfungen ==&lt;br /&gt;
Zur berücksichtigen bei allen Funktionen von HMInfo ist die Tatsache, dass die Prüfung jeweils auf den innerhalb von FHEM vorliegenden Informationen passiert. Erste Korrekturmaßnahme ist daher immer von den betroffenen Devices die Informationen mit einem set &amp;lt;Device&amp;gt; getConfig zu aktualisieren. Dabei ist darüber hinaus zu berücksichtigen, dass entsprechend der konfigurierten Kommunikationsmethode (z.B. config) einige Devices erst nach einer gewissen Zeit oder nach Betätigen der Anlerntaste die Informationen als Antwort zurückliefern.&lt;br /&gt;
&lt;br /&gt;
Befehle, um die Gültigkeit von verschiedenen HomeMatic Eigenschaften zu überprüfen:&lt;br /&gt;
&lt;br /&gt;
=== peerCheck ===&lt;br /&gt;
Mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;get hm peerCheck&amp;lt;/code&amp;gt;&lt;br /&gt;
wird der Zustand der Peerings überprüft, d.h., ob alle [[Peering (HomeMatic)|Peerings]] auch beidseitig sind. Mögliche Meldungen, die eine Überarbeitung und/oder Korrektur von Definitionen erforderlich machen können:&lt;br /&gt;
;peer not verified. Check that peer is set on both sides &lt;br /&gt;
:ausgegebener Wert (z.B.): actorChan p:switchChan&lt;br /&gt;
:erforderliche Korrekturmaßnahme: Erneutes setzen des Links und Sicherstellen, dass das Kommando das entsprechende Device auch erreicht hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
&lt;br /&gt;
=== regCheck ===&lt;br /&gt;
Mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;get hm regCheck&amp;lt;/code&amp;gt;&lt;br /&gt;
wird überprüft, ob alle Register korrekt gelesen wurden. Mögliche Meldungen:&lt;br /&gt;
;missing register list &lt;br /&gt;
:ausgegebener Wert (z.B.): &amp;lt;code&amp;gt;dev01Ch01:  RegL_01: &amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: &amp;lt;code&amp;gt;set dev01Ch01 getConfig&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder &amp;lt;code&amp;gt;device01Ch01:	.RegL_03:sensor01Ch01,.RegL_03:sensor01Ch02&amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: Deutet darauf hin, dass nicht alle Informationen aus einem Device gelesen wurden. Ein set &amp;lt;Device&amp;gt; getConfig sollte alle Register auslesen. Sicherstellen, dass das Kommando zum Auslesen das entsprechende Device auch erreicht und eine Antwort geliefert hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
;Register changes pending &lt;br /&gt;
:ausgegebener Wert (z.B.): &amp;lt;code&amp;gt;sensor01Ch01&amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: Ein set &amp;lt;Device&amp;gt; getConfig sollte alle Register auslesen. Sicherstellen, dass das Kommando das entsprechende Device auch erreicht und eine Antwort geliefert hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
&lt;br /&gt;
=== configCheck ===&lt;br /&gt;
Mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;get hm configCheck&amp;lt;/code&amp;gt; werden die Befehle &#039;&#039;&#039;peerCheck&#039;&#039;&#039; und &#039;&#039;&#039;regCheck&#039;&#039;&#039; ausgeführt. Zusätzlich können noch Ergebnisse auftauchen wie&lt;br /&gt;
;PairedTo mismatch to IODev&lt;br /&gt;
:ausgegebener Wert (z.B.): &amp;lt;code&amp;gt;sensor01Ch01 paired:0x000000 IO attr: xxxxxx.&amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: IODevice in den hmPairForSec Modus versetzen, Pairing-Modus am Device aktivieren und dadurch das pairing wiederholen. Ein Anschließendes set &amp;lt;Device&amp;gt; getConfig kann nicht schaden. Sicherstellen, dass das Kommando zum Auslesen das entsprechende Device auch erreicht und eine Antwort geliefert hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
&lt;br /&gt;
== Anzeigen zur Übertragungssituation ==&lt;br /&gt;
===RSSI ===&lt;br /&gt;
;&amp;lt;code&amp;gt;get hm rssi [&amp;lt;filter&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erzeugt eine Tabelle aller RSSI Werte.&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm clear [&amp;lt;filter&amp;gt;] rssi&amp;lt;/code&amp;gt;&lt;br /&gt;
:setzt die RSSI Werte aller devices gemäß filter zurück. Eine neue Messung kann beginnen&lt;br /&gt;
&lt;br /&gt;
===protoEvents ===&lt;br /&gt;
;&amp;lt;code&amp;gt;get hm protoEvents [&amp;lt;filter&amp;gt;][short|long] &amp;lt;/code&amp;gt;&lt;br /&gt;
Siehe [[Himfo Protokol]]&lt;br /&gt;
:Es wird eine Tabelle mit allen wichtigen Ereignissen zur Datenübertragung erzeugt. Dies beinhaltet Wiederholungen sowie Übertragungsfehler. &lt;br /&gt;
&amp;lt;code&amp;gt;short&amp;lt;/code&amp;gt; ist eine Fassung ohne Zeitstempel und lässt sich besser am Bildschirm darstellen.&lt;br /&gt;
Ausserdem kann man sehen, welche Abfragen noch in der Queue sind, z.B. durch &amp;lt;code&amp;gt;autoReadReg&amp;lt;/code&amp;gt; erzeugt. &lt;br /&gt;
Die Zustände aller für HM zuständigen IOs sind beinhaltet. &lt;br /&gt;
Alles in allem ist hier ein kompletter Überblick zur Kommunikation zu sehen. Der Befehl&lt;br /&gt;
 set hm clear [&amp;lt;filter&amp;gt;] Protocol&lt;br /&gt;
setzt die Protokoleinträge aller HomeMatic-Geräte gemäß Filter zurück. Das kann gut vor einer Konfigurationsaktion genutzt werden um zu kontrollieren, ob Fehler aufgetreten sind.&lt;br /&gt;
Für tieferes Verständniss siehe [[Himfo Protokol]]&lt;br /&gt;
&lt;br /&gt;
===msgStat===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm msgStat &amp;lt;/code&amp;gt;&lt;br /&gt;
:Statistic der Übertragenen Messages insgesamt. Es gibt eine Tabelle über die letzten 24h und eine über die letzte Woche. &lt;br /&gt;
&lt;br /&gt;
== Speichern von Konfigurationen==&lt;br /&gt;
HMInfo speichert Konfigurationen der Geräte in Files. Mit dem Attribut configDir kann man ein Verzeichnis festlegen, in das alles geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
=== saveConfig===&lt;br /&gt;
[[Peering (HomeMatic)|Peers]] und Register werden in eine Datei geschrieben. Die Daten kann man ggf. wieder in ein Gerät oder ein Austauschgerät schreiben. Die Speicherung erfolgt kumulativ, man kann alles in eine Datei schreiben. &lt;br /&gt;
:&amp;lt;code&amp;gt;set hm saveConfig [&amp;lt;filter&amp;gt;] [&amp;lt;file&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== archConfig ===&lt;br /&gt;
Arbeitet prinzipiell wie saveConfig. Es werden jedoch nur vollständige Registersätze gespeichert, was einen höheren Level an Sicherheit der Dateninhalte gewährt.  &lt;br /&gt;
:&amp;lt;code&amp;gt;set hm archConfig [-a] [&amp;lt;file&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
Mit dem &#039;&#039;&#039;Attribut autoArchive&#039;&#039;&#039; kann man einstellen, dass automatisch nach erfolgreichem Lesen einer Device-Konfiguration diese archiviert wird. &lt;br /&gt;
Das Speichern erfolgt kumulativ. Ab einer Dateigröße von 1MB wird gepurged, also alles bis auf den neusten Eintrag jeder Entity gelöscht.  &lt;br /&gt;
&lt;br /&gt;
Um eine Konfiguration zu sichern, sollte eine Kopie des Archivs gemacht werden. Das Archiv wird bei Gelegenheit überschrieben. &lt;br /&gt;
&lt;br /&gt;
Template erstellen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set hm saveConfig -f ^meinDevice$ &amp;lt;myTemplateFile&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== loadConfig ===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm loadConfig [&amp;lt;filter&amp;gt;] [&amp;lt;filename&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest die Registerwerte, die für eine Entity in einem File gespeichert sind, zurück in die Readings. Sollten die Register schon in FHEM vorhanden sein, wird &#039;&#039;&#039;nicht&#039;&#039;&#039; überschrieben. &lt;br /&gt;
Sinn macht dies beispielsweise für remotes, die nicht automatisch gelesen werden sollen. Man kann somit nach einem system-reboot die Register &amp;quot;rekonstruieren&amp;quot; und wieder darstellen. &lt;br /&gt;
Es liegt im ermessen des User, eine bekannt aktuelle Version der Register einzulesen. &lt;br /&gt;
&lt;br /&gt;
=== purgeConfig===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm purgeConfig [&amp;lt;filename&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
:Löscht alle älteren Datensätze in einem File.&lt;br /&gt;
&lt;br /&gt;
== Konfigurationen bearbeiten ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
HMInfo erlaubt das Erstellen und Nutzen von Templates. Das sind Schablonen, die das Setzen von Registern abstrahieren und auf eine höhere Ebene heben. So kann man das Setzen der Konfiguration eines Aktors beispielsweise um mit einem Bewegungsmelder zusammen zu arbeiten in einem Kommando zusammenfassen.&lt;br /&gt;
Faktisch setzt das Template also eine Gruppe von Registern auf einmal.&lt;br /&gt;
&lt;br /&gt;
====templateList ====&lt;br /&gt;
Die vorhandenen templates kann man mit templateList sehen. &lt;br /&gt;
  get hm templateList&lt;br /&gt;
  &lt;br /&gt;
  SwOnCond         params:level cond               Info:switch: execute only if condition [geLo|ltLo] level is below limit&lt;br /&gt;
  SwToggle         params:                         Info:Switch: toggle on trigger&lt;br /&gt;
  autoOff          params:time                     Info:staircase - auto off after &amp;lt;time&amp;gt;, extend time with each trigger&lt;br /&gt;
  motionOnDim      params:ontime brightness        Info:Dimmer: on for time if MDIR-brightness below level&lt;br /&gt;
  motionOnSw       params:ontime brightness        Info:Switch: on for time if MDIR-brightness below level&lt;br /&gt;
Die Liste der verfügbaren Tempaltes, deren Parameter falls nötig und eine kurze Info, was das Template bewirken soll&lt;br /&gt;
&lt;br /&gt;
  get hm templateList autoOff&lt;br /&gt;
&lt;br /&gt;
  autoOff          params:time                     Info:staircase - auto off after &amp;lt;time&amp;gt;, extend time with each trigger&lt;br /&gt;
    ActionType       :jmpToTarget&lt;br /&gt;
    OffTime          :111600&lt;br /&gt;
    OnTime           :time&lt;br /&gt;
    SwJtDlyOff       :dlyOn&lt;br /&gt;
    SwJtDlyOn        :no&lt;br /&gt;
    SwJtOff          :dlyOn&lt;br /&gt;
    SwJtOn           :on&lt;br /&gt;
Ein templateList auf ein einzelnes Template zeigt im Detail, was das Template verändern wird.&lt;br /&gt;
&lt;br /&gt;
====templateSet ====&lt;br /&gt;
Um ein Template auf einen Aktor anzuwenden,muss man den Bereich wählen, auf den er angewendet werden soll. Je nach template kann das die Gruppe der Register zu einem [[Peering (HomeMatic)|Peer]], zu short oder long eines Peer oder Register ohne peer sein. &lt;br /&gt;
  set hm templateSet &amp;lt;entity&amp;gt; &amp;lt;templateName&amp;gt; &amp;lt;peer:[long|short]&amp;gt; [&amp;lt;param1&amp;gt; ...] &lt;br /&gt;
  set hm templateSet Licht1 autoOff FB1_Btn2:short 10&lt;br /&gt;
  set hm templateSet Licht1 SwOn FB1_Btn2:long&lt;br /&gt;
  set hm templateSet Licht1 SwOff FB1_Btn2:short&lt;br /&gt;
  set hm templateSet Licht1 SwOnOff FB1_Btn2:both&lt;br /&gt;
  set hm templateSet LichtDev setHost 0&lt;br /&gt;
Licht1 soll, wenn ein kurzer Trigger von FB1_Btn2 kommt für 10 sec eingeschaltet werden, dann ausgehen (Treppenhausfunktion). Kommt aber ein langer Tastendruck wird das Licht dauerhaft eingeschaltet. &lt;br /&gt;
  set hm templateSet Licht1 motionOnSw MD1:short 30 20&lt;br /&gt;
Der Switch Aktor Licht1 soll mit einem Bewegungsmelder betrieben werden. Der Bewegungsmelder sendet keine &#039;langen&#039; Trigger sondern nur kurze. Im Beispiel wird Licht1 für 30 Sekunden eingeschaltet, wenn der Bewegungsmelder einen Trigger sendet UND es dunkler ist als &amp;quot;20&amp;quot; (Brightness level).&lt;br /&gt;
&lt;br /&gt;
====templateDef ====&lt;br /&gt;
Neben den vorbereiteten Templates kann der User eigene definieren oder von anderen Usern sich Templates geben lassen. Die Definition von Templates ist für erfahrene User gedacht, im Gegensatz zur Nutzung eines Templates mit set - das ist für Anfänger gedacht. Man kann sein template manuell definieren oder ein bekanntes Device als Muster nutzen (fromMaster). Ein Template kann nur Gruppen von Registern setzen, nicht alle Register eines Device. Um die Gruppen anzusprechen muss man &amp;quot;peer&amp;quot; wie folgt setzen:&lt;br /&gt;
  0            Register ohne peer&lt;br /&gt;
  &amp;lt;peer&amp;gt;:both  Register eines peers&lt;br /&gt;
  &amp;lt;peer&amp;gt;:short Register eines peers nur Short&lt;br /&gt;
  &amp;lt;peer&amp;gt;:long  Register eines peers nur Long&lt;br /&gt;
setzen.&lt;br /&gt;
Man kann das template &amp;quot;dynamisch&amp;quot; gestalten, indem man einzelne Register beim templateSet übergibt. &lt;br /&gt;
Erst einmal statische Templates. Param ist hier &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  set hm templateDef &amp;lt;templateName&amp;gt; &amp;lt;param1[:&amp;lt;param2&amp;gt;...]&amp;gt; &amp;lt;description&amp;gt; &amp;lt;reg1&amp;gt;:&amp;lt;val1&amp;gt; [&amp;lt;reg2&amp;gt;:&amp;lt;val2&amp;gt;] ... &lt;br /&gt;
&lt;br /&gt;
  set hm templateDef t1 0 &amp;quot;TP1&amp;quot; OnTime:10 OffTime:20 OnDly:0 &lt;br /&gt;
&lt;br /&gt;
  set hm templateDef t1 fromMaster &amp;lt;entity&amp;gt; 0 &lt;br /&gt;
  set hm templateDef t2 fromMaster &amp;lt;entity&amp;gt; &amp;lt;peer&amp;gt;:both &lt;br /&gt;
  set hm templateDef t3 fromMaster &amp;lt;entity&amp;gt; &amp;lt;peer&amp;gt;:short&lt;br /&gt;
  set hm templateDef t4 fromMaster &amp;lt;entity&amp;gt; &amp;lt;peer&amp;gt;:long&lt;br /&gt;
&lt;br /&gt;
  set hm templateDef t4 fromMaster LichtWz remoteBtn1:long&lt;br /&gt;
&lt;br /&gt;
Dynamische Templates haben eine Parameterliste (bis zu 9) &amp;lt;param1[:&amp;lt;param2&amp;gt;...]&amp;gt;. Diese werden als p0 bis p8 genutzt - der Name ist dabei egal, er dient dem User also Hilfe beim templateList&lt;br /&gt;
 &lt;br /&gt;
  set hm templateDef myTemplate anzeit:auszeit &amp;quot;licht schaltet ständig an und aus&amp;quot; OnTime:p0 OffTime:p1 OnDly:0&lt;br /&gt;
&lt;br /&gt;
  set hm templateDef myAutoOff AnZeit &amp;quot;treppenhausschalter&amp;quot; ActionType:jmpToTarget OffTime:unused OnTime:p0 SwJtDlyOff:dlyOn SwJtDlyOn:no SwJtOff:dlyOn SwJtOn:on&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;Anzeit&amp;quot; ist der erste Parameter, also p0. Der Wert, den man bei Set einträgt wird in OnTime geschrieben. OnTime:p0&lt;br /&gt;
&lt;br /&gt;
Beim Definieren eines Templates wird die Registergültigkeit nicht geprüft. Das kommt beim Set.&lt;br /&gt;
&lt;br /&gt;
Mit dem Parameter del kann ein (fehlerhaftes) Template (hier myTemplate) wieder gelöscht werden. &lt;br /&gt;
&lt;br /&gt;
  set hm templateDef myTemplate del&lt;br /&gt;
&lt;br /&gt;
====templateChk ====&lt;br /&gt;
Template definitionen und zuweisungen (set) kann man mit &lt;br /&gt;
  set hm archConfig&lt;br /&gt;
speichern und mit &lt;br /&gt;
  set hm loadConfig&lt;br /&gt;
mach einem reboot laden. Welche templates einer entity zugewiesen sind kann man mit &lt;br /&gt;
  attr &amp;lt;entity&amp;gt; expert 12&lt;br /&gt;
in den Readings sichtbar machen. Siehe auch templateUsg.&lt;br /&gt;
&lt;br /&gt;
Man kann prüfen, ob ein Aktor/[[Peering (HomeMatic)|Peer]] gemäss einem Template programmiert ist. Sinnvoll ist eine komplette Prüfung aller zugewiesenen templates. Man kann aber auch filtern. &lt;br /&gt;
  get hm templateChk &lt;br /&gt;
  get hm templateChk [&amp;lt;filter&amp;gt;] &lt;br /&gt;
  get hm templateChk [&amp;lt;filter&amp;gt;] &amp;lt;templateName&amp;gt; &amp;lt;peer:[long|short]&amp;gt; [&amp;lt;param1&amp;gt; ...] &lt;br /&gt;
  get hm templateChk -f Rollo RolloHoch self01 5&lt;br /&gt;
Es wird geprüft für alle HM-Komponenten, die &amp;quot;Rollo&amp;quot; im Namen haben (siehe [[Homematic HMInfo#Filter|Filter]]) dem (hoffentlich vorhandenen) template &amp;quot;RolloHoch&amp;quot; verglichen. Geprüft wird nur der Peer &amp;quot;self01&amp;quot;, aber für long UND short.&lt;br /&gt;
  get hm templateChk -f Rollo RolloHoch self01:sort 5&lt;br /&gt;
das selbe, nur für short Einträge&lt;br /&gt;
&lt;br /&gt;
====templateUsg ====&lt;br /&gt;
Gibt eine Liste der zugewiesenen templates zurück&lt;br /&gt;
  get hm templateUsg  &lt;br /&gt;
  get hm templateUsg sortTemplate&lt;br /&gt;
  get hm templateUsg sortPeer&lt;br /&gt;
&lt;br /&gt;
====templateExe ====&lt;br /&gt;
Nach einem loadConfig oder einem templateChk können Fehler erkannt worden sein, die Register entspreche nicht dem Template. Mit diesem Kommando werden alle nicht korrekten Register in die Devices geschrieben. Sollte die Werte stimmen wird nichts gemacht. &lt;br /&gt;
  set hm templateExe&lt;br /&gt;
&lt;br /&gt;
Das Kommando kann also bedenkenlos eingesetzt werden, wenn die templates schon stimmen. Es wird nichts gesendet, keine Funklast erzeugt.&lt;br /&gt;
&lt;br /&gt;
====templateDel ====&lt;br /&gt;
eine zuweisung des Templates kann gelöscht werden&lt;br /&gt;
  set hm templateDel &amp;lt;entity&amp;gt; &amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Temperaturlisten===&lt;br /&gt;
HMInfo bietet verschiedene Methoden, Temperaturlisten für Thermostate (CC-TC, TC-IT oder RT) zu verwalten und zu nutzen. Siehe hierzu [[HomeMatic HMInfo TempList/Weekplan|Homematic Weekplan]]&lt;br /&gt;
&lt;br /&gt;
=== Registersätze kopieren ===&lt;br /&gt;
HMInfo erlaubt das Kopieren von Register-Listen. Über Register wird ein HM-Gerät eingestellt und die Register sind in Listen gruppiert. Die Reaktion und das Verhalten eines Aktors auf einen Trigger eines Sensors wird in dem Registersatz zu diesem [[Peering (HomeMatic)|Peer]] komplett beschrieben. &lt;br /&gt;
Durch die Möglichkeit einen solchen Registersatz im Device zu kopieren kann man das Verhalten, das man für einen Knopf/Sensor festgelegt hat identisch in einen zweiten kopieren. &lt;br /&gt;
HMInfo geht davon aus, dass die vom Gerät gelesene Konfiguration vor dem Kommando aktuell und komplett ist. &lt;br /&gt;
 set hm cpRegs Licht1:FB3_Btn2 Licht3:FB1_Btn4&lt;br /&gt;
 set hm cpRegs Licht2:FB3_Btn2 Licht2:FB1_Btn4&lt;br /&gt;
 set hm cpRegs Licht4:FB3_Btn2 Licht4:FB5_Btn2&lt;br /&gt;
Die obigen Beispiele bewirken der Reihe nach:&lt;br /&gt;
Duplizieren das Verhalten, das Fernbedienungsknopf 2 der Fernbedienung 3 bei Aktor Licht1 hervorruft auch nach Licht3 für Fernbedienungsknopf4 der Fernbedienung 1.&lt;br /&gt;
Duplizieren das Verhalten, das Fernbedienungsknopf 2 der Fernbedienung 3 bei Aktor Licht2 hervorruft auch nach Licht2 (selber Aktor) für Fernbedienungsknopf4 der Fernbedienung 1.&lt;br /&gt;
&lt;br /&gt;
== Web Einträge und Readings ==&lt;br /&gt;
Readings und Internals von HMInfo bieten eine Zusammenfassung des Zustands aller HM Komponenten. Diese sind in Fehler &#039;&#039;&#039;ERR&#039; , Warnungen &#039;&#039;&#039;W_&#039;&#039;&#039; und Information &#039;&#039;&#039;I_&#039;&#039;&#039; untergliedert. Die Prüfung und Erneuerung der Zähler und Werte wird mit:&lt;br /&gt;
:&amp;lt;code&amp;gt;set hm update &amp;lt;/code&amp;gt;&lt;br /&gt;
erreicht. Mit dem Attribut autoUpdate kann man es automatisch regelmäßig starten.&lt;br /&gt;
&lt;br /&gt;
=== Fehlermeldungen ===&lt;br /&gt;
Als Fehler erkannte Zustände werden in Variablen beginnend mit &#039;&#039;&#039;ERR&#039;&#039;&#039; dargestellt. Erfasste Fehler sind kritische RSSI Werte und Protokoll-/Übertragungsfehler. Ausserdem kann man im Attribut sumERROR eintragen, welche Readings zu einer Fehlermeldung führen sollen. Eingetragen werden:&lt;br /&gt;
Reading:&amp;lt;gutwert&amp;gt;. Wenn ein Reading mit einen anderen als dem &amp;quot;gutwert&amp;quot; gefunden wird, wird dies alarmiert. &lt;br /&gt;
Beispiel: &lt;br /&gt;
:&amp;lt;code&amp;gt;battery:ok &amp;lt;/code&amp;gt;&lt;br /&gt;
hat eine HM Komponente ein Reading &amp;quot;battery&amp;quot; und dieses hat einen anderen Wert als &amp;quot;ok&amp;quot; wird dies alarmiert. &lt;br /&gt;
In den Readings von HMInfo würde im Feherfall&lt;br /&gt;
  internal:&lt;br /&gt;
    ERR_names &amp;lt;devicename1&amp;gt;,&amp;lt;devicename2&amp;gt;&lt;br /&gt;
  Readings:&lt;br /&gt;
    ERR_battery low:2&lt;br /&gt;
&lt;br /&gt;
Der default aller Error-meldungen ist&lt;br /&gt;
battery:ok,sabotageError:off,powerError:ok,overload:off,overheat:off,reduced:off,motorError:no,error:none,uncertain:yes,smoke_detect:none,cover:closed&lt;br /&gt;
&lt;br /&gt;
Diese Zusammenfassung der Fehlermeldungen könnte man nutzen, um über notify einen Alarm auszulösen oder eine E-Mail zu senden. &lt;br /&gt;
&lt;br /&gt;
=== Warnungen===&lt;br /&gt;
Hierzu gehören Wiederholungen von Nachrichten (nicht aber Abbrüche, das sind Fehler). Es wird auch ausstehendes Lesen der Konfiguration, das durch autoReadReg getriggert wird, hier angezeigt. &lt;br /&gt;
&lt;br /&gt;
=== Statusmeldungen ===&lt;br /&gt;
Analog zu den Fehlermeldungen kann man mit dem Attribut sumStatus gewisse Readings zählen lassen. Beipiel wäre &lt;br /&gt;
  attr HM sumStatus motor&lt;br /&gt;
HMInfo zeigt in dem Reading I_sum_motor dann an, welcher Inhalt des Readings &amp;quot;motor&amp;quot;  wie oft gefunden wurde. Es könnte so aussehen&lt;br /&gt;
  stop:on:4;stop:1;&lt;br /&gt;
Vier Komponenten stehen auf motor: stop:on und eine steht auf motor: stop&lt;br /&gt;
&lt;br /&gt;
Das Internal &#039;&#039;&#039;I_HM_IOdevices&#039;&#039;&#039; zeigt die von HM Komponenten genutzten IOs und deren State. &lt;br /&gt;
&lt;br /&gt;
== Infos ==&lt;br /&gt;
  get hm models [-f &amp;lt;regexp&amp;gt;]&lt;br /&gt;
  get hm models&lt;br /&gt;
  get hm models -f remote&lt;br /&gt;
  get hm models -f HM_RC&lt;br /&gt;
Zeigt alle in FHEM unterstützten Modelle und deren wesentliche Parameter. Man kann mittels regexp die Liste filtern.&lt;br /&gt;
&lt;br /&gt;
  get hm param [&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;] parameter1 parameter2&lt;br /&gt;
  get hm param -d IODev DEF model&lt;br /&gt;
  get hm param -c -f Rollo peerList&lt;br /&gt;
man kann sich listen von Parametern anzeigen lassen  &lt;br /&gt;
&lt;br /&gt;
  get hm register [&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;]&lt;br /&gt;
zeigt Register in tabellarischer Form. &lt;br /&gt;
&lt;br /&gt;
  get hm peerXref[&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;]&lt;br /&gt;
gibt an, wer mit wem [[Peering (HomeMatic)|gepeert]] ist&lt;br /&gt;
&lt;br /&gt;
== Rücksetzen von Variablen und Zählern ==&lt;br /&gt;
 set HM clear [&amp;lt;typeFilter&amp;gt;] [Protocol|readings|msgStat|register|rssi]&lt;br /&gt;
*register löscht alle Register-readings&lt;br /&gt;
*readings löscht &#039;&#039;&#039;alle&#039;&#039;&#039; readings&lt;br /&gt;
*Protocol löscht alle Protokol-einträge, pending Kommandos und Protokoll-fehler. &lt;br /&gt;
*rssi löscht alle ermittelten RSSI Werte&lt;br /&gt;
*msgStat setzt die Message Statistik zurück&lt;br /&gt;
&lt;br /&gt;
== Filter ==&lt;br /&gt;
Kommandos in HMInfo wirken auf alle HM Komponenten. Man kann dies mit Hilfe der Filter einschränken. Zum einen gibt es &#039;&#039;&#039;modelsFilter&#039;&#039;&#039;, womit man nur devices, nur channels, nur virtuelle Entities bearbeiten kann&lt;br /&gt;
     set &amp;lt;name&amp;gt; &amp;lt;cmd&amp;gt; &#039;&#039;&#039;[-dcasevi]&#039;&#039;&#039;  [params]&lt;br /&gt;
        entities according to list will be processed&amp;quot;&lt;br /&gt;
          d - device   :include devices&amp;quot;&lt;br /&gt;
          c - channels :include channels&amp;quot;&lt;br /&gt;
          i - ignore   :include devices marked as ignore&amp;quot;&lt;br /&gt;
          v - virtual  :supress fhem virtual&amp;quot;&lt;br /&gt;
          p - physical :supress physical&amp;quot;&lt;br /&gt;
          a - aktor    :supress actor&amp;quot;&lt;br /&gt;
          s - sensor   :supress sensor&amp;quot;&lt;br /&gt;
          e - empty    :include results even if requested fields are empty&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein auf &#039;&#039;&#039;-d&#039;&#039;&#039; gefiltertes Kommando wird nur auf devices, nicht aber auf channels angewendet. &lt;br /&gt;
&lt;br /&gt;
Dann gibt es noch den &#039;&#039;&#039;nameFilter&#039;&#039;&#039;, mit dem mittels regexp auf den Namen der Entity gefiltert werden kann&lt;br /&gt;
  -f Rollo # alle Entities mit Rollo im Namen&lt;br /&gt;
  -f ^Rollo$ # nur Entity mit Namen &amp;quot;Rollo&amp;quot;&lt;br /&gt;
  -f Rollo$ # nur Entity deren Name auf Rollo endet&lt;br /&gt;
&lt;br /&gt;
Die Filter kann man kombinieren mit &lt;br /&gt;
  -c -f Rollo # alle Kanäle mit Rollo im Namen&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
Zeige mir die Parameter IODev und room der Devices mit Rollo im Namen&lt;br /&gt;
  set hm param -d -f Rollo IODev room&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
* &#039;&#039;&#039;autoArchive &#039;&#039;&#039; automatisch archivieren von vollständigen Konfigurationen.&lt;br /&gt;
* &#039;&#039;&#039;autoUpdate&#039;&#039;&#039; startet regelmäßig das Komamndo &amp;quot;update&amp;quot;. Die Wiederholzeit wird eingestellt mit hh:mm. Sinnvoll erscheint z.B. alle 5 Minuten, also 00:05.&lt;br /&gt;
* &#039;&#039;&#039;configDir&#039;&#039;&#039; bietet die Möglichkeit, ein Verzeichnis zu definieren, in das HMInfo Dateien ablegen und von dem es die Dateien lesen wird. Default ist fhem_root.&lt;br /&gt;
* &#039;&#039;&#039;configFilename&#039;&#039;&#039; legt einen default Namen fest, der bei save und archive genutzt wird. Default ist regSave.cfg.&lt;br /&gt;
* &#039;&#039;&#039;hmAutoReadScan&#039;&#039;&#039; zeitinterval in Minuten, in denen CUL_HM prüft, ob offene autoRead bereitstehen und die IOs die Kapazität haben. Default ist 4 min.&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
* [[HomeMatic Templates]]&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
* Thread [http://forum.fhem.de/index.php?topic=11035.0 HMinfo] im FHEM Forum&lt;br /&gt;
* Thread {{Link2Forum|Topic=20119|LinkText=HMINfo, Intention, Sinn und Zweck}} im FHEM Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMinfo&amp;diff=24306</id>
		<title>HMinfo</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMinfo&amp;diff=24306"/>
		<updated>2018-01-04T16:37:30Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Übersicht über alle HomeMatic Geräte&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMinfo&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMinfo.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HMInfo&#039;&#039;&#039; ist ein Modul, das einen Überblick über alle definierten [[HomeMatic]] Geräte gibt. Es bietet Funktionen zur Übersicht, Kontrolle, Archivierung  und, begrenzt, zur Programmierung der HomeMatic Komponenten. Somit soll es eine Hilfestellung bei Konfiguration und Fehlerbehandlung geben. &lt;br /&gt;
 &lt;br /&gt;
== Definition == &lt;br /&gt;
HMInfo wird erstellt / angelegt mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;define hm HMinfo&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach können alle Funktionen aufgelistet werden mit&lt;br /&gt;
:&amp;lt;code&amp;gt;get hm help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integritätsprüfungen ==&lt;br /&gt;
Zur berücksichtigen bei allen Funktionen von HMInfo ist die Tatsache, dass die Prüfung jeweils auf den innerhalb von FHEM vorliegenden Informationen passiert. Erste Korrekturmaßnahme ist daher immer von den betroffenen Devices die Informationen mit einem set &amp;lt;Device&amp;gt; getConfig zu aktualisieren. Dabei ist darüber hinaus zu berücksichtigen, dass entsprechend der konfigurierten Kommunikationsmethode (z.B. config) einige Devices erst nach einer gewissen Zeit oder nach Betätigen der Anlerntaste die Informationen als Antwort zurückliefern.&lt;br /&gt;
&lt;br /&gt;
Befehle, um die Gültigkeit von verschiedenen HomeMatic Eigenschaften zu überprüfen:&lt;br /&gt;
&lt;br /&gt;
=== peerCheck ===&lt;br /&gt;
Mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;get hm peerCheck&amp;lt;/code&amp;gt;&lt;br /&gt;
wird der Zustand der Peerings überprüft, d.h., ob alle [[Peering (HomeMatic)|Peerings]] auch beidseitig sind. Mögliche Meldungen, die eine Überarbeitung und/oder Korrektur von Definitionen erforderlich machen können:&lt;br /&gt;
;peer not verified. Check that peer is set on both sides &lt;br /&gt;
:ausgegebener Wert (z.B.): actorChan p:switchChan&lt;br /&gt;
:erforderliche Korrekturmaßnahme: Erneutes setzen des Links und Sicherstellen, dass das Kommando das entsprechende Device auch erreicht hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
&lt;br /&gt;
=== regCheck ===&lt;br /&gt;
Mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;get hm regCheck&amp;lt;/code&amp;gt;&lt;br /&gt;
wird überprüft, ob alle Register korrekt gelesen wurden. Mögliche Meldungen:&lt;br /&gt;
;missing register list &lt;br /&gt;
:ausgegebener Wert (z.B.): &amp;lt;code&amp;gt;dev01Ch01:  RegL_01: &amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: &amp;lt;code&amp;gt;set dev01Ch01 getConfig&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder &amp;lt;code&amp;gt;device01Ch01:	.RegL_03:sensor01Ch01,.RegL_03:sensor01Ch02&amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: Deutet darauf hin, dass nicht alle Informationen aus einem Device gelesen wurden. Ein set &amp;lt;Device&amp;gt; getConfig sollte alle Register auslesen. Sicherstellen, dass das Kommando zum Auslesen das entsprechende Device auch erreicht und eine Antwort geliefert hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
;Register changes pending &lt;br /&gt;
:ausgegebener Wert (z.B.): &amp;lt;code&amp;gt;sensor01Ch01&amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: Ein set &amp;lt;Device&amp;gt; getConfig sollte alle Register auslesen. Sicherstellen, dass das Kommando das entsprechende Device auch erreicht und eine Antwort geliefert hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
&lt;br /&gt;
=== configCheck ===&lt;br /&gt;
Mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;get hm configCheck&amp;lt;/code&amp;gt; werden die Befehle &#039;&#039;&#039;peerCheck&#039;&#039;&#039; und &#039;&#039;&#039;regCheck&#039;&#039;&#039; ausgeführt. Zusätzlich können noch Ergebnisse auftauchen wie&lt;br /&gt;
;PairedTo mismatch to IODev&lt;br /&gt;
:ausgegebener Wert (z.B.): &amp;lt;code&amp;gt;sensor01Ch01 paired:0x000000 IO attr: xxxxxx.&amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: IODevice in den hmPairForSec Modus versetzen, Pairing-Modus am Device aktivieren und dadurch das pairing wiederholen. Ein Anschließendes set &amp;lt;Device&amp;gt; getConfig kann nicht schaden. Sicherstellen, dass das Kommando zum Auslesen das entsprechende Device auch erreicht und eine Antwort geliefert hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
&lt;br /&gt;
== Anzeigen zur Übertragungssituation ==&lt;br /&gt;
===RSSI ===&lt;br /&gt;
;&amp;lt;code&amp;gt;get hm rssi [&amp;lt;filter&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erzeugt eine Tabelle aller RSSI Werte.&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm clear [&amp;lt;filter&amp;gt;] rssi&amp;lt;/code&amp;gt;&lt;br /&gt;
:setzt die RSSI Werte aller devices gemäß filter zurück. Eine neue Messung kann beginnen&lt;br /&gt;
&lt;br /&gt;
===protoEvents ===&lt;br /&gt;
;&amp;lt;code&amp;gt;get hm protoEvents [&amp;lt;filter&amp;gt;][short|long] &amp;lt;/code&amp;gt;&lt;br /&gt;
* [[Himfo Protokol]]&lt;br /&gt;
:Es wird eine Tabelle mit allen wichtigen Ereignissen zur Datenübertragung erzeugt. Dies beinhaltet Wiederholungen sowie Übertragungsfehler. &lt;br /&gt;
&amp;lt;code&amp;gt;short&amp;lt;/code&amp;gt; ist eine Fassung ohne Zeitstempel und lässt sich besser am Bildschirm darstellen.&lt;br /&gt;
Ausserdem kann man sehen, welche Abfragen noch in der Queue sind, z.B. durch &amp;lt;code&amp;gt;autoReadReg&amp;lt;/code&amp;gt; erzeugt. &lt;br /&gt;
Die Zustände aller für HM zuständigen IOs sind beinhaltet. &lt;br /&gt;
Alles in allem ist hier ein kompletter Überblick zur Kommunikation zu sehen. Der Befehl&lt;br /&gt;
 set hm clear [&amp;lt;filter&amp;gt;] Protocol&lt;br /&gt;
setzt die Protokoleinträge aller HomeMatic-Geräte gemäß Filter zurück. Das kann gut vor einer Konfigurationsaktion genutzt werden um zu kontrollieren, ob Fehler aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
===msgStat===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm msgStat &amp;lt;/code&amp;gt;&lt;br /&gt;
:Statistic der Übertragenen Messages insgesamt. Es gibt eine Tabelle über die letzten 24h und eine über die letzte Woche. &lt;br /&gt;
&lt;br /&gt;
== Speichern von Konfigurationen==&lt;br /&gt;
HMInfo speichert Konfigurationen der Geräte in Files. Mit dem Attribut configDir kann man ein Verzeichnis festlegen, in das alles geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
=== saveConfig===&lt;br /&gt;
[[Peering (HomeMatic)|Peers]] und Register werden in eine Datei geschrieben. Die Daten kann man ggf. wieder in ein Gerät oder ein Austauschgerät schreiben. Die Speicherung erfolgt kumulativ, man kann alles in eine Datei schreiben. &lt;br /&gt;
:&amp;lt;code&amp;gt;set hm saveConfig [&amp;lt;filter&amp;gt;] [&amp;lt;file&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== archConfig ===&lt;br /&gt;
Arbeitet prinzipiell wie saveConfig. Es werden jedoch nur vollständige Registersätze gespeichert, was einen höheren Level an Sicherheit der Dateninhalte gewährt.  &lt;br /&gt;
:&amp;lt;code&amp;gt;set hm archConfig [-a] [&amp;lt;file&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
Mit dem &#039;&#039;&#039;Attribut autoArchive&#039;&#039;&#039; kann man einstellen, dass automatisch nach erfolgreichem Lesen einer Device-Konfiguration diese archiviert wird. &lt;br /&gt;
Das Speichern erfolgt kumulativ. Ab einer Dateigröße von 1MB wird gepurged, also alles bis auf den neusten Eintrag jeder Entity gelöscht.  &lt;br /&gt;
&lt;br /&gt;
Um eine Konfiguration zu sichern, sollte eine Kopie des Archivs gemacht werden. Das Archiv wird bei Gelegenheit überschrieben. &lt;br /&gt;
&lt;br /&gt;
Template erstellen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set hm saveConfig -f ^meinDevice$ &amp;lt;myTemplateFile&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== loadConfig ===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm loadConfig [&amp;lt;filter&amp;gt;] [&amp;lt;filename&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest die Registerwerte, die für eine Entity in einem File gespeichert sind, zurück in die Readings. Sollten die Register schon in FHEM vorhanden sein, wird &#039;&#039;&#039;nicht&#039;&#039;&#039; überschrieben. &lt;br /&gt;
Sinn macht dies beispielsweise für remotes, die nicht automatisch gelesen werden sollen. Man kann somit nach einem system-reboot die Register &amp;quot;rekonstruieren&amp;quot; und wieder darstellen. &lt;br /&gt;
Es liegt im ermessen des User, eine bekannt aktuelle Version der Register einzulesen. &lt;br /&gt;
&lt;br /&gt;
=== purgeConfig===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm purgeConfig [&amp;lt;filename&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
:Löscht alle älteren Datensätze in einem File.&lt;br /&gt;
&lt;br /&gt;
== Konfigurationen bearbeiten ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
HMInfo erlaubt das Erstellen und Nutzen von Templates. Das sind Schablonen, die das Setzen von Registern abstrahieren und auf eine höhere Ebene heben. So kann man das Setzen der Konfiguration eines Aktors beispielsweise um mit einem Bewegungsmelder zusammen zu arbeiten in einem Kommando zusammenfassen.&lt;br /&gt;
Faktisch setzt das Template also eine Gruppe von Registern auf einmal.&lt;br /&gt;
&lt;br /&gt;
====templateList ====&lt;br /&gt;
Die vorhandenen templates kann man mit templateList sehen. &lt;br /&gt;
  get hm templateList&lt;br /&gt;
  &lt;br /&gt;
  SwOnCond         params:level cond               Info:switch: execute only if condition [geLo|ltLo] level is below limit&lt;br /&gt;
  SwToggle         params:                         Info:Switch: toggle on trigger&lt;br /&gt;
  autoOff          params:time                     Info:staircase - auto off after &amp;lt;time&amp;gt;, extend time with each trigger&lt;br /&gt;
  motionOnDim      params:ontime brightness        Info:Dimmer: on for time if MDIR-brightness below level&lt;br /&gt;
  motionOnSw       params:ontime brightness        Info:Switch: on for time if MDIR-brightness below level&lt;br /&gt;
Die Liste der verfügbaren Tempaltes, deren Parameter falls nötig und eine kurze Info, was das Template bewirken soll&lt;br /&gt;
&lt;br /&gt;
  get hm templateList autoOff&lt;br /&gt;
&lt;br /&gt;
  autoOff          params:time                     Info:staircase - auto off after &amp;lt;time&amp;gt;, extend time with each trigger&lt;br /&gt;
    ActionType       :jmpToTarget&lt;br /&gt;
    OffTime          :111600&lt;br /&gt;
    OnTime           :time&lt;br /&gt;
    SwJtDlyOff       :dlyOn&lt;br /&gt;
    SwJtDlyOn        :no&lt;br /&gt;
    SwJtOff          :dlyOn&lt;br /&gt;
    SwJtOn           :on&lt;br /&gt;
Ein templateList auf ein einzelnes Template zeigt im Detail, was das Template verändern wird.&lt;br /&gt;
&lt;br /&gt;
====templateSet ====&lt;br /&gt;
Um ein Template auf einen Aktor anzuwenden,muss man den Bereich wählen, auf den er angewendet werden soll. Je nach template kann das die Gruppe der Register zu einem [[Peering (HomeMatic)|Peer]], zu short oder long eines Peer oder Register ohne peer sein. &lt;br /&gt;
  set hm templateSet &amp;lt;entity&amp;gt; &amp;lt;templateName&amp;gt; &amp;lt;peer:[long|short]&amp;gt; [&amp;lt;param1&amp;gt; ...] &lt;br /&gt;
  set hm templateSet Licht1 autoOff FB1_Btn2:short 10&lt;br /&gt;
  set hm templateSet Licht1 SwOn FB1_Btn2:long&lt;br /&gt;
  set hm templateSet Licht1 SwOff FB1_Btn2:short&lt;br /&gt;
  set hm templateSet Licht1 SwOnOff FB1_Btn2:both&lt;br /&gt;
  set hm templateSet LichtDev setHost 0&lt;br /&gt;
Licht1 soll, wenn ein kurzer Trigger von FB1_Btn2 kommt für 10 sec eingeschaltet werden, dann ausgehen (Treppenhausfunktion). Kommt aber ein langer Tastendruck wird das Licht dauerhaft eingeschaltet. &lt;br /&gt;
  set hm templateSet Licht1 motionOnSw MD1:short 30 20&lt;br /&gt;
Der Switch Aktor Licht1 soll mit einem Bewegungsmelder betrieben werden. Der Bewegungsmelder sendet keine &#039;langen&#039; Trigger sondern nur kurze. Im Beispiel wird Licht1 für 30 Sekunden eingeschaltet, wenn der Bewegungsmelder einen Trigger sendet UND es dunkler ist als &amp;quot;20&amp;quot; (Brightness level).&lt;br /&gt;
&lt;br /&gt;
====templateDef ====&lt;br /&gt;
Neben den vorbereiteten Templates kann der User eigene definieren oder von anderen Usern sich Templates geben lassen. Die Definition von Templates ist für erfahrene User gedacht, im Gegensatz zur Nutzung eines Templates mit set - das ist für Anfänger gedacht. Man kann sein template manuell definieren oder ein bekanntes Device als Muster nutzen (fromMaster). Ein Template kann nur Gruppen von Registern setzen, nicht alle Register eines Device. Um die Gruppen anzusprechen muss man &amp;quot;peer&amp;quot; wie folgt setzen:&lt;br /&gt;
  0            Register ohne peer&lt;br /&gt;
  &amp;lt;peer&amp;gt;:both  Register eines peers&lt;br /&gt;
  &amp;lt;peer&amp;gt;:short Register eines peers nur Short&lt;br /&gt;
  &amp;lt;peer&amp;gt;:long  Register eines peers nur Long&lt;br /&gt;
setzen.&lt;br /&gt;
Man kann das template &amp;quot;dynamisch&amp;quot; gestalten, indem man einzelne Register beim templateSet übergibt. &lt;br /&gt;
Erst einmal statische Templates. Param ist hier &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  set hm templateDef &amp;lt;templateName&amp;gt; &amp;lt;param1[:&amp;lt;param2&amp;gt;...]&amp;gt; &amp;lt;description&amp;gt; &amp;lt;reg1&amp;gt;:&amp;lt;val1&amp;gt; [&amp;lt;reg2&amp;gt;:&amp;lt;val2&amp;gt;] ... &lt;br /&gt;
&lt;br /&gt;
  set hm templateDef t1 0 &amp;quot;TP1&amp;quot; OnTime:10 OffTime:20 OnDly:0 &lt;br /&gt;
&lt;br /&gt;
  set hm templateDef t1 fromMaster &amp;lt;entity&amp;gt; 0 &lt;br /&gt;
  set hm templateDef t2 fromMaster &amp;lt;entity&amp;gt; &amp;lt;peer&amp;gt;:both &lt;br /&gt;
  set hm templateDef t3 fromMaster &amp;lt;entity&amp;gt; &amp;lt;peer&amp;gt;:short&lt;br /&gt;
  set hm templateDef t4 fromMaster &amp;lt;entity&amp;gt; &amp;lt;peer&amp;gt;:long&lt;br /&gt;
&lt;br /&gt;
  set hm templateDef t4 fromMaster LichtWz remoteBtn1:long&lt;br /&gt;
&lt;br /&gt;
Dynamische Templates haben eine Parameterliste (bis zu 9) &amp;lt;param1[:&amp;lt;param2&amp;gt;...]&amp;gt;. Diese werden als p0 bis p8 genutzt - der Name ist dabei egal, er dient dem User also Hilfe beim templateList&lt;br /&gt;
 &lt;br /&gt;
  set hm templateDef myTemplate anzeit:auszeit &amp;quot;licht schaltet ständig an und aus&amp;quot; OnTime:p0 OffTime:p1 OnDly:0&lt;br /&gt;
&lt;br /&gt;
  set hm templateDef myAutoOff AnZeit &amp;quot;treppenhausschalter&amp;quot; ActionType:jmpToTarget OffTime:unused OnTime:p0 SwJtDlyOff:dlyOn SwJtDlyOn:no SwJtOff:dlyOn SwJtOn:on&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;Anzeit&amp;quot; ist der erste Parameter, also p0. Der Wert, den man bei Set einträgt wird in OnTime geschrieben. OnTime:p0&lt;br /&gt;
&lt;br /&gt;
Beim Definieren eines Templates wird die Registergültigkeit nicht geprüft. Das kommt beim Set.&lt;br /&gt;
&lt;br /&gt;
Mit dem Parameter del kann ein (fehlerhaftes) Template (hier myTemplate) wieder gelöscht werden. &lt;br /&gt;
&lt;br /&gt;
  set hm templateDef myTemplate del&lt;br /&gt;
&lt;br /&gt;
====templateChk ====&lt;br /&gt;
Template definitionen und zuweisungen (set) kann man mit &lt;br /&gt;
  set hm archConfig&lt;br /&gt;
speichern und mit &lt;br /&gt;
  set hm loadConfig&lt;br /&gt;
mach einem reboot laden. Welche templates einer entity zugewiesen sind kann man mit &lt;br /&gt;
  attr &amp;lt;entity&amp;gt; expert 12&lt;br /&gt;
in den Readings sichtbar machen. Siehe auch templateUsg.&lt;br /&gt;
&lt;br /&gt;
Man kann prüfen, ob ein Aktor/[[Peering (HomeMatic)|Peer]] gemäss einem Template programmiert ist. Sinnvoll ist eine komplette Prüfung aller zugewiesenen templates. Man kann aber auch filtern. &lt;br /&gt;
  get hm templateChk &lt;br /&gt;
  get hm templateChk [&amp;lt;filter&amp;gt;] &lt;br /&gt;
  get hm templateChk [&amp;lt;filter&amp;gt;] &amp;lt;templateName&amp;gt; &amp;lt;peer:[long|short]&amp;gt; [&amp;lt;param1&amp;gt; ...] &lt;br /&gt;
  get hm templateChk -f Rollo RolloHoch self01 5&lt;br /&gt;
Es wird geprüft für alle HM-Komponenten, die &amp;quot;Rollo&amp;quot; im Namen haben (siehe [[Homematic HMInfo#Filter|Filter]]) dem (hoffentlich vorhandenen) template &amp;quot;RolloHoch&amp;quot; verglichen. Geprüft wird nur der Peer &amp;quot;self01&amp;quot;, aber für long UND short.&lt;br /&gt;
  get hm templateChk -f Rollo RolloHoch self01:sort 5&lt;br /&gt;
das selbe, nur für short Einträge&lt;br /&gt;
&lt;br /&gt;
====templateUsg ====&lt;br /&gt;
Gibt eine Liste der zugewiesenen templates zurück&lt;br /&gt;
  get hm templateUsg  &lt;br /&gt;
  get hm templateUsg sortTemplate&lt;br /&gt;
  get hm templateUsg sortPeer&lt;br /&gt;
&lt;br /&gt;
====templateExe ====&lt;br /&gt;
Nach einem loadConfig oder einem templateChk können Fehler erkannt worden sein, die Register entspreche nicht dem Template. Mit diesem Kommando werden alle nicht korrekten Register in die Devices geschrieben. Sollte die Werte stimmen wird nichts gemacht. &lt;br /&gt;
  set hm templateExe&lt;br /&gt;
&lt;br /&gt;
Das Kommando kann also bedenkenlos eingesetzt werden, wenn die templates schon stimmen. Es wird nichts gesendet, keine Funklast erzeugt.&lt;br /&gt;
&lt;br /&gt;
====templateDel ====&lt;br /&gt;
eine zuweisung des Templates kann gelöscht werden&lt;br /&gt;
  set hm templateDel &amp;lt;entity&amp;gt; &amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Temperaturlisten===&lt;br /&gt;
HMInfo bietet verschiedene Methoden, Temperaturlisten für Thermostate (CC-TC, TC-IT oder RT) zu verwalten und zu nutzen. Siehe hierzu [[HomeMatic HMInfo TempList/Weekplan|Homematic Weekplan]]&lt;br /&gt;
&lt;br /&gt;
=== Registersätze kopieren ===&lt;br /&gt;
HMInfo erlaubt das Kopieren von Register-Listen. Über Register wird ein HM-Gerät eingestellt und die Register sind in Listen gruppiert. Die Reaktion und das Verhalten eines Aktors auf einen Trigger eines Sensors wird in dem Registersatz zu diesem [[Peering (HomeMatic)|Peer]] komplett beschrieben. &lt;br /&gt;
Durch die Möglichkeit einen solchen Registersatz im Device zu kopieren kann man das Verhalten, das man für einen Knopf/Sensor festgelegt hat identisch in einen zweiten kopieren. &lt;br /&gt;
HMInfo geht davon aus, dass die vom Gerät gelesene Konfiguration vor dem Kommando aktuell und komplett ist. &lt;br /&gt;
 set hm cpRegs Licht1:FB3_Btn2 Licht3:FB1_Btn4&lt;br /&gt;
 set hm cpRegs Licht2:FB3_Btn2 Licht2:FB1_Btn4&lt;br /&gt;
 set hm cpRegs Licht4:FB3_Btn2 Licht4:FB5_Btn2&lt;br /&gt;
Die obigen Beispiele bewirken der Reihe nach:&lt;br /&gt;
Duplizieren das Verhalten, das Fernbedienungsknopf 2 der Fernbedienung 3 bei Aktor Licht1 hervorruft auch nach Licht3 für Fernbedienungsknopf4 der Fernbedienung 1.&lt;br /&gt;
Duplizieren das Verhalten, das Fernbedienungsknopf 2 der Fernbedienung 3 bei Aktor Licht2 hervorruft auch nach Licht2 (selber Aktor) für Fernbedienungsknopf4 der Fernbedienung 1.&lt;br /&gt;
&lt;br /&gt;
== Web Einträge und Readings ==&lt;br /&gt;
Readings und Internals von HMInfo bieten eine Zusammenfassung des Zustands aller HM Komponenten. Diese sind in Fehler &#039;&#039;&#039;ERR&#039; , Warnungen &#039;&#039;&#039;W_&#039;&#039;&#039; und Information &#039;&#039;&#039;I_&#039;&#039;&#039; untergliedert. Die Prüfung und Erneuerung der Zähler und Werte wird mit:&lt;br /&gt;
:&amp;lt;code&amp;gt;set hm update &amp;lt;/code&amp;gt;&lt;br /&gt;
erreicht. Mit dem Attribut autoUpdate kann man es automatisch regelmäßig starten.&lt;br /&gt;
&lt;br /&gt;
=== Fehlermeldungen ===&lt;br /&gt;
Als Fehler erkannte Zustände werden in Variablen beginnend mit &#039;&#039;&#039;ERR&#039;&#039;&#039; dargestellt. Erfasste Fehler sind kritische RSSI Werte und Protokoll-/Übertragungsfehler. Ausserdem kann man im Attribut sumERROR eintragen, welche Readings zu einer Fehlermeldung führen sollen. Eingetragen werden:&lt;br /&gt;
Reading:&amp;lt;gutwert&amp;gt;. Wenn ein Reading mit einen anderen als dem &amp;quot;gutwert&amp;quot; gefunden wird, wird dies alarmiert. &lt;br /&gt;
Beispiel: &lt;br /&gt;
:&amp;lt;code&amp;gt;battery:ok &amp;lt;/code&amp;gt;&lt;br /&gt;
hat eine HM Komponente ein Reading &amp;quot;battery&amp;quot; und dieses hat einen anderen Wert als &amp;quot;ok&amp;quot; wird dies alarmiert. &lt;br /&gt;
In den Readings von HMInfo würde im Feherfall&lt;br /&gt;
  internal:&lt;br /&gt;
    ERR_names &amp;lt;devicename1&amp;gt;,&amp;lt;devicename2&amp;gt;&lt;br /&gt;
  Readings:&lt;br /&gt;
    ERR_battery low:2&lt;br /&gt;
&lt;br /&gt;
Der default aller Error-meldungen ist&lt;br /&gt;
battery:ok,sabotageError:off,powerError:ok,overload:off,overheat:off,reduced:off,motorError:no,error:none,uncertain:yes,smoke_detect:none,cover:closed&lt;br /&gt;
&lt;br /&gt;
Diese Zusammenfassung der Fehlermeldungen könnte man nutzen, um über notify einen Alarm auszulösen oder eine E-Mail zu senden. &lt;br /&gt;
&lt;br /&gt;
=== Warnungen===&lt;br /&gt;
Hierzu gehören Wiederholungen von Nachrichten (nicht aber Abbrüche, das sind Fehler). Es wird auch ausstehendes Lesen der Konfiguration, das durch autoReadReg getriggert wird, hier angezeigt. &lt;br /&gt;
&lt;br /&gt;
=== Statusmeldungen ===&lt;br /&gt;
Analog zu den Fehlermeldungen kann man mit dem Attribut sumStatus gewisse Readings zählen lassen. Beipiel wäre &lt;br /&gt;
  attr HM sumStatus motor&lt;br /&gt;
HMInfo zeigt in dem Reading I_sum_motor dann an, welcher Inhalt des Readings &amp;quot;motor&amp;quot;  wie oft gefunden wurde. Es könnte so aussehen&lt;br /&gt;
  stop:on:4;stop:1;&lt;br /&gt;
Vier Komponenten stehen auf motor: stop:on und eine steht auf motor: stop&lt;br /&gt;
&lt;br /&gt;
Das Internal &#039;&#039;&#039;I_HM_IOdevices&#039;&#039;&#039; zeigt die von HM Komponenten genutzten IOs und deren State. &lt;br /&gt;
&lt;br /&gt;
== Infos ==&lt;br /&gt;
  get hm models [-f &amp;lt;regexp&amp;gt;]&lt;br /&gt;
  get hm models&lt;br /&gt;
  get hm models -f remote&lt;br /&gt;
  get hm models -f HM_RC&lt;br /&gt;
Zeigt alle in FHEM unterstützten Modelle und deren wesentliche Parameter. Man kann mittels regexp die Liste filtern.&lt;br /&gt;
&lt;br /&gt;
  get hm param [&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;] parameter1 parameter2&lt;br /&gt;
  get hm param -d IODev DEF model&lt;br /&gt;
  get hm param -c -f Rollo peerList&lt;br /&gt;
man kann sich listen von Parametern anzeigen lassen  &lt;br /&gt;
&lt;br /&gt;
  get hm register [&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;]&lt;br /&gt;
zeigt Register in tabellarischer Form. &lt;br /&gt;
&lt;br /&gt;
  get hm peerXref[&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;]&lt;br /&gt;
gibt an, wer mit wem [[Peering (HomeMatic)|gepeert]] ist&lt;br /&gt;
&lt;br /&gt;
== Rücksetzen von Variablen und Zählern ==&lt;br /&gt;
 set HM clear [&amp;lt;typeFilter&amp;gt;] [Protocol|readings|msgStat|register|rssi]&lt;br /&gt;
*register löscht alle Register-readings&lt;br /&gt;
*readings löscht &#039;&#039;&#039;alle&#039;&#039;&#039; readings&lt;br /&gt;
*Protocol löscht alle Protokol-einträge, pending Kommandos und Protokoll-fehler. &lt;br /&gt;
*rssi löscht alle ermittelten RSSI Werte&lt;br /&gt;
*msgStat setzt die Message Statistik zurück&lt;br /&gt;
&lt;br /&gt;
== Filter ==&lt;br /&gt;
Kommandos in HMInfo wirken auf alle HM Komponenten. Man kann dies mit Hilfe der Filter einschränken. Zum einen gibt es &#039;&#039;&#039;modelsFilter&#039;&#039;&#039;, womit man nur devices, nur channels, nur virtuelle Entities bearbeiten kann&lt;br /&gt;
     set &amp;lt;name&amp;gt; &amp;lt;cmd&amp;gt; &#039;&#039;&#039;[-dcasevi]&#039;&#039;&#039;  [params]&lt;br /&gt;
        entities according to list will be processed&amp;quot;&lt;br /&gt;
          d - device   :include devices&amp;quot;&lt;br /&gt;
          c - channels :include channels&amp;quot;&lt;br /&gt;
          i - ignore   :include devices marked as ignore&amp;quot;&lt;br /&gt;
          v - virtual  :supress fhem virtual&amp;quot;&lt;br /&gt;
          p - physical :supress physical&amp;quot;&lt;br /&gt;
          a - aktor    :supress actor&amp;quot;&lt;br /&gt;
          s - sensor   :supress sensor&amp;quot;&lt;br /&gt;
          e - empty    :include results even if requested fields are empty&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein auf &#039;&#039;&#039;-d&#039;&#039;&#039; gefiltertes Kommando wird nur auf devices, nicht aber auf channels angewendet. &lt;br /&gt;
&lt;br /&gt;
Dann gibt es noch den &#039;&#039;&#039;nameFilter&#039;&#039;&#039;, mit dem mittels regexp auf den Namen der Entity gefiltert werden kann&lt;br /&gt;
  -f Rollo # alle Entities mit Rollo im Namen&lt;br /&gt;
  -f ^Rollo$ # nur Entity mit Namen &amp;quot;Rollo&amp;quot;&lt;br /&gt;
  -f Rollo$ # nur Entity deren Name auf Rollo endet&lt;br /&gt;
&lt;br /&gt;
Die Filter kann man kombinieren mit &lt;br /&gt;
  -c -f Rollo # alle Kanäle mit Rollo im Namen&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
Zeige mir die Parameter IODev und room der Devices mit Rollo im Namen&lt;br /&gt;
  set hm param -d -f Rollo IODev room&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
* &#039;&#039;&#039;autoArchive &#039;&#039;&#039; automatisch archivieren von vollständigen Konfigurationen.&lt;br /&gt;
* &#039;&#039;&#039;autoUpdate&#039;&#039;&#039; startet regelmäßig das Komamndo &amp;quot;update&amp;quot;. Die Wiederholzeit wird eingestellt mit hh:mm. Sinnvoll erscheint z.B. alle 5 Minuten, also 00:05.&lt;br /&gt;
* &#039;&#039;&#039;configDir&#039;&#039;&#039; bietet die Möglichkeit, ein Verzeichnis zu definieren, in das HMInfo Dateien ablegen und von dem es die Dateien lesen wird. Default ist fhem_root.&lt;br /&gt;
* &#039;&#039;&#039;configFilename&#039;&#039;&#039; legt einen default Namen fest, der bei save und archive genutzt wird. Default ist regSave.cfg.&lt;br /&gt;
* &#039;&#039;&#039;hmAutoReadScan&#039;&#039;&#039; zeitinterval in Minuten, in denen CUL_HM prüft, ob offene autoRead bereitstehen und die IOs die Kapazität haben. Default ist 4 min.&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
* [[HomeMatic Templates]]&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
* Thread [http://forum.fhem.de/index.php?topic=11035.0 HMinfo] im FHEM Forum&lt;br /&gt;
* Thread {{Link2Forum|Topic=20119|LinkText=HMINfo, Intention, Sinn und Zweck}} im FHEM Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23952</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23952"/>
		<updated>2017-12-30T14:52:08Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Register Werte setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man bspw &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register &#039;&#039;OnTime&#039;&#039; den Wert &#039;&#039;timeOn&#039;&#039; ein. Und eben das Rampenregiste den Wert &#039;&#039;rampTime&#039;&#039;. Der Wert wird dann beim Template Instanziieren - also Anwenden - durch den Individuellen ersetzt.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
Templates kann man erstellen, in dem man die Register einer Entity nimmt und bearbeitet. Auch das Kopieren und Bearbeiten eines vorhandenen Templates ist möglich. Und man kann Templates exportieren/importieren.&lt;br /&gt;
===Template aus Device===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert.&lt;br /&gt;
===Template export-import===&lt;br /&gt;
Will man Templates exportieren nutzt man &amp;lt;br&amp;gt;&lt;br /&gt;
  get ht &amp;lt;templatename&amp;gt;&lt;br /&gt;
Es wird ein kommando ausgegeben welches man in die Kommandozeile pasten kann, was dann der import ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies kann man nutzen um Templates zu tauschen. Hat man ein &#039;&#039;gutes oder komplexes&#039;&#039; Template kann man dies der Allgemeinheit zu Verfügung stellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Im besten Fall muss der User sich nicht mehr um Register kümmern, da komfortable Templates das besser abdecken.&lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long [[und]] short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben.&lt;br /&gt;
&lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
=Verwaltung und Überblick=&lt;br /&gt;
Nun hat man Templates definiert und Instanziiert. Wie soll man den Überblick behalten? HMtemplate ist ein Editor - also nicht wirklich hierfür geeignet. HMinfo macht die Verwaltung. &lt;br /&gt;
==Template Überblick==&lt;br /&gt;
Will man sehen, was man so an Templates nutzt kann man eine Überscht unterschedliche sortiert ausgeben lassen - in HMinfo (hm).&lt;br /&gt;
  get hm templateUsgG sortTemplate&lt;br /&gt;
  get hm templateUsgG sortPeer&lt;br /&gt;
  get hm templateUsgG all&lt;br /&gt;
Sowie eine Liste von Regiserlisten, welche noch kein Template nutzen (noch in Bau!!)&lt;br /&gt;
  get hm templateUsgG noTmpl&lt;br /&gt;
Eine Liste der Verfügbaren Templates erhält man mit &lt;br /&gt;
  get hm templateList all&lt;br /&gt;
und die Register eines Templates mit &lt;br /&gt;
  get hm templateList &amp;lt;templateName&amp;gt;&lt;br /&gt;
  oder&lt;br /&gt;
  set ht select  &amp;lt;templateName&amp;gt;&lt;br /&gt;
==Template prüfen==&lt;br /&gt;
Templates werden auf korrekte Implementierung in der Entity anhand eines Vergleichs der gelesenen Registern mit den gewünschten Regitern geprüft. Es ist also notwendig, dass die Registerwerte in der FHEM Kopie aktuell sind. Dann reicht ein &lt;br /&gt;
  get hm configCheck&lt;br /&gt;
Sollte es zu Unstimmigkeiten kommen werden mit &lt;br /&gt;
  set hm templateExe&lt;br /&gt;
alle Unstimmigkeiten überschrieben. Klar, wie immer, muss FHEM warten, bis ein Device angesprochen werden kann (Übertragungsmode) und dass die IOs nicht überlastet werden. Die Gefahr einer Überlast ist gering wenn man nicht gleich alles überschreiben will. &amp;lt;br&amp;gt;&lt;br /&gt;
Wie immer ist es hilfreich den Status der Übertragung im Blick zu haben:&lt;br /&gt;
  get hm protoEvents&lt;br /&gt;
Wenn zu viel passiert ist und man protoEvents aufräumen muss dann (Achtung: es werden alle ausstehenden Kommandos gelöscht und müssen neu aktiviert werden!)&lt;br /&gt;
  set hm clearG msgEvents&lt;br /&gt;
==Template löschen==&lt;br /&gt;
  set ht delete &amp;lt;tempateName&amp;gt;&lt;br /&gt;
Achtung: vorher müssen alle Referenzen des Templates entfernt worden sein. &lt;br /&gt;
&lt;br /&gt;
=Templates in den Entites=&lt;br /&gt;
Ist eine Entity mit einem Template verknüpft wird dies in den Readings angezeigt. Dies kann man sichtbar machen - und eine Anzeige von Registern in den Readings sollte dann nicht mehr notwendig sein. Empfohlen wird, den expoer mode auf rein Templates umzustellen&lt;br /&gt;
  attr TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=virtual expert 12_templOnly&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=DEF=........    expert&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=subType=virtual expert&lt;br /&gt;
&lt;br /&gt;
=Beispiele und Ideen=&lt;br /&gt;
&lt;br /&gt;
Neben den typischen Templates für Schalter kann (sollte) man auch bspw für RTs einsetzen. Temperaturlisten sind nicht im Angebot. Hier gibt es bereits andere Verfahren die besser passen. Allerdings experimentire ich bei meinen RTs mit den Regelparametern und will diese dann generell setzen. Alle RTs (bei mir) sollen die gleiche Regelung haben. Ich nutze 3 Templates für meine RTs&lt;br /&gt;
* &#039;&#039;&#039;HeatDefDev&#039;&#039;&#039;: Das Device des RT wird auf Standartwerte gesetzt. Hier nutze ich einen Parameter um die Tasten zu sperren. Dies brauche ich nicht bei allen RTs sondern nur bei denen, welche ich mit einem TC gepeert habe. Hier ist eine Lokale Änderung am TC vorzunehmen. &lt;br /&gt;
* &#039;&#039;&#039;HeatDefault&#039;&#039;&#039;:Die Standart-Regelung. Auch hier habe ich Parameter vorgesehen. Die Devices sind identisch... bis auf die Boostzeit und die maximals Ventilöffnung. Je nach Hk begrenze ich ValveMax - hängt von den baulichen Gegebenheiten ab. Boost nutze ich im Bad zum entfeuchten.&lt;br /&gt;
* &#039;&#039;&#039;HeatRemote&#039;&#039;&#039;: mein &#039;&#039;guteNacht&#039;&#039; Knopf macht auch vor RTs nicht halt. Ich haben an einer Remote einen Button mit allen Lichtern und RTs im Wohnbereich gekoppelt. Beim Drücken wird das Licht abgeschaltet und dieHeizung gedrosselt - bspw wenn ich als letzter ins Bett gehe. Daher brauche ich einen Parameter &#039;&#039;Temperatur&#039;&#039; um das induviduell je RT einzustellen. &lt;br /&gt;
  set hm templateDef HeatDefDev BtnLock &amp;quot;Default RT Device register&amp;quot; globalBtnLock:off localResDis:off modusBtnLock:off backOnTime:10 cyclicInfoMsg:on lowBatLimitRT:2.1 burstRx:on cyclicInfoMsgDis:0 btnLock:p0&lt;br /&gt;
  set hm templateDef HeatDefault boost:valveMax &amp;quot;myDefault RT settings, enter boostTime and valveMax&amp;quot; regAdaptive:offDeter reguIntI:20 nightTemp:17 tempOffset:0.0K dayTemp:21 reguIntPstart:5 reguExtI:20 showWeekday:off reguExtP:25 reguIntP:25 tempMax:30.5 tempMin:4.5 valveMaxPos:p1 valveOffsetRt:0 modePrioManu:all daylightSaveTime:on boostPos:30 decalcWeekday:Sat showInfo:time decalcTime:11:00 btnNoBckLight:off reguExtPstart:5 noMinMax4Manu:off modePrioParty:all valveErrPos:15 boostPeriod:p0&lt;br /&gt;
  set hm templateDef HeatRemote temp &amp;quot;heatRemote set temperature&amp;quot; CtrlRc:autoAndTemp TempRC:p0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In der Übersicht für 2 RTs ergibt ein get hm templateUsg&lt;br /&gt;
  haEss               |0              |HeatDefDev|BtnLock:off &lt;br /&gt;
  haEss_Clima         |0              |HeatDefault|boost:5 valveMax:15 &lt;br /&gt;
  haEss_remote        |FB8_1:short    |HeatRemote|temp:13 &lt;br /&gt;
  haEss_remote        |FB8_5:long     |HeatRemote|temp:13 &lt;br /&gt;
  haEss_remote        |FB8_5:short    |HeatRemote|temp:19 &lt;br /&gt;
  haLnge              |0              |HeatDefDev|BtnLock:off &lt;br /&gt;
  haLnge_Clima        |0              |HeatDefault|boost:5 valveMax:15 &lt;br /&gt;
  haLnge_remote       |FB8_1:short    |HeatRemote|temp:13 &lt;br /&gt;
  haLnge_remote       |FB8_5:long     |HeatRemote|temp:13 &lt;br /&gt;
  haLnge_remote       |FB8_5:short    |HeatRemote|temp:19 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23951</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23951"/>
		<updated>2017-12-30T14:50:53Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Register Werte setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man bspw &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register &#039;&#039;OnTime&#039;&#039; den Wert &#039;&#039;timeOn&#039;&#039; ein. Und eben das Rampenregiste den Wert &#039;&#039;rampTime&#039;&#039;. Der Wert wird dann beim Template Instanziieren - also Anwenden - durch den Individuellen ersetzt.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
Templates kann man erstellen, in dem man die Register einer Entity nimmt und bearbeitet. Auch das Kopieren und Bearbeiten eines vorhandenen Templates ist möglich. Und man kann Templates exportieren/importieren.&lt;br /&gt;
===Template aus Device===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert.&lt;br /&gt;
===Template export-import===&lt;br /&gt;
Will man Templates exportieren nutzt man &amp;lt;br&amp;gt;&lt;br /&gt;
  get ht &amp;lt;templatename&amp;gt;&lt;br /&gt;
Es wird ein kommando ausgegeben welches man in die Kommandozeile pasten kann, was dann der import ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies kann man nutzen um Templates zu tauschen. Hat man ein &#039;&#039;gutes oder komplexes&#039;&#039; Template kann man dies der Allgemeinheit zu Verfügung stellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Im besten Fall muss der User sich nicht mehr um Register kümmern, da komfortable Templates das besser abdecken.&lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long [[und]] short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben.&lt;br /&gt;
&lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
=Verwaltung und Überblick=&lt;br /&gt;
Nun hat man Templates definiert und Instanziiert. Wie soll man den Überblick behalten? HMtemplate ist ein Editor - also nicht wirklich hierfür geeignet. HMinfo macht die Verwaltung. &lt;br /&gt;
==Template Überblick==&lt;br /&gt;
Will man sehen, was man so an Templates nutzt kann man eine Überscht unterschedliche sortiert ausgeben lassen - in HMinfo (hm).&lt;br /&gt;
  get hm templateUsgG sortTemplate&lt;br /&gt;
  get hm templateUsgG sortPeer&lt;br /&gt;
  get hm templateUsgG all&lt;br /&gt;
Sowie eine Liste von Regiserlisten, welche noch kein Template nutzen (noch in Bau!!)&lt;br /&gt;
  get hm templateUsgG noTmpl&lt;br /&gt;
Eine Liste der Verfügbaren Templates erhält man mit &lt;br /&gt;
  get hm templateList all&lt;br /&gt;
und die Register eines Templates mit &lt;br /&gt;
  get hm templateList &amp;lt;templateName&amp;gt;&lt;br /&gt;
  oder&lt;br /&gt;
  set ht select  &amp;lt;templateName&amp;gt;&lt;br /&gt;
==Template prüfen==&lt;br /&gt;
Templates werden auf korrekte Implementierung in der Entity anhand eines Vergleichs der gelesenen Registern mit den gewünschten Regitern geprüft. Es ist also notwendig, dass die Registerwerte in der FHEM Kopie aktuell sind. Dann reicht ein &lt;br /&gt;
  get hm configCheck&lt;br /&gt;
Sollte es zu Unstimmigkeiten kommen werden mit &lt;br /&gt;
  set hm templateExe&lt;br /&gt;
alle Unstimmigkeiten überschrieben. Klar, wie immer, muss FHEM warten, bis ein Device angesprochen werden kann (Übertragungsmode) und dass die IOs nicht überlastet werden. Die Gefahr einer Überlast ist gering wenn man nicht gleich alles überschreiben will. &amp;lt;br&amp;gt;&lt;br /&gt;
Wie immer ist es hilfreich den Status der Übertragung im Blick zu haben:&lt;br /&gt;
  get hm protoEvents&lt;br /&gt;
Wenn zu viel passiert ist und man protoEvents aufräumen muss dann (Achtung: es werden alle ausstehenden Kommandos gelöscht und müssen neu aktiviert werden!)&lt;br /&gt;
  set hm clearG msgEvents&lt;br /&gt;
==Template löschen==&lt;br /&gt;
  set ht delete &amp;lt;tempateName&amp;gt;&lt;br /&gt;
Achtung: vorher müssen alle Referenzen des Templates entfernt worden sein. &lt;br /&gt;
&lt;br /&gt;
=Templates in den Entites=&lt;br /&gt;
Ist eine Entity mit einem Template verknüpft wird dies in den Readings angezeigt. Dies kann man sichtbar machen - und eine Anzeige von Registern in den Readings sollte dann nicht mehr notwendig sein. Empfohlen wird, den expoer mode auf rein Templates umzustellen&lt;br /&gt;
  attr TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=virtual expert 12_templOnly&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=DEF=........    expert&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=subType=virtual expert&lt;br /&gt;
&lt;br /&gt;
=Beispiele und Ideen=&lt;br /&gt;
Neben den typischen Templates für Schalter kann (sollte) man auch bspw für RTs einsetzen. Temperaturlisten sind nicht im Angebot. Hier gibt es bereits andere Verfahren die besser passen. Allerdings experimentire ich bei meinen RTs mit den Regelparametern und will diese dann generell setzen. Alle RTs (bei mir) sollen die gleiche Regelung haben. Ich nutze 3 Templates für meine RTs&lt;br /&gt;
* &#039;&#039;&#039;HeatDefDev&#039;&#039;&#039;: Das Device des RT wird auf Standartwerte gesetzt. Hier nutze ich einen Parameter um die Tasten zu sperren. Dies brauche ich nicht bei allen RTs sondern nur bei denen, welche ich mit einem TC gepeert habe. Hier ist eine Lokale Änderung am TC vorzunehmen. &lt;br /&gt;
* &#039;&#039;&#039;HeatDefault&#039;&#039;&#039;:Die Standart-Regelung. Auch hier habe ich Parameter vorgesehen. Die Devices sind identisch... bis auf die Boostzeit und die maximals Ventilöffnung. Je nach Hk begrenze ich ValveMax - hängt von den baulichen Gegebenheiten ab. Boost nutze ich im Bad zum entfeuchten.&lt;br /&gt;
* &#039;&#039;&#039;HeatRemote&#039;&#039;&#039;: mein &#039;&#039;guteNacht&#039;&#039; Knopf macht auch vor RTs nicht halt. Ich haben an einer Remote einen Button mit allen Lichtern und RTs im Wohnbereich gekoppelt. Beim Drücken wird das Licht abgeschaltet und dieHeizung gedrosselt - bspw wenn ich als letzter ins Bett gehe. Daher brauche ich einen Parameter &#039;&#039;Temperatur&#039;&#039; um das induviduell je RT einzustellen. &lt;br /&gt;
  set hm templateDef HeatDefDev BtnLock &amp;quot;Default RT Device register&amp;quot; globalBtnLock:off localResDis:off modusBtnLock:off backOnTime:10 cyclicInfoMsg:on lowBatLimitRT:2.1 burstRx:on cyclicInfoMsgDis:0 btnLock:p0&lt;br /&gt;
  set hm templateDef HeatDefault boost:valveMax &amp;quot;myDefault RT settings, enter boostTime and valveMax&amp;quot; regAdaptive:offDeter reguIntI:20 nightTemp:17 tempOffset:0.0K dayTemp:21 reguIntPstart:5 reguExtI:20 showWeekday:off reguExtP:25 reguIntP:25 tempMax:30.5 tempMin:4.5 valveMaxPos:p1 valveOffsetRt:0 modePrioManu:all daylightSaveTime:on boostPos:30 decalcWeekday:Sat showInfo:time decalcTime:11:00 btnNoBckLight:off reguExtPstart:5 noMinMax4Manu:off modePrioParty:all valveErrPos:15 boostPeriod:p0&lt;br /&gt;
  set hm templateDef HeatRemote temp &amp;quot;heatRemote set temperature&amp;quot; CtrlRc:autoAndTemp TempRC:p0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In der Übersicht für 2 RTs ergibt ein get hm templateUsg&lt;br /&gt;
  haEss               |0              |HeatDefDev|BtnLock:off &lt;br /&gt;
  haEss_Clima         |0              |HeatDefault|boost:5 valveMax:15 &lt;br /&gt;
  haEss_remote        |FB8_1:short    |HeatRemote|temp:13 &lt;br /&gt;
  haEss_remote        |FB8_5:long     |HeatRemote|temp:13 &lt;br /&gt;
  haEss_remote        |FB8_5:short    |HeatRemote|temp:19 &lt;br /&gt;
  haLnge              |0              |HeatDefDev|BtnLock:off &lt;br /&gt;
  haLnge_Clima        |0              |HeatDefault|boost:5 valveMax:15 &lt;br /&gt;
  haLnge_remote       |FB8_1:short    |HeatRemote|temp:13 &lt;br /&gt;
  haLnge_remote       |FB8_5:long     |HeatRemote|temp:13 &lt;br /&gt;
  haLnge_remote       |FB8_5:short    |HeatRemote|temp:19 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23950</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23950"/>
		<updated>2017-12-30T14:48:04Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Register Werte setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man bspw &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register &#039;&#039;OnTime&#039;&#039; den Wert &#039;&#039;timeOn&#039;&#039; ein. Und eben das Rampenregiste den Wert &#039;&#039;rampTime&#039;&#039;. Der Wert wird dann beim Template Instanziieren - also Anwenden - durch den Individuellen ersetzt.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
Templates kann man erstellen, in dem man die Register einer Entity nimmt und bearbeitet. Auch das Kopieren und Bearbeiten eines vorhandenen Templates ist möglich. Und man kann Templates exportieren/importieren.&lt;br /&gt;
===Template aus Device===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert.&lt;br /&gt;
===Template export-import===&lt;br /&gt;
Will man Templates exportieren nutzt man &amp;lt;br&amp;gt;&lt;br /&gt;
  get ht &amp;lt;templatename&amp;gt;&lt;br /&gt;
Es wird ein kommando ausgegeben welches man in die Kommandozeile pasten kann, was dann der import ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies kann man nutzen um Templates zu tauschen. Hat man ein &#039;&#039;gutes oder komplexes&#039;&#039; Template kann man dies der Allgemeinheit zu Verfügung stellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Im besten Fall muss der User sich nicht mehr um Register kümmern, da komfortable Templates das besser abdecken.&lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long [[und]] short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben.&lt;br /&gt;
&lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
=Verwaltung und Überblick=&lt;br /&gt;
Nun hat man Templates definiert und Instanziiert. Wie soll man den Überblick behalten? HMtemplate ist ein Editor - also nicht wirklich hierfür geeignet. HMinfo macht die Verwaltung. &lt;br /&gt;
==Template Überblick==&lt;br /&gt;
Will man sehen, was man so an Templates nutzt kann man eine Überscht unterschedliche sortiert ausgeben lassen - in HMinfo (hm).&lt;br /&gt;
  get hm templateUsgG sortTemplate&lt;br /&gt;
  get hm templateUsgG sortPeer&lt;br /&gt;
  get hm templateUsgG all&lt;br /&gt;
Sowie eine Liste von Regiserlisten, welche noch kein Template nutzen (noch in Bau!!)&lt;br /&gt;
  get hm templateUsgG noTmpl&lt;br /&gt;
Eine Liste der Verfügbaren Templates erhält man mit &lt;br /&gt;
  get hm templateList all&lt;br /&gt;
und die Register eines Templates mit &lt;br /&gt;
  get hm templateList &amp;lt;templateName&amp;gt;&lt;br /&gt;
  oder&lt;br /&gt;
  set ht select  &amp;lt;templateName&amp;gt;&lt;br /&gt;
==Template prüfen==&lt;br /&gt;
Templates werden auf korrekte Implementierung in der Entity anhand eines Vergleichs der gelesenen Registern mit den gewünschten Regitern geprüft. Es ist also notwendig, dass die Registerwerte in der FHEM Kopie aktuell sind. Dann reicht ein &lt;br /&gt;
  get hm configCheck&lt;br /&gt;
Sollte es zu Unstimmigkeiten kommen werden mit &lt;br /&gt;
  set hm templateExe&lt;br /&gt;
alle Unstimmigkeiten überschrieben. Klar, wie immer, muss FHEM warten, bis ein Device angesprochen werden kann (Übertragungsmode) und dass die IOs nicht überlastet werden. Die Gefahr einer Überlast ist gering wenn man nicht gleich alles überschreiben will. &amp;lt;br&amp;gt;&lt;br /&gt;
Wie immer ist es hilfreich den Status der Übertragung im Blick zu haben:&lt;br /&gt;
  get hm protoEvents&lt;br /&gt;
Wenn zu viel passiert ist und man protoEvents aufräumen muss dann (Achtung: es werden alle ausstehenden Kommandos gelöscht und müssen neu aktiviert werden!)&lt;br /&gt;
  set hm clearG msgEvents&lt;br /&gt;
==Template löschen==&lt;br /&gt;
  set ht delete &amp;lt;tempateName&amp;gt;&lt;br /&gt;
Achtung: vorher müssen alle Referenzen des Templates entfernt worden sein. &lt;br /&gt;
&lt;br /&gt;
=Templates in den Entites=&lt;br /&gt;
Ist eine Entity mit einem Template verknüpft wird dies in den Readings angezeigt. Dies kann man sichtbar machen - und eine Anzeige von Registern in den Readings sollte dann nicht mehr notwendig sein. Empfohlen wird, den expoer mode auf rein Templates umzustellen&lt;br /&gt;
  attr TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=virtual expert 12_templOnly&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=DEF=........    expert&lt;br /&gt;
  deleteattr TYPE=CUL_HM:FILTER=subType=virtual expert&lt;br /&gt;
&lt;br /&gt;
=Beispiele und Ideen=&lt;br /&gt;
Neben den typischen Templates für Schalter kann (sollte) man auch bspw für RTs einsetzen. Temperaturlisten sind nicht im Angebot. Hier gibt es bereits andere Verfahren die besser passen. Allerdings experimentire ich bei meinen RTs mit den Regelparametern und will diese dann generell setzen. Alle RTs (bei mir) sollen die gleiche Regelung haben. Ich nutze 3 Templates für meine RTs&lt;br /&gt;
* &#039;&#039;&#039;HeatDefDev&#039;&#039;&#039;: Das Device des RT wird auf Standartwerte gesetzt. Hier nutze ich einen Parameter um die Tasten zu sperren. Dies brauche ich nicht bei allen RTs sondern nur bei denen, welche ich mit einem TC gepeert habe. Hier ist eine Lokale Änderung am TC vorzunehmen. &lt;br /&gt;
* &#039;&#039;&#039;HeatDefault&#039;&#039;&#039;:Die Standart-Regelung. Auch hier habe ich Parameter vorgesehen. Die Devices sind identisch... bis auf die Boostzeit und die maximals Ventilöffnung. Je nach Hk begrenze ich ValveMax - hängt von den baulichen Gegebenheiten ab. Boost nutze ich im Bad zum entfeuchten.&lt;br /&gt;
* &#039;&#039;&#039;HeatRemote&#039;&#039;&#039;: mein &#039;&#039;guteNacht&#039;&#039; Knopf macht auch vor RTs nicht halt. Ich haben an einer Remote einen Button mit allen Lichtern und RTs im Wohnbereich gekoppelt. Beim Drücken wird das Licht abgeschaltet und dieHeizung gedrosselt - bspw wenn ich als letzter ins Bett gehe. Daher brauche ich einen Parameter &#039;&#039;Temperatur&#039;&#039; um das induviduell je RT einzustellen. &lt;br /&gt;
  set hm templateDef HeatDefDev BtnLock &amp;quot;Default RT Device register&amp;quot; globalBtnLock:off localResDis:off modusBtnLock:off backOnTime:10 cyclicInfoMsg:on lowBatLimitRT:2.1 burstRx:on cyclicInfoMsgDis:0 btnLock:p0&lt;br /&gt;
  set hm templateDef HeatDefault boost:valveMax &amp;quot;myDefault RT settings, enter boostTime and valveMax&amp;quot; regAdaptive:offDeter reguIntI:20 nightTemp:17 tempOffset:0.0K dayTemp:21 reguIntPstart:5 reguExtI:20 showWeekday:off reguExtP:25 reguIntP:25 tempMax:30.5 tempMin:4.5 valveMaxPos:p1 valveOffsetRt:0 modePrioManu:all daylightSaveTime:on boostPos:30 decalcWeekday:Sat showInfo:time decalcTime:11:00 btnNoBckLight:off reguExtPstart:5 noMinMax4Manu:off modePrioParty:all valveErrPos:15 boostPeriod:p0&lt;br /&gt;
  set hm templateDef HeatRemote temp &amp;quot;heatRemote set temperature&amp;quot; CtrlRc:autoAndTemp TempRC:p0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23949</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23949"/>
		<updated>2017-12-30T14:11:11Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Register Werte setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man bspw &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register &#039;&#039;OnTime&#039;&#039; den Wert &#039;&#039;timeOn&#039;&#039; ein. Und eben das Rampenregiste den Wert &#039;&#039;rampTime&#039;&#039;. Der Wert wird dann beim Template Instanziieren - also Anwenden - durch den Individuellen ersetzt.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
Templates kann man erstellen, in dem man die Register einer Entity nimmt und bearbeitet. Auch das Kopieren und Bearbeiten eines vorhandenen Templates ist möglich. Und man kann Templates exportieren/importieren.&lt;br /&gt;
===Template aus Device===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert.&lt;br /&gt;
===Template export-import===&lt;br /&gt;
Will man Templates exportieren nutzt man &amp;lt;br&amp;gt;&lt;br /&gt;
  get ht &amp;lt;templatename&amp;gt;&lt;br /&gt;
Es wird ein kommando ausgegeben welches man in die Kommandozeile pasten kann, was dann der import ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies kann man nutzen um Templates zu tauschen. Hat man ein &#039;&#039;gutes oder komplexes&#039;&#039; Template kann man dies der Allgemeinheit zu Verfügung stellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Im besten Fall muss der User sich nicht mehr um Register kümmern, da komfortable Templates das besser abdecken.&lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long [[und]] short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben.&lt;br /&gt;
&lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
=Verwaltung und Überblick=&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23948</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23948"/>
		<updated>2017-12-30T14:08:10Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Register Werte setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man bspw &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register &#039;&#039;OnTime&#039;&#039; den Wert &#039;&#039;timeOn&#039;&#039; ein. Und eben das Rampenregiste den Wert &#039;&#039;rampTime&#039;&#039;. Der Wert wird dann beim Template Instanziieren - also Anwenden - durch den Individuellen ersetzt.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
Templates kann man erstellen, in dem man die Register einer Entity nimmt und bearbeitet. Auch das Kopieren und Bearbeiten eines vorhandenen Templates ist möglich. Und man kann Templates exportieren/importieren.&lt;br /&gt;
===Template aus Device===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert.&lt;br /&gt;
===Template export-import===&lt;br /&gt;
Will man Templates exportieren nutzt man &amp;lt;br&amp;gt;&lt;br /&gt;
  get ht &amp;lt;templatename&amp;gt;&lt;br /&gt;
Es wird ein kommando ausgegeben welches man in die Kommandozeile pasten kann, was dann der import ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies kann man nutzen um Templates zu tauschen. Hat man ein &#039;&#039;gutes oder komplexes&#039;&#039; Template kann man dies der Allgemeinheit zu Verfügung stellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Im besten Fall muss der User sich nicht mehr um Register kümmern, da komfortable Templates das besser abdecken.&lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long [[und]] short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben.&lt;br /&gt;
&lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23947</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23947"/>
		<updated>2017-12-30T14:06:18Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Register Werte setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man bspw &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register &#039;&#039;OnTime&#039;&#039; den Wert &#039;&#039;timeOn&#039;&#039; ein. Und eben das Rampenregiste den Wert &#039;&#039;rampTime&#039;&#039;. Der Wert wird dann beim Template Instanziieren - also Anwenden - durch den Individuellen ersetzt.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
Templates kann man erstellen, in dem man die Register einer Entity nimmt und bearbeitet. Auch das Kopieren und Bearbeiten eines vorhandenen Templates ist möglich. Und man kann Templates exportieren/importieren.&lt;br /&gt;
===Template aus Device===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert.&lt;br /&gt;
===Template export-import===&lt;br /&gt;
Will man Templates exportieren nutzt man &amp;lt;br&amp;gt;&lt;br /&gt;
  get ht &amp;lt;templatename&amp;gt;&lt;br /&gt;
Es wird ein kommando ausgegeben welches man in die Kommandozeile pasten kann, was dann der import ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies kann man nutzen um Templates zu tauschen. Hat man ein &#039;&#039;gutes oder komplexes&#039;&#039; Template kann man dies der Allgemeinheit zu Verfügung stellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Im besten Fall muss der User sich nicht mehr um Register kümmern, da komfortable Templates das besser abdecken.&lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23946</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23946"/>
		<updated>2017-12-30T14:05:15Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Register Werte setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man bspw &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register &#039;&#039;OnTime&#039;&#039; den Wert &#039;&#039;timeOn&#039;&#039; ein. Und eben das Rampenregiste den Wert &#039;&#039;rampTime&#039;&#039;. Der Wert wird dann beim Template Instanziieren - also Anwenden - durch den Individuellen ersetzt.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
Templates kann man erstellen, in dem man die Register einer Entity nimmt und bearbeitet. Auch das Kopieren und Bearbeiten eines vorhandenen Templates ist möglich. Und man kann Templates exportieren/importieren.&lt;br /&gt;
===Template aus Device===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert.&lt;br /&gt;
===Template export-import===&lt;br /&gt;
Will man Templates exportieren nutzt man &amp;lt;br&amp;gt;&lt;br /&gt;
;get ht &amp;lt;templatename&amp;gt;&lt;br /&gt;
Es wird ein kommando ausgegeben welches man in die Kommandozeile pasten kann, was dann der import ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies kann man nutzen um Templates zu tauschen. Hat man ein &#039;&#039;gutes oder komplexes&#039;&#039; Template kann man dies der Allgemeinheit zu Verfügung stellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Im besten Fall muss der User sich nicht mehr um Register kümmern, da komfortable Templates das besser abdecken.&lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23945</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23945"/>
		<updated>2017-12-30T13:58:12Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Register Werte setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man bspw &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register &#039;&#039;OnTime&#039;&#039; den Wert &#039;&#039;timeOn&#039;&#039; ein. Und eben das Rampenregiste den Wert &#039;&#039;rampTime&#039;&#039;. Der Wert wird dann beim Template Instanziieren - also Anwenden - durch den Individuellen ersetzt.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
===Template aus Device===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert. &lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23944</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23944"/>
		<updated>2017-12-30T13:57:40Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Registerattribute setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man bspw &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register &#039;&#039;OnTime&#039;&#039; den Wert &#039;&#039;timeOn&#039;&#039; ein. Und eben das Rampenregiste den Wert &#039;&#039;rampTime&#039;&#039;. Der Wert wird dann beim Template Instanziieren - also Anwenden - durch den Individuellen ersetzt.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
===Template aus Device===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert. &lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23940</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23940"/>
		<updated>2017-12-30T11:00:36Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Registerattribute setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register OnTime den Wert timeOn ein. Und eben das rampenregiste den Wert rampTime&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template erstellen und bearbeiten==&lt;br /&gt;
===Template aus Device===&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
===Template Varianten speichern===&lt;br /&gt;
Ist man beim Erstellen von Templates kann man mti saveAs das Template als neues unter einem anderen Namen sichern. &lt;br /&gt;
===Template editieren===&lt;br /&gt;
Mit Edit kann man die Werte der Register ändern oder vorhandene Register aus dem Template entfernen. Ein Hinzufügen von Registern wird nicht unterstützt. Hier fehlt die Referenz um anzubieten, was möglich ist.&lt;br /&gt;
===Template kopieren===&lt;br /&gt;
Dies wird ebenfalls mit edit erreicht. Das Template wird mit saveAs unter einem neuen Namen gespeichert. &lt;br /&gt;
&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23939</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23939"/>
		<updated>2017-12-30T10:52:56Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
===Registerattribute setzen===&lt;br /&gt;
Nun das eigentliche - das setzen der Registerinhalte. Dies wird begrenzt unterstützt. Sollte das Register durch &#039;&#039;literals&#039;&#039; definiert werden erscheint beim Setzen eine drop-down Liste mit den Optionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Nicht unterstützt wird das Setzen von Werten. Es gibt aktuell keine Option, hier eine Hilfe einzublenden. Die Wertebereiche sind dem regList der Entity zu entnehmen. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine weitere Besonderheit ist die Granularität der Werte. Insbesondere durch das Float Format einiger Werte sind nicht alle Werte möglich. Trägt man bspw eine Ontime von 10000 ein wird dies erst einmal akzeptiert. Allerdings wird der Wert beim Schreiben umgerechnet in den nächstmöglichen (welcher 9600 ist). Bei der Prüfung der Template Anwendung wird der Unterschied angemerkt. Am Einfachsten wird nun das Template angepasst und alles ist gut.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nun tpl_params. Diese muss man anstelle des Registerwerts einsetzen. Hat man &amp;lt;br&amp;gt;&lt;br /&gt;
tpl_params timeOn:rampTime&amp;lt;br&amp;gt;&lt;br /&gt;
definiert setzt man in das Register OnTime den Wert timeOn ein. Und eben das rampenregiste den Wert rampTime&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template aus Device erstellen==&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23938</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23938"/>
		<updated>2017-12-30T10:31:22Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;timeOn:ramp&#039;&#039; würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
:Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll kann es sein, die Condition Table Register komplett zu eliminieren wenn man Reaktionen auf Taster definieren will. Will man &#039;&#039;ignore&#039;&#039; definieren, also keine Reaktion bspw auf &#039;&#039;long&#039;&#039;, dann kann man alles löschen bis auf ActionType usw. &amp;lt;br&amp;gt;&lt;br /&gt;
:Sinnvoll ist es, nur notwendige Register der Funktion zu bearbeiten, da sonst die Anwendung des Templates eingeschränkt wird. &amp;lt;br&amp;gt;&lt;br /&gt;
:Es sollten aber alle Register der Funktion enthalten sein, da die Prüfung auch nur diese berücksichtigt und bei einem Umprogrammieren nicht klar ist, was vorher in einem Register gestanden ist.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template aus Device erstellen==&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23937</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23937"/>
		<updated>2017-12-30T10:23:31Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
timeOn:ramp würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten. &amp;lt;br&amp;gt;&lt;br /&gt;
Zunächst sollte man Registerattribute löschen, welche man für das Template nicht benötigt. Achtung: eine Option gelöschte Registerattribute wieder nachzutragen ist nicht vorgesehen. So schlimm ist es allerdings nicht - man muss halt noch einmal alle Lesen und von Vorne löschen. &amp;lt;br&amp;gt;&lt;br /&gt;
xx&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template aus Device erstellen==&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23936</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23936"/>
		<updated>2017-12-30T10:18:05Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
===Welche Parameter muss ich einstellen===&lt;br /&gt;
Bei der Erstellung eine Templates werden dessen Parameter durch Attribute vorgegeben. Durch &#039;&#039;&#039;set save&#039;&#039;&#039; wird dann das Template schlussendlich definiert. Folgende Parameter/Attribute werden genutzt:&lt;br /&gt;
*&#039;&#039;&#039;tpl_description&#039;&#039;&#039;: ist ein Freitext welcher beschreiben soll, was das Template macht und wie es parametriert wird&lt;br /&gt;
*&#039;&#039;&#039;tpl_params&#039;&#039;&#039;: hier werden evtl Parameter definiert mit welchen die Instanziierung des Templates angepasst werden kann. Bspw. könnte die Einschaltzeit variable gestalltet werden. Bei einem Dimmer könnt man den Level und die Rampe eingeben, also 2 Parameter. Man vergibt also, &amp;quot;:&amp;quot; getrennt, eine Liste von Paramtern. Die Namen sind frei wählbar. &amp;lt;br&amp;gt;&lt;br /&gt;
timeOn:ramp würde 2 Parameter definieren, welche später in den Registern genutzt werden können&lt;br /&gt;
*&#039;&#039;&#039;tpl_type&#039;&#039;&#039;: definiert den Typ. Diesen muss man zuerst festlegen. Es konnte &#039;&#039;peer-Short&#039;&#039;,&#039;&#039;peer-Long&#039;&#039;,&#039;&#039;peer-Both&#039;&#039; oder &#039;&#039;basic&#039;&#039; sein. Nach der Auswahl des Typs kann man die Entity (source) wählen. Es alle Entities angeboten, welche entsprechende Registersätze zu Verfügung stellen.&lt;br /&gt;
*&#039;&#039;&#039;tpl_source&#039;&#039;&#039;: legt bei der Definition eines Templates fest, von welcher Entity die Register für die Vorlage genutzt werden sollen. Ein Browser-Refresh könnte notwendig sein um die Auswahlliste upzudaten&lt;br /&gt;
*&#039;&#039;&#039;tpl_peer&#039;&#039;&#039;: muss man auswählen, so man einen &amp;quot;peer&amp;quot; typ gewählt hat. An Browser-refresh denken. &lt;br /&gt;
*&#039;&#039;&#039;Reg_xxx&#039;&#039;&#039;: An Browser-refresh denken. Hat man nun die Vorlage ausgewählt und den Refresh gemach werden nun Register als Attribute angeboten&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template aus Device erstellen==&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23935</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23935"/>
		<updated>2017-12-30T09:58:10Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden, Architektur und Verhalten.&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Wie in Granularität beschrieben kann man insbesondere beim Peerverhalten templates für &#039;&#039;short&#039;&#039;, &#039;&#039;long&#039;&#039; oder &#039;&#039;both&#039;&#039; ertellen. Nutzt man short/long braucht man weniger Templates (Basics sind on/off/ignore/toggle) muss allerdings mehr Templates zuweisen, als Reaktion auf short UND long.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei both braucht man mehr Templates (OnOff/OnIgnore/OffIgnore/IgnoreOff/ToggleIgnore/...) braucht aber nur die Hälfte der Zuweisungen zu den realen Entities. &lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template aus Device erstellen==&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23934</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23934"/>
		<updated>2017-12-30T09:50:34Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
=Das eigenen Konzept=&lt;br /&gt;
Für die Verknüpfung von HM Entities muss man 2 Ebenen unterschieden:&lt;br /&gt;
==Architektur==&lt;br /&gt;
Beim Erstellen der Architektur legt man fest, welche Entities untereinander verknüpft werden. Dies geschieht durch peeren. Templates unterstützen nicht die Architektur. Es ist demnach notwendig die Peerings durchzuführen bevor an ein Template darauf anwenden kann. &lt;br /&gt;
==Verhalten==&lt;br /&gt;
Hier kommen die Templates zum Tragen. Mit Templates definiert man die Register der Entities und somit das Verhalten und die Reaktion der Entites bspw auf Trigger von Sensoren.&lt;br /&gt;
===Welchen templateTyp brauche ich===&lt;br /&gt;
Tem&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template aus Device erstellen==&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23933</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23933"/>
		<updated>2017-12-30T09:39:16Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: Kategorie&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template aus Device erstellen==&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23915</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23915"/>
		<updated>2017-12-29T16:17:00Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template aus Device erstellen==&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;br /&gt;
==Template weitergeben==&lt;br /&gt;
Will man Templates weitergeben geht das mit&lt;br /&gt;
  get ht my1stTmpl&lt;br /&gt;
Das Kommando kann dann direkt in die Kommandozeile kopiert werden und das Template ist definiert.&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23914</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23914"/>
		<updated>2017-12-29T16:14:59Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template aus Device erstellen==&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
Die Register der Entities werden passend in das Device geschrieben. &lt;br /&gt;
==Template editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht edit my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht save&lt;br /&gt;
==Template kopieren und editieren==&lt;br /&gt;
Nun soll das Template grundsätzlich modfiziert werden. &lt;br /&gt;
  &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht Reg_&amp;lt;name&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name2&amp;gt; &amp;lt;value2&amp;gt;&lt;br /&gt;
  attr ht Reg_&amp;lt;name3&amp;gt; &amp;lt;value3&amp;gt;&lt;br /&gt;
  set ht saveAs my2ndTmpl&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23913</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23913"/>
		<updated>2017-12-29T16:08:08Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template aus Device erstellen==&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;, &amp;quot;sw1/peer2&amp;quot;, &amp;quot;sw2/peer1&amp;quot; und &amp;quot;sw2/peer3&amp;quot;. Für alle benötigen wir unterschiedliche Abschaltzeiten (warum? eure Sache). &lt;br /&gt;
  set ht select my1stTmpl&lt;br /&gt;
  attr ht entity sw1&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 30&lt;br /&gt;
  set ht apply&lt;br /&gt;
  attr ht ePeer peer2&lt;br /&gt;
  attr ht tpl_param_timeOn 180&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht entity sw2&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;&lt;br /&gt;
  attr ht ePeer peer1&lt;br /&gt;
  attr ht tpl_param_timeOn 70&lt;br /&gt;
  set ht apply&lt;br /&gt;
&lt;br /&gt;
  attr ht ePeer peer3&lt;br /&gt;
  attr ht tpl_param_timeOn 1000&lt;br /&gt;
  set ht apply&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23912</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23912"/>
		<updated>2017-12-29T16:01:08Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template aus Device erstellen==&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht Reg_shOnTime timeOn # setzen des parameters&lt;br /&gt;
&lt;br /&gt;
nun können weitere Register verändert werde. &lt;br /&gt;
Sinnvoll ist es, unnötige Register aus dem Template zu entfernen. Dies sind in diesem Fall bspw. alle Ct register. Das Attribut des Registers wird einfach gelöscht. &lt;br /&gt;
  set ht save&lt;br /&gt;
  set ht dismiss&lt;br /&gt;
==Template einem Kanal zuweisen==&lt;br /&gt;
Jetzt haben wir ein Template welches long und short eines Kanals kontrollieren soll. Dies wollen wir jetzt anwenden auf unsere Kanal/Peer Kompinationen &amp;quot;sw1/peer1&amp;quot;,&amp;quot;sw1/peer2&amp;quot;,&amp;quot;sw2/peer1&amp;quot;,&amp;quot;sw2/peer2&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23908</id>
		<title>HomeMatic Templates</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Templates&amp;diff=23908"/>
		<updated>2017-12-29T15:54:13Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=templates bedienen und verwalten&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMtemplate&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMtemplate.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Templates sind Vorlagen im Allgemeinen. Hier werden Vorlagen zur Programmierung der Register von HM Devices behandelt. &lt;br /&gt;
= Warum Templates =&lt;br /&gt;
Die Frage, warum man Register nicht einfach setzt sondern Templates nutzen sollte kommt immer wieder auf. Schliesslich sind wie alle Spezialisten...&lt;br /&gt;
Die Wahrheit allerdings bildet das nicht ab. Den auch den Spezialisten sei angeraten, Templates zu nutzen. Ja, warum den, was bieten Templates? Hierzu muss man verstehen wir FHEM, HM, Devices, Kanäle und peers zusammen hängen. &lt;br /&gt;
&lt;br /&gt;
Wie schon im Einsteigerdoc beschrieben hat ein HM Device remanente Register welche von FHEM gesetzt werden können und die Funktions- und Arbeitsweise definieren. FHEM selbst hat bestenfalls eine Kopie dieser Daten.&lt;br /&gt;
;soll-Register Verwaltung&lt;br /&gt;
:Da FHEM nur eine Kopie der Registerwerte verwaltet lebt man erst einmal in einer fragilen Welt. Registerwerte können sich ändern durch:&lt;br /&gt;
* Reset des Device&lt;br /&gt;
* Batteriefehler&lt;br /&gt;
* inkorrektes Schreiben und Übertragungsfehler&lt;br /&gt;
* Austausch eines Device&lt;br /&gt;
:Nach Lesen der Device Register hat FHEM einen neue Kopie - dies muss aber nicht den Wunschregistern entsprechen. Templates sind eine Ansammlung von Wunschregister. Somit können unterschiedliche Mechanismen genutzt werden, das System zu verwalten, prüfen und korrigieren.&lt;br /&gt;
;Funktionen für Einsteiger&lt;br /&gt;
:Nicht-Experten sollten primär Templates nutzen - um Funktionen zu realisieren,  und wenn gewünscht, Experten zu werden. Templares kann man einfach austauschen und dann anwenden.&lt;br /&gt;
;Verwalten von Funktionen statt Registern&lt;br /&gt;
:Als Experten kann man sicher die Register zeilsicher setzen. Wirklich? Wenn man sich eine clevere Lösung ausgedacht hat und sie reproduzieren will kann man einfach noch einmal nachdenken, nachlesen,... und schon hat man es wieder. Oder man hat ein Template definiert das man einfach nutzt.&lt;br /&gt;
; Lernen aus Templates&lt;br /&gt;
:Templates sind nicht verschlüsselt. Hat oder bekommt man ein Template kann man die dort gesetzten Register einfach einsehen - und wenn man will verstehen was gemacht wurde. &lt;br /&gt;
;Globales Anpassen aller Devices &lt;br /&gt;
: Hat man festgestellt, dass eine Funktion sub-optimal ist kann man das Temlate ändern und diese Änderungen allen Devices zu gute kommen lassen. Auf einmal. &lt;br /&gt;
&lt;br /&gt;
= Grundsätzliches zum Template =&lt;br /&gt;
Templates (hier) ist nun also eine Sammlung von Registern welche in einem Device gesetzt werden können. &lt;br /&gt;
&lt;br /&gt;
== Template Granularität ==&lt;br /&gt;
Man kann nicht alle Register eines Device in einem Template abbilden. Das wäre technisch komplex und macht auch von der Anwendung her keinen Sinn. &lt;br /&gt;
&lt;br /&gt;
*Aus Sicht der Funktion sollte man Templates nach deren Funktionen zusammenfassen.&lt;br /&gt;
*Aus Sicht des Devices sollte man Templates nach der Struktur des Device zusammenstellen.&lt;br /&gt;
*Die Implementierung erlaubt es, templates für jedes Register einzeln zu erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
*Weniger Templates erhöhen die Übersichtlichkeit&lt;br /&gt;
Die technische Lösung legt folgenden Templates nahe&lt;br /&gt;
#Alle Register eines Kanals oder Device - ausgenommen peer abhängige Register&lt;br /&gt;
#Alle Register eines Kanals eines Peers für short oder long&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für short&lt;br /&gt;
#Alle Register eines Kanals eines Peers nur für long&lt;br /&gt;
Ob man 2. oder die Kombination aus 3. und 4. nutzt ist Geschmackssache. &amp;lt;br&amp;gt;&lt;br /&gt;
Ein typischer Einsatz sind Schaltern und Dimmer bei welchen man die Aktionen der Peers festlegen will.&lt;br /&gt;
;usecase Template Granularität Dimmer&lt;br /&gt;
:Mit Peer1 soll bei short ein und bei long ausgeschaltet werden&lt;br /&gt;
:Mit Peer2 soll bei short getoggelt und bei long nicht geschaltet werden&lt;br /&gt;
:Mit Peer3 soll bei short nicht geschaltet und bei long getoggelt werden&lt;br /&gt;
:Mit Peer4 ist ein MotionDetector welcher bei short und einer bestimmten Helligkeit einschaltet, timed. Allerdings sollen Aktionen der anderen Peers oder der Zentrale das Licht dauer-ein schalten.&lt;br /&gt;
&lt;br /&gt;
== Template Flexibilität ==&lt;br /&gt;
Templates sind starr... und können parametriert werden. Also semistarr. Was jetzt? Nun man kann Templates mir bis zu 9 Parametern versehen. Sinnvoll sind wohl eher bis zu 3. &amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele sind:&lt;br /&gt;
*Treppenhausschaltern - mit einem Parameter kann man Einschaltdauer je Instanziierung festlegen. Sinnvoll könnte eine Treppenhausschaltung generell sein, nicht nur im Treppenhaus. Man kann generell alle Lichter nach ein paar Stunden ausschalten.&lt;br /&gt;
*Heizungstemplate - Boosttime: Man kann allen RTs das gleiche Template geben - allerdings kann man z.B. die Boosttime indivituell einstellen. &lt;br /&gt;
*MotionDetector Clients: Bei den Peers des Modtion detector (also den Schaltern) stellt man ein, dann diese reagieren sollen und wie lange diese brennen sollen. &lt;br /&gt;
&lt;br /&gt;
== Template Verwaltung==&lt;br /&gt;
Templates werden zusammen mit Registern verwaltet. Man benötigt demnach HMinfo. Sowohl die Template definition alsauch die Template Zuweisung werden im File zusammen mit den gelesenen Registern gesichert. Nach einem Einlesen dieses Files werden auch die Templates und deren Zuordnung neu erstellt.&lt;br /&gt;
&lt;br /&gt;
== Template Editieren==&lt;br /&gt;
Die aktuell einfachste Möglichkeit ein Template zu modifizieren ist, HMtemplate zu nutzen. HMtemplate ist ein Editor. Für den Betrieb wird es nicht genutzt. &lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
Was muss man also tun? Wenn man noch nichts eingerichtet hat:&lt;br /&gt;
  define hm HMinfo&lt;br /&gt;
  attr hm autoArchive 1&lt;br /&gt;
  attr hm autoLoadArchive 1_load&lt;br /&gt;
  attr hm configFilename regConfig.cfg&lt;br /&gt;
  define ht HMtemplate&lt;br /&gt;
&lt;br /&gt;
==Template aus Device erstellen==&lt;br /&gt;
Aufgabe ist es, aus einem existierenden Device ein Template zu erstellen. Wir haben &lt;br /&gt;
device &#039;&#039;myDev&#039;&#039;&lt;br /&gt;
Channel &#039;&#039;myChan&#039;&#039;&lt;br /&gt;
Channel gepeert  mit &#039;&#039;myChanPeer&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Kanal ist ein Schalter und wir wollen einen Parameter im Template nutzen: Die Anschaltzeit soll bei der Nutzung des Templates variabel eingesetzt werden. Wir werden also den Parameter &#039;&#039;timeOn&#039;&#039; nutzen. Das Template soll &#039;&#039;my1stTmpl&#039;&#039; genannt werden. Weiter soll das gesamte Verhalten des &#039;&#039;myChanPeer&#039;&#039; definiert werden, also short UND long. &lt;br /&gt;
  set ht define my1stTmpl&lt;br /&gt;
  attr ht tpl_param timeOn # name des Parameters - hier nur einer&lt;br /&gt;
  attr ht tpl_description &amp;quot;mein erstes Template&amp;quot;&lt;br /&gt;
  attr ht tpl_type peer-both&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_source myChan&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;br /&gt;
  attr ht tpl_peer myChanPeer&lt;br /&gt;
  &amp;lt;refresh browser&amp;gt;    # select liste der attribute wird neu eingelesen&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMinfo&amp;diff=23901</id>
		<title>HMinfo</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMinfo&amp;diff=23901"/>
		<updated>2017-12-29T11:05:06Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Übersicht über alle HomeMatic Geräte&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HMinfo&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMinfo.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HMInfo&#039;&#039;&#039; ist ein Modul, das einen Überblick über alle definierten [[HomeMatic]] Geräte gibt. Es bietet Funktionen zur Übersicht, Kontrolle, Archivierung  und, begrenzt, zur Programmierung der HomeMatic Komponenten. Somit soll es eine Hilfestellung bei Konfiguration und Fehlerbehandlung geben. &lt;br /&gt;
 &lt;br /&gt;
== Definition == &lt;br /&gt;
HMInfo wird erstellt / angelegt mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;define hm HMinfo&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach können alle Funktionen aufgelistet werden mit&lt;br /&gt;
:&amp;lt;code&amp;gt;get hm help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integritätsprüfungen ==&lt;br /&gt;
Zur berücksichtigen bei allen Funktionen von HMInfo ist die Tatsache, dass die Prüfung jeweils auf den innerhalb von FHEM vorliegenden Informationen passiert. Erste Korrekturmaßnahme ist daher immer von den betroffenen Devices die Informationen mit einem set &amp;lt;Device&amp;gt; getConfig zu aktualisieren. Dabei ist darüber hinaus zu berücksichtigen, dass entsprechend der konfigurierten Kommunikationsmethode (z.B. config) einige Devices erst nach einer gewissen Zeit oder nach Betätigen der Anlerntaste die Informationen als Antwort zurückliefern.&lt;br /&gt;
&lt;br /&gt;
Befehle, um die Gültigkeit von verschiedenen HomeMatic Eigenschaften zu überprüfen:&lt;br /&gt;
&lt;br /&gt;
=== peerCheck ===&lt;br /&gt;
Mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;get hm peerCheck&amp;lt;/code&amp;gt;&lt;br /&gt;
wird der Zustand der Peerings überprüft, d.h., ob alle [[Peering (HomeMatic)|Peerings]] auch beidseitig sind. Mögliche Meldungen, die eine Überarbeitung und/oder Korrektur von Definitionen erforderlich machen können:&lt;br /&gt;
;peer not verified. Check that peer is set on both sides &lt;br /&gt;
:ausgegebener Wert (z.B.): actorChan p:switchChan&lt;br /&gt;
:erforderliche Korrekturmaßnahme: Erneutes setzen des Links und Sicherstellen, dass das Kommando das entsprechende Device auch erreicht hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
&lt;br /&gt;
=== regCheck ===&lt;br /&gt;
Mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;get hm regCheck&amp;lt;/code&amp;gt;&lt;br /&gt;
wird überprüft, ob alle Register korrekt gelesen wurden. Mögliche Meldungen:&lt;br /&gt;
;missing register list &lt;br /&gt;
:ausgegebener Wert (z.B.): &amp;lt;code&amp;gt;dev01Ch01:  RegL_01: &amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: &amp;lt;code&amp;gt;set dev01Ch01 getConfig&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder &amp;lt;code&amp;gt;device01Ch01:	.RegL_03:sensor01Ch01,.RegL_03:sensor01Ch02&amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: Deutet darauf hin, dass nicht alle Informationen aus einem Device gelesen wurden. Ein set &amp;lt;Device&amp;gt; getConfig sollte alle Register auslesen. Sicherstellen, dass das Kommando zum Auslesen das entsprechende Device auch erreicht und eine Antwort geliefert hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
;Register changes pending &lt;br /&gt;
:ausgegebener Wert (z.B.): &amp;lt;code&amp;gt;sensor01Ch01&amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: Ein set &amp;lt;Device&amp;gt; getConfig sollte alle Register auslesen. Sicherstellen, dass das Kommando das entsprechende Device auch erreicht und eine Antwort geliefert hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
&lt;br /&gt;
=== configCheck ===&lt;br /&gt;
Mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;get hm configCheck&amp;lt;/code&amp;gt; werden die Befehle &#039;&#039;&#039;peerCheck&#039;&#039;&#039; und &#039;&#039;&#039;regCheck&#039;&#039;&#039; ausgeführt. Zusätzlich können noch Ergebnisse auftauchen wie&lt;br /&gt;
;PairedTo mismatch to IODev&lt;br /&gt;
:ausgegebener Wert (z.B.): &amp;lt;code&amp;gt;sensor01Ch01 paired:0x000000 IO attr: xxxxxx.&amp;lt;/code&amp;gt;&lt;br /&gt;
:erforderliche Korrekturmaßnahme: IODevice in den hmPairForSec Modus versetzen, Pairing-Modus am Device aktivieren und dadurch das pairing wiederholen. Ein Anschließendes set &amp;lt;Device&amp;gt; getConfig kann nicht schaden. Sicherstellen, dass das Kommando zum Auslesen das entsprechende Device auch erreicht und eine Antwort geliefert hat (s.o., ggf. bei Bedarf die Anlerntaste betätigen).&lt;br /&gt;
&lt;br /&gt;
== Anzeigen zur Übertragungssituation ==&lt;br /&gt;
===RSSI ===&lt;br /&gt;
;&amp;lt;code&amp;gt;get hm rssi [&amp;lt;filter&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erzeugt eine Tabelle aller RSSI Werte.&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm clear [&amp;lt;filter&amp;gt;] rssi&amp;lt;/code&amp;gt;&lt;br /&gt;
:setzt die RSSI Werte aller devices gemäß filter zurück. Eine neue Messung kann beginnen&lt;br /&gt;
&lt;br /&gt;
===protoEvents ===&lt;br /&gt;
;&amp;lt;code&amp;gt;get hm protoEvents [&amp;lt;filter&amp;gt;][short|long] &amp;lt;/code&amp;gt;&lt;br /&gt;
:Es wird eine Tabelle mit allen wichtigen Ereignissen zur Datenübertragung erzeugt. Dies beinhaltet Wiederholungen sowie Übertragungsfehler. &lt;br /&gt;
&amp;lt;code&amp;gt;short&amp;lt;/code&amp;gt; ist eine Fassung ohne Zeitstempel und lässt sich besser am Bildschirm darstellen.&lt;br /&gt;
Ausserdem kann man sehen, welche Abfragen noch in der Queue sind, z.B. durch &amp;lt;code&amp;gt;autoReadReg&amp;lt;/code&amp;gt; erzeugt. &lt;br /&gt;
Die Zustände aller für HM zuständigen IOs sind beinhaltet. &lt;br /&gt;
Alles in allem ist hier ein kompletter Überblick zur Kommunikation zu sehen. Der Befehl&lt;br /&gt;
 set hm clear [&amp;lt;filter&amp;gt;] Protocol&lt;br /&gt;
setzt die Protokoleinträge aller HomeMatic-Geräte gemäß Filter zurück. Das kann gut vor einer Konfigurationsaktion genutzt werden um zu kontrollieren, ob Fehler aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
===msgStat===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm msgStat &amp;lt;/code&amp;gt;&lt;br /&gt;
:Statistic der Übertragenen Messages insgesamt. Es gibt eine Tabelle über die letzten 24h und eine über die letzte Woche. &lt;br /&gt;
&lt;br /&gt;
== Speichern von Konfigurationen==&lt;br /&gt;
HMInfo speichert Konfigurationen der Geräte in Files. Mit dem Attribut configDir kann man ein Verzeichnis festlegen, in das alles geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
=== saveConfig===&lt;br /&gt;
[[Peering (HomeMatic)|Peers]] und Register werden in eine Datei geschrieben. Die Daten kann man ggf. wieder in ein Gerät oder ein Austauschgerät schreiben. Die Speicherung erfolgt kumulativ, man kann alles in eine Datei schreiben. &lt;br /&gt;
:&amp;lt;code&amp;gt;set hm saveConfig [&amp;lt;filter&amp;gt;] [&amp;lt;file&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== archConfig ===&lt;br /&gt;
Arbeitet prinzipiell wie saveConfig. Es werden jedoch nur vollständige Registersätze gespeichert, was einen höheren Level an Sicherheit der Dateninhalte gewährt.  &lt;br /&gt;
:&amp;lt;code&amp;gt;set hm archConfig [-a] [&amp;lt;file&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
Mit dem &#039;&#039;&#039;Attribut autoArchive&#039;&#039;&#039; kann man einstellen, dass automatisch nach erfolgreichem Lesen einer Device-Konfiguration diese archiviert wird. &lt;br /&gt;
Das Speichern erfolgt kumulativ. Ab einer Dateigröße von 1MB wird gepurged, also alles bis auf den neusten Eintrag jeder Entity gelöscht.  &lt;br /&gt;
&lt;br /&gt;
Um eine Konfiguration zu sichern, sollte eine Kopie des Archivs gemacht werden. Das Archiv wird bei Gelegenheit überschrieben. &lt;br /&gt;
&lt;br /&gt;
Template erstellen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set hm saveConfig -f ^meinDevice$ &amp;lt;myTemplateFile&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== loadConfig ===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm loadConfig [&amp;lt;filter&amp;gt;] [&amp;lt;filename&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest die Registerwerte, die für eine Entity in einem File gespeichert sind, zurück in die Readings. Sollten die Register schon in FHEM vorhanden sein, wird &#039;&#039;&#039;nicht&#039;&#039;&#039; überschrieben. &lt;br /&gt;
Sinn macht dies beispielsweise für remotes, die nicht automatisch gelesen werden sollen. Man kann somit nach einem system-reboot die Register &amp;quot;rekonstruieren&amp;quot; und wieder darstellen. &lt;br /&gt;
Es liegt im ermessen des User, eine bekannt aktuelle Version der Register einzulesen. &lt;br /&gt;
&lt;br /&gt;
=== purgeConfig===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm purgeConfig [&amp;lt;filename&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
:Löscht alle älteren Datensätze in einem File.&lt;br /&gt;
&lt;br /&gt;
== Konfigurationen bearbeiten ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
HMInfo erlaubt das Erstellen und Nutzen von Templates. Das sind Schablonen, die das Setzen von Registern abstrahieren und auf eine höhere Ebene heben. So kann man das Setzen der Konfiguration eines Aktors beispielsweise um mit einem Bewegungsmelder zusammen zu arbeiten in einem Kommando zusammenfassen.&lt;br /&gt;
Faktisch setzt das Template also eine Gruppe von Registern auf einmal.&lt;br /&gt;
&lt;br /&gt;
====templateList ====&lt;br /&gt;
Die vorhandenen templates kann man mit templateList sehen. &lt;br /&gt;
  get hm templateList&lt;br /&gt;
  &lt;br /&gt;
  SwOnCond         params:level cond               Info:switch: execute only if condition [geLo|ltLo] level is below limit&lt;br /&gt;
  SwToggle         params:                         Info:Switch: toggle on trigger&lt;br /&gt;
  autoOff          params:time                     Info:staircase - auto off after &amp;lt;time&amp;gt;, extend time with each trigger&lt;br /&gt;
  motionOnDim      params:ontime brightness        Info:Dimmer: on for time if MDIR-brightness below level&lt;br /&gt;
  motionOnSw       params:ontime brightness        Info:Switch: on for time if MDIR-brightness below level&lt;br /&gt;
Die Liste der verfügbaren Tempaltes, deren Parameter falls nötig und eine kurze Info, was das Template bewirken soll&lt;br /&gt;
&lt;br /&gt;
  get hm templateList autoOff&lt;br /&gt;
&lt;br /&gt;
  autoOff          params:time                     Info:staircase - auto off after &amp;lt;time&amp;gt;, extend time with each trigger&lt;br /&gt;
    ActionType       :jmpToTarget&lt;br /&gt;
    OffTime          :111600&lt;br /&gt;
    OnTime           :time&lt;br /&gt;
    SwJtDlyOff       :dlyOn&lt;br /&gt;
    SwJtDlyOn        :no&lt;br /&gt;
    SwJtOff          :dlyOn&lt;br /&gt;
    SwJtOn           :on&lt;br /&gt;
Ein templateList auf ein einzelnes Template zeigt im Detail, was das Template verändern wird.&lt;br /&gt;
&lt;br /&gt;
====templateSet ====&lt;br /&gt;
Um ein Template auf einen Aktor anzuwenden,muss man den Bereich wählen, auf den er angewendet werden soll. Je nach template kann das die Gruppe der Register zu einem [[Peering (HomeMatic)|Peer]], zu short oder long eines Peer oder Register ohne peer sein. &lt;br /&gt;
  set hm templateSet &amp;lt;entity&amp;gt; &amp;lt;templateName&amp;gt; &amp;lt;peer:[long|short]&amp;gt; [&amp;lt;param1&amp;gt; ...] &lt;br /&gt;
  set hm templateSet Licht1 autoOff FB1_Btn2:short 10&lt;br /&gt;
  set hm templateSet Licht1 SwOn FB1_Btn2:long&lt;br /&gt;
  set hm templateSet Licht1 SwOff FB1_Btn2:short&lt;br /&gt;
  set hm templateSet Licht1 SwOnOff FB1_Btn2:both&lt;br /&gt;
  set hm templateSet LichtDev setHost 0&lt;br /&gt;
Licht1 soll, wenn ein kurzer Trigger von FB1_Btn2 kommt für 10 sec eingeschaltet werden, dann ausgehen (Treppenhausfunktion). Kommt aber ein langer Tastendruck wird das Licht dauerhaft eingeschaltet. &lt;br /&gt;
  set hm templateSet Licht1 motionOnSw MD1:short 30 20&lt;br /&gt;
Der Switch Aktor Licht1 soll mit einem Bewegungsmelder betrieben werden. Der Bewegungsmelder sendet keine &#039;langen&#039; Trigger sondern nur kurze. Im Beispiel wird Licht1 für 30 Sekunden eingeschaltet, wenn der Bewegungsmelder einen Trigger sendet UND es dunkler ist als &amp;quot;20&amp;quot; (Brightness level).&lt;br /&gt;
&lt;br /&gt;
====templateDef ====&lt;br /&gt;
Neben den vorbereiteten Templates kann der User eigene definieren oder von anderen Usern sich Templates geben lassen. Die Definition von Templates ist für erfahrene User gedacht, im Gegensatz zur Nutzung eines Templates mit set - das ist für Anfänger gedacht. Man kann sein template manuell definieren oder ein bekanntes Device als Muster nutzen (fromMaster). Ein Template kann nur Gruppen von Registern setzen, nicht alle Register eines Device. Um die Gruppen anzusprechen muss man &amp;quot;peer&amp;quot; wie folgt setzen:&lt;br /&gt;
  0            Register ohne peer&lt;br /&gt;
  &amp;lt;peer&amp;gt;:both  Register eines peers&lt;br /&gt;
  &amp;lt;peer&amp;gt;:short Register eines peers nur Short&lt;br /&gt;
  &amp;lt;peer&amp;gt;:long  Register eines peers nur Long&lt;br /&gt;
setzen.&lt;br /&gt;
Man kann das template &amp;quot;dynamisch&amp;quot; gestalten, indem man einzelne Register beim templateSet übergibt. &lt;br /&gt;
Erst einmal statische Templates. Param ist hier &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  set hm templateDef &amp;lt;templateName&amp;gt; &amp;lt;param1[:&amp;lt;param2&amp;gt;...]&amp;gt; &amp;lt;description&amp;gt; &amp;lt;reg1&amp;gt;:&amp;lt;val1&amp;gt; [&amp;lt;reg2&amp;gt;:&amp;lt;val2&amp;gt;] ... &lt;br /&gt;
&lt;br /&gt;
  set hm templateDef t1 0 &amp;quot;TP1&amp;quot; OnTime:10 OffTime:20 OnDly:0 &lt;br /&gt;
&lt;br /&gt;
  set hm templateDef t1 fromMaster &amp;lt;entity&amp;gt; 0 &lt;br /&gt;
  set hm templateDef t2 fromMaster &amp;lt;entity&amp;gt; &amp;lt;peer&amp;gt;:both &lt;br /&gt;
  set hm templateDef t3 fromMaster &amp;lt;entity&amp;gt; &amp;lt;peer&amp;gt;:short&lt;br /&gt;
  set hm templateDef t4 fromMaster &amp;lt;entity&amp;gt; &amp;lt;peer&amp;gt;:long&lt;br /&gt;
&lt;br /&gt;
  set hm templateDef t4 fromMaster LichtWz remoteBtn1:long&lt;br /&gt;
&lt;br /&gt;
Dynamische Templates haben eine Parameterliste (bis zu 9) &amp;lt;param1[:&amp;lt;param2&amp;gt;...]&amp;gt;. Diese werden als p0 bis p8 genutzt - der Name ist dabei egal, er dient dem User also Hilfe beim templateList&lt;br /&gt;
 &lt;br /&gt;
  set hm templateDef myTemplate anzeit:auszeit &amp;quot;licht schaltet ständig an und aus&amp;quot; OnTime:p0 OffTime:p1 OnDly:0&lt;br /&gt;
&lt;br /&gt;
  set hm templateDef myAutoOff AnZeit &amp;quot;treppenhausschalter&amp;quot; ActionType:jmpToTarget OffTime:unused OnTime:p0 SwJtDlyOff:dlyOn SwJtDlyOn:no SwJtOff:dlyOn SwJtOn:on&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;Anzeit&amp;quot; ist der erste Parameter, also p0. Der Wert, den man bei Set einträgt wird in OnTime geschrieben. OnTime:p0&lt;br /&gt;
&lt;br /&gt;
Beim Definieren eines Templates wird die Registergültigkeit nicht geprüft. Das kommt beim Set.&lt;br /&gt;
&lt;br /&gt;
Mit dem Parameter del kann ein (fehlerhaftes) Template (hier myTemplate) wieder gelöscht werden. &lt;br /&gt;
&lt;br /&gt;
  set hm templateDef myTemplate del&lt;br /&gt;
&lt;br /&gt;
====templateChk ====&lt;br /&gt;
Template definitionen und zuweisungen (set) kann man mit &lt;br /&gt;
  set hm archConfig&lt;br /&gt;
speichern und mit &lt;br /&gt;
  set hm loadConfig&lt;br /&gt;
mach einem reboot laden. Welche templates einer entity zugewiesen sind kann man mit &lt;br /&gt;
  attr &amp;lt;entity&amp;gt; expert 12&lt;br /&gt;
in den Readings sichtbar machen. Siehe auch templateUsg.&lt;br /&gt;
&lt;br /&gt;
Man kann prüfen, ob ein Aktor/[[Peering (HomeMatic)|Peer]] gemäss einem Template programmiert ist. Sinnvoll ist eine komplette Prüfung aller zugewiesenen templates. Man kann aber auch filtern. &lt;br /&gt;
  get hm templateChk &lt;br /&gt;
  get hm templateChk [&amp;lt;filter&amp;gt;] &lt;br /&gt;
  get hm templateChk [&amp;lt;filter&amp;gt;] &amp;lt;templateName&amp;gt; &amp;lt;peer:[long|short]&amp;gt; [&amp;lt;param1&amp;gt; ...] &lt;br /&gt;
  get hm templateChk -f Rollo RolloHoch self01 5&lt;br /&gt;
Es wird geprüft für alle HM-Komponenten, die &amp;quot;Rollo&amp;quot; im Namen haben (siehe [[Homematic HMInfo#Filter|Filter]]) dem (hoffentlich vorhandenen) template &amp;quot;RolloHoch&amp;quot; verglichen. Geprüft wird nur der Peer &amp;quot;self01&amp;quot;, aber für long UND short.&lt;br /&gt;
  get hm templateChk -f Rollo RolloHoch self01:sort 5&lt;br /&gt;
das selbe, nur für short Einträge&lt;br /&gt;
&lt;br /&gt;
====templateUsg ====&lt;br /&gt;
Gibt eine Liste der zugewiesenen templates zurück&lt;br /&gt;
  get hm templateUsg  &lt;br /&gt;
  get hm templateUsg sortTemplate&lt;br /&gt;
  get hm templateUsg sortPeer&lt;br /&gt;
&lt;br /&gt;
====templateExe ====&lt;br /&gt;
Nach einem loadConfig oder einem templateChk können Fehler erkannt worden sein, die Register entspreche nicht dem Template. Mit diesem Kommando werden alle nicht korrekten Register in die Devices geschrieben. Sollte die Werte stimmen wird nichts gemacht. &lt;br /&gt;
  set hm templateExe&lt;br /&gt;
&lt;br /&gt;
Das Kommando kann also bedenkenlos eingesetzt werden, wenn die templates schon stimmen. Es wird nichts gesendet, keine Funklast erzeugt.&lt;br /&gt;
&lt;br /&gt;
====templateDel ====&lt;br /&gt;
eine zuweisung des Templates kann gelöscht werden&lt;br /&gt;
  set hm templateDel &amp;lt;entity&amp;gt; &amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Temperaturlisten===&lt;br /&gt;
HMInfo bietet verschiedene Methoden, Temperaturlisten für Thermostate (CC-TC, TC-IT oder RT) zu verwalten und zu nutzen. Siehe hierzu [[HomeMatic HMInfo TempList/Weekplan|Homematic Weekplan]]&lt;br /&gt;
&lt;br /&gt;
=== Registersätze kopieren ===&lt;br /&gt;
HMInfo erlaubt das Kopieren von Register-Listen. Über Register wird ein HM-Gerät eingestellt und die Register sind in Listen gruppiert. Die Reaktion und das Verhalten eines Aktors auf einen Trigger eines Sensors wird in dem Registersatz zu diesem [[Peering (HomeMatic)|Peer]] komplett beschrieben. &lt;br /&gt;
Durch die Möglichkeit einen solchen Registersatz im Device zu kopieren kann man das Verhalten, das man für einen Knopf/Sensor festgelegt hat identisch in einen zweiten kopieren. &lt;br /&gt;
HMInfo geht davon aus, dass die vom Gerät gelesene Konfiguration vor dem Kommando aktuell und komplett ist. &lt;br /&gt;
 set hm cpRegs Licht1:FB3_Btn2 Licht3:FB1_Btn4&lt;br /&gt;
 set hm cpRegs Licht2:FB3_Btn2 Licht2:FB1_Btn4&lt;br /&gt;
 set hm cpRegs Licht4:FB3_Btn2 Licht4:FB5_Btn2&lt;br /&gt;
Die obigen Beispiele bewirken der Reihe nach:&lt;br /&gt;
Duplizieren das Verhalten, das Fernbedienungsknopf 2 der Fernbedienung 3 bei Aktor Licht1 hervorruft auch nach Licht3 für Fernbedienungsknopf4 der Fernbedienung 1.&lt;br /&gt;
Duplizieren das Verhalten, das Fernbedienungsknopf 2 der Fernbedienung 3 bei Aktor Licht2 hervorruft auch nach Licht2 (selber Aktor) für Fernbedienungsknopf4 der Fernbedienung 1.&lt;br /&gt;
&lt;br /&gt;
== Web Einträge und Readings ==&lt;br /&gt;
Readings und Internals von HMInfo bieten eine Zusammenfassung des Zustands aller HM Komponenten. Diese sind in Fehler &#039;&#039;&#039;ERR&#039; , Warnungen &#039;&#039;&#039;W_&#039;&#039;&#039; und Information &#039;&#039;&#039;I_&#039;&#039;&#039; untergliedert. Die Prüfung und Erneuerung der Zähler und Werte wird mit:&lt;br /&gt;
:&amp;lt;code&amp;gt;set hm update &amp;lt;/code&amp;gt;&lt;br /&gt;
erreicht. Mit dem Attribut autoUpdate kann man es automatisch regelmäßig starten.&lt;br /&gt;
&lt;br /&gt;
=== Fehlermeldungen ===&lt;br /&gt;
Als Fehler erkannte Zustände werden in Variablen beginnend mit &#039;&#039;&#039;ERR&#039;&#039;&#039; dargestellt. Erfasste Fehler sind kritische RSSI Werte und Protokoll-/Übertragungsfehler. Ausserdem kann man im Attribut sumERROR eintragen, welche Readings zu einer Fehlermeldung führen sollen. Eingetragen werden:&lt;br /&gt;
Reading:&amp;lt;gutwert&amp;gt;. Wenn ein Reading mit einen anderen als dem &amp;quot;gutwert&amp;quot; gefunden wird, wird dies alarmiert. &lt;br /&gt;
Beispiel: &lt;br /&gt;
:&amp;lt;code&amp;gt;battery:ok &amp;lt;/code&amp;gt;&lt;br /&gt;
hat eine HM Komponente ein Reading &amp;quot;battery&amp;quot; und dieses hat einen anderen Wert als &amp;quot;ok&amp;quot; wird dies alarmiert. &lt;br /&gt;
In den Readings von HMInfo würde im Feherfall&lt;br /&gt;
  internal:&lt;br /&gt;
    ERR_names &amp;lt;devicename1&amp;gt;,&amp;lt;devicename2&amp;gt;&lt;br /&gt;
  Readings:&lt;br /&gt;
    ERR_battery low:2&lt;br /&gt;
&lt;br /&gt;
Der default aller Error-meldungen ist&lt;br /&gt;
battery:ok,sabotageError:off,powerError:ok,overload:off,overheat:off,reduced:off,motorError:no,error:none,uncertain:yes,smoke_detect:none,cover:closed&lt;br /&gt;
&lt;br /&gt;
Diese Zusammenfassung der Fehlermeldungen könnte man nutzen, um über notify einen Alarm auszulösen oder eine E-Mail zu senden. &lt;br /&gt;
&lt;br /&gt;
=== Warnungen===&lt;br /&gt;
Hierzu gehören Wiederholungen von Nachrichten (nicht aber Abbrüche, das sind Fehler). Es wird auch ausstehendes Lesen der Konfiguration, das durch autoReadReg getriggert wird, hier angezeigt. &lt;br /&gt;
&lt;br /&gt;
=== Statusmeldungen ===&lt;br /&gt;
Analog zu den Fehlermeldungen kann man mit dem Attribut sumStatus gewisse Readings zählen lassen. Beipiel wäre &lt;br /&gt;
  attr HM sumStatus motor&lt;br /&gt;
HMInfo zeigt in dem Reading I_sum_motor dann an, welcher Inhalt des Readings &amp;quot;motor&amp;quot;  wie oft gefunden wurde. Es könnte so aussehen&lt;br /&gt;
  stop:on:4;stop:1;&lt;br /&gt;
Vier Komponenten stehen auf motor: stop:on und eine steht auf motor: stop&lt;br /&gt;
&lt;br /&gt;
Das Internal &#039;&#039;&#039;I_HM_IOdevices&#039;&#039;&#039; zeigt die von HM Komponenten genutzten IOs und deren State. &lt;br /&gt;
&lt;br /&gt;
== Infos ==&lt;br /&gt;
  get hm models [-f &amp;lt;regexp&amp;gt;]&lt;br /&gt;
  get hm models&lt;br /&gt;
  get hm models -f remote&lt;br /&gt;
  get hm models -f HM_RC&lt;br /&gt;
Zeigt alle in FHEM unterstützten Modelle und deren wesentliche Parameter. Man kann mittels regexp die Liste filtern.&lt;br /&gt;
&lt;br /&gt;
  get hm param [&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;] parameter1 parameter2&lt;br /&gt;
  get hm param -d IODev DEF model&lt;br /&gt;
  get hm param -c -f Rollo peerList&lt;br /&gt;
man kann sich listen von Parametern anzeigen lassen  &lt;br /&gt;
&lt;br /&gt;
  get hm register [&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;]&lt;br /&gt;
zeigt Register in tabellarischer Form. &lt;br /&gt;
&lt;br /&gt;
  get hm peerXref[&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;]&lt;br /&gt;
gibt an, wer mit wem [[Peering (HomeMatic)|gepeert]] ist&lt;br /&gt;
&lt;br /&gt;
== Rücksetzen von Variablen und Zählern ==&lt;br /&gt;
 set HM clear [&amp;lt;typeFilter&amp;gt;] [Protocol|readings|msgStat|register|rssi]&lt;br /&gt;
*register löscht alle Register-readings&lt;br /&gt;
*readings löscht &#039;&#039;&#039;alle&#039;&#039;&#039; readings&lt;br /&gt;
*Protocol löscht alle Protokol-einträge, pending Kommandos und Protokoll-fehler. &lt;br /&gt;
*rssi löscht alle ermittelten RSSI Werte&lt;br /&gt;
*msgStat setzt die Message Statistik zurück&lt;br /&gt;
&lt;br /&gt;
== Filter ==&lt;br /&gt;
Kommandos in HMInfo wirken auf alle HM Komponenten. Man kann dies mit Hilfe der Filter einschränken. Zum einen gibt es &#039;&#039;&#039;modelsFilter&#039;&#039;&#039;, womit man nur devices, nur channels, nur virtuelle Entities bearbeiten kann&lt;br /&gt;
     set &amp;lt;name&amp;gt; &amp;lt;cmd&amp;gt; &#039;&#039;&#039;[-dcasevi]&#039;&#039;&#039;  [params]&lt;br /&gt;
        entities according to list will be processed&amp;quot;&lt;br /&gt;
          d - device   :include devices&amp;quot;&lt;br /&gt;
          c - channels :include channels&amp;quot;&lt;br /&gt;
          i - ignore   :include devices marked as ignore&amp;quot;&lt;br /&gt;
          v - virtual  :supress fhem virtual&amp;quot;&lt;br /&gt;
          p - physical :supress physical&amp;quot;&lt;br /&gt;
          a - aktor    :supress actor&amp;quot;&lt;br /&gt;
          s - sensor   :supress sensor&amp;quot;&lt;br /&gt;
          e - empty    :include results even if requested fields are empty&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein auf &#039;&#039;&#039;-d&#039;&#039;&#039; gefiltertes Kommando wird nur auf devices, nicht aber auf channels angewendet. &lt;br /&gt;
&lt;br /&gt;
Dann gibt es noch den &#039;&#039;&#039;nameFilter&#039;&#039;&#039;, mit dem mittels regexp auf den Namen der Entity gefiltert werden kann&lt;br /&gt;
  -f Rollo # alle Entities mit Rollo im Namen&lt;br /&gt;
  -f ^Rollo$ # nur Entity mit Namen &amp;quot;Rollo&amp;quot;&lt;br /&gt;
  -f Rollo$ # nur Entity deren Name auf Rollo endet&lt;br /&gt;
&lt;br /&gt;
Die Filter kann man kombinieren mit &lt;br /&gt;
  -c -f Rollo # alle Kanäle mit Rollo im Namen&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
Zeige mir die Parameter IODev und room der Devices mit Rollo im Namen&lt;br /&gt;
  set hm param -d -f Rollo IODev room&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
* &#039;&#039;&#039;autoArchive &#039;&#039;&#039; automatisch archivieren von vollständigen Konfigurationen.&lt;br /&gt;
* &#039;&#039;&#039;autoUpdate&#039;&#039;&#039; startet regelmäßig das Komamndo &amp;quot;update&amp;quot;. Die Wiederholzeit wird eingestellt mit hh:mm. Sinnvoll erscheint z.B. alle 5 Minuten, also 00:05.&lt;br /&gt;
* &#039;&#039;&#039;configDir&#039;&#039;&#039; bietet die Möglichkeit, ein Verzeichnis zu definieren, in das HMInfo Dateien ablegen und von dem es die Dateien lesen wird. Default ist fhem_root.&lt;br /&gt;
* &#039;&#039;&#039;configFilename&#039;&#039;&#039; legt einen default Namen fest, der bei save und archive genutzt wird. Default ist regSave.cfg.&lt;br /&gt;
* &#039;&#039;&#039;hmAutoReadScan&#039;&#039;&#039; zeitinterval in Minuten, in denen CUL_HM prüft, ob offene autoRead bereitstehen und die IOs die Kapazität haben. Default ist 4 min.&lt;br /&gt;
==weiterführende Links==&lt;br /&gt;
Templates &amp;lt;u&amp;gt;[[Homematic_Templates|HMtemplates]]&amp;lt;/u&amp;gt;&lt;br /&gt;
== Quellen == &lt;br /&gt;
* Thread [http://forum.fhem.de/index.php?topic=11035.0 HMinfo] im FHEM Forum&lt;br /&gt;
* Thread {{Link2Forum|Topic=20119|LinkText=HMINfo, Intention, Sinn und Zweck}} im FHEM Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homematic-Ger%C3%A4te%C3%BCbersicht&amp;diff=23899</id>
		<title>Homematic-Geräteübersicht</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Homematic-Ger%C3%A4te%C3%BCbersicht&amp;diff=23899"/>
		<updated>2017-12-29T10:32:55Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite strukturiert die vorhandenen Wiki-Seiten zu Homematic-Geräten in Gruppen zur leichteren Orientierung. Derzeit sind nicht alle Homematic-Geräte aufgeführt, da die zugehörigen Wiki-Seiten noch nicht erstellt wurden.&lt;br /&gt;
&lt;br /&gt;
Für alle Geräte mit AA/AAA-Batterien werden empfohlen: [http://www.ikea.com/de/de/catalog/products/80240505/ IKEA Akalisk AAA] und [http://www.ikea.com/de/de/catalog/products/50240502/ IKEA Akalisk AA], die sehr temperaturbeständig und dauerhaft sind. Die [http://www.elv.de/installationsadapter-homematic-smart-home.html Übersicht von ELV] zeigt die vorhandenen Installationsadapter (55mm Maßeinheit) zur Integration in vorhandene Schalterserien.&lt;br /&gt;
&lt;br /&gt;
== Homematic Managen ==&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Zentrale CCU2&lt;br /&gt;
|HM-Cen-O-TW-X-X-2&lt;br /&gt;
|[http://www.elv.de/homematic-zentrale-ccu-2.html Produkt] [https://files.elv.com/Assets/Produkte/10/1035/103584/Downloads/HM-Cen-O-TW-x-x-2_UM_GE_eQ-3_web.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|Einzige Möglichkeit, &#039;&#039;&#039;Homematic IP&#039;&#039;&#039;-Geräte anzusteuern&lt;br /&gt;
|-&lt;br /&gt;
|LAN Konfigurationsadapter&lt;br /&gt;
|[[HM-CFG-LAN_LAN_Konfigurations-Adapter|HM-CFG-LAN]]&lt;br /&gt;
|&lt;br /&gt;
|[[HM-LGW-O-TW-W-EU_Funk-LAN_Gateway|HM-LGW-O-TW-W-EU]]&lt;br /&gt;
|End-of-Sale, 230V Steckernetzteil&lt;br /&gt;
|-&lt;br /&gt;
|LAN Konfigurationsadapter&lt;br /&gt;
|[[HM-LGW-O-TW-W-EU_Funk-LAN_Gateway|HM-LGW-O-TW-W-EU]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-lan-gateway.html Produkt] [https://files.elv.com/Assets/Produkte/10/1040/104029/Downloads/104029_lan_gateway_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|5VDC 1A, LAN-Firmwareversionen &amp;lt; 1.1.5 haben Stabilitätsprobleme&lt;br /&gt;
|-&lt;br /&gt;
|USB Konfigurationsadapter&lt;br /&gt;
|[[HM-CFG-USB_USB_Konfigurations-Adapter|HM-CFG-USB]]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|End-of-Sale, USB&lt;br /&gt;
|-&lt;br /&gt;
|Raspberry Pi Homematic-Modul&lt;br /&gt;
|[[HM-MOD-RPI-PCB_HomeMatic_Funkmodul_für_Raspberry_Pi|HM-MOD-RPI-PCB]]&lt;br /&gt;
|[http://www.elv.de/homematic-funkmodul-fuer-raspberry-pi-bausatz.html Produkt]&lt;br /&gt;
|&lt;br /&gt;
|1,8-3,6VDC, Aufsteckplatine für Raspberry Pi, empfohlene Lösung&lt;br /&gt;
|-&lt;br /&gt;
|Repeater&lt;br /&gt;
|[[HM-Sys-sRP-Pl_Funk-Zwischenstecker_Repeater|HM-SYS-SRP-P1]]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|End-of-Sale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Homematic DIY ==&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Sendemodul 8-Kanal&lt;br /&gt;
|[[HM-MOD-EM-8_8-Kanal-Sendemodul|HM-MOD-EM-8]]&lt;br /&gt;
|[http://www.elv.de/homematic-8-kanal-sendemodul.html Produkt] [https://files.elv.com/Assets/Produkte/13/1329/132939/Downloads/132939_sendemodul_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
||2,3-3V/3,5-12V DC, für eigene Entwicklungen - Bastlermodul&lt;br /&gt;
|-&lt;br /&gt;
|Empfängermodul 8-Kanal&lt;br /&gt;
|[[HM-MOD-Re-8_8-Kanal-Empfangsmodul|HM-MOD-Re-8]]&lt;br /&gt;
|[http://www.elv.de/homematic-8-kanal-empfangsmodul.html Produkt] [https://files.elv.com/Assets/Produkte/13/1321/132143/Downloads/132143_Empfangsmodul_UM.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|2,3-3V/3,5-12V DC, für eigene Entwicklungen - Bastlermodul&lt;br /&gt;
|-&lt;br /&gt;
|NC/NO-Zustands-Sendemodul&lt;br /&gt;
|[[HM-SCI-3-FM_3-Kanal-Funk-Schließerkontakt-Interface|HM-SCI-3-FM]]&lt;br /&gt;
|[http://www.elv.de/homematic-schliesserkontakt-interface-fuer-oeffner-und-schliesserkontakte.html Produkt] [https://files.elv.com/Assets/Produkte/9/914/91461/Downloads/91461_HM_SCI_3FMD1_GB_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|CR2032 Batterie, für eigene Entwicklungen - Bastlermodul&lt;br /&gt;
|-&lt;br /&gt;
|Klingelsignalsensor&lt;br /&gt;
|[[HM-Sen-DB-PCB_Klingelsignalsensor|HM-SEN-DB-PCB]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-klingelsignalsensor-bausatz.html Produkt] [https://files.elv.com/Assets/Produkte/13/1328/132846/Downloads/132846_HM-Sen-DB-PCB_UM_G_eQ-3_150608_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|2 AAA Batterien, sendet keine zyklischen Statusmeldungen, erkennt Signale 5-12V AC/DC&lt;br /&gt;
|-&lt;br /&gt;
|Relais-Schaltmodul&lt;br /&gt;
|RSM1&lt;br /&gt;
|[https://www.elv.de/elv-relais-schaltmodul-rsm1-bausatz.html Produkt]&lt;br /&gt;
|&lt;br /&gt;
|Unterstützt verschiedene Relaistypen, als Erweiterung für OpenCollector-Ausgänge&lt;br /&gt;
|-&lt;br /&gt;
|Funk-Schaltaktor Kleinspannung&lt;br /&gt;
|[[HM-LC-Sw1-PCB 1-Kanal-Schaltaktor für Kleinspannung|HM-LC-Sw1-PCB]]&lt;br /&gt;
|[https://www.elv.de/elv-homematic-funk-schaltaktor1fach-fuer-kleinspannunghm-lc-sw1-pcb-bausatz.html Produkt]&lt;br /&gt;
|&lt;br /&gt;
|wahlweise mit Kleinspannungsrelais oder open-collector-Ausgang nutzbar&lt;br /&gt;
|-&lt;br /&gt;
|Funk-Sendemodul, 8-Bit&lt;br /&gt;
|[[HM-MOD-EM-8bit 3-Kanal-Sendemodul mit 8-Bit-Datenkanal|HM-MOD-EM-8Bit]]&lt;br /&gt;
|[https://www.elv.de/elv-homematic-funk-sendemodul-8-bit-bausatz.html Produkt]&lt;br /&gt;
|&lt;br /&gt;
|Taster und Dateneingänge&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Homematic Remote ==&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Taster Unterputz, 2fach&lt;br /&gt;
|[[HM-PB-2-FM_2fach-Funk-Wandtaster_für_Markenschalter|HM-PB-2-FM]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-wandsender-fuer-markenschalter-2fach-unterputzmontage-komplettbausatz.html Produkt] [https://files.elv.com/Assets/Produkte/13/1324/132438/Downloads/132438_HM-PB-2-FM_UM_G_eQ-3_150317_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|2 AAA Batterien, passend zu 55mm-Installationsrahmen verschiedener Hersteller &lt;br /&gt;
|-&lt;br /&gt;
|Taster Unterputz, 2fach&lt;br /&gt;
|[[HM-RC-2-PBU-FM_Unterputz-Wandsender|HM-RC-2-PBU-FM]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-wandsender-2-fach-fuer-markenschalter-230-v-unterputzmontage.html Produkt] [https://files.elv.com/Assets/Produkte/14/1422/142237/Downloads/142237_funkwandsender_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V, passend zu verschiedenen Installationsrahmen&lt;br /&gt;
|-&lt;br /&gt;
|Taster, 2fach&lt;br /&gt;
|[[HM-PB-2-WM55_2fach-Funk-Wandtaster|HM-PB-2-WM55]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-wandsender-2fach.html Produkt] [https://files.elv.com/Assets/Produkte/9/992/99240/Downloads/99240_HM_PB_2_WM55_UM.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|2 AAA Batterien, passend zu Installationsrahmen verschiedener Hersteller&lt;br /&gt;
|-&lt;br /&gt;
|Taster, 3 x 2fach&lt;br /&gt;
|[[HM-PB-6-WM55 6fach-Funk-Wandtaster|HM-PB-6-WM55]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-wandtaster-6fach.html Produkt] [https://files.elv.com/Assets/Produkte/13/1301/130113/Downloads/130113_6fach_Wandtaster_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|2 AAA Batterien, passend zu Installationsrahmen verschiedener Hersteller&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Wandtaster mit OLED Display&lt;br /&gt;
|[[HM-PB-4DIS-WM_Funk-Wandtaster_mit_Display|HM-PB-4Dis-WM]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-wandtaster-mit-display.html Produkt] [https://files.elv.com/Assets/Produkte/8/859/85975/Downloads/85975_Display_Wandtaster_v1.2_UM.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|3 AAA Batterien, kleines Display, nur altweiß (nicht reinweiß)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Tasterschnittstelle, 4fach&lt;br /&gt;
|[[HM-PBI-4-FM_Funk-Tasterschnittstelle_4fach|HM-PBI-4-FM]]&lt;br /&gt;
|[http://www.elv.de/homematic-hm-pbi-4-fm-funk-tasterschnittstelle-4fach-unterputzmontage.html Produkt] [https://files.elv.com/service/manuals/76120_HM_PBI_4_FM_UM_GE_eQ_3_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
||CR2032 Batterie, für die Kombination mit Installationstastern verschiedener Hersteller&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Fernbedienung, 12 Tasten&lt;br /&gt;
|[[HM-RC-12_Funkfernbedienung_12_Tasten|HM-RC-12]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-fernbedienung-12-tasten-weiss-1.html Produkt] [https://files.elv.com/service/manuals/Homematic/73968_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|3 AAA Batterien, In Schwarz als HM-RC-12-B&lt;br /&gt;
|-&lt;br /&gt;
|Fernbedienung, 4 Tasten&lt;br /&gt;
|[[HM-RC-4-2_Funkfernbedienung_4_Tasten|HM-RC-4-2]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-handsender-4-tasten.html Produkt] [https://files.elv.com/Assets/Produkte/10/1053/105397/Downloads/105397_4tasten_sender_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|AAA Batterie, Schlüsselanhänger, verschiedene Varianten HM-RC-Key4-2, HM-RC-Sec4-2&lt;br /&gt;
|-&lt;br /&gt;
|Fernbedienung, 19 Tasten&lt;br /&gt;
|HM-RC-19&lt;br /&gt;
|ADDME&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Fernbedienung, 8 Tasten&lt;br /&gt;
|HM-RC-8&lt;br /&gt;
|ADDME&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Homematic Schalten ==&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck: Aussen&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Schalter Aufputz 4fach&lt;br /&gt;
|[[HM-LC-Sw4-SM_4fach_Schaltaktor_Aufputz|HM-LC-Sw4-SM]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-schaltaktor-4fach-aufputzmontage.html Produkt] [https://files.elv.com/Assets/Produkte/7/767/76796/Downloads/76796_hm_lc_sw4_sm_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V, IP65, enge Bauweise&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck: Hutschiene&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Schalter &lt;br /&gt;
|[[HM-LC-Sw1-DR_1fach_Schaltaktor_Hutschiene|HM-LC-Sw1-DR]]&lt;br /&gt;
|[http://www.elv.de/homematic-1-kanal-schaltaktor-im-hutschienengehaeuse-1.html Produkt] [https://files.elv.com/Assets/Produkte/14/1413/141379/Downloads/141379_schaltaktor_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
||230V, mit Tastereingang, auch als Bausatz verfügbar&lt;br /&gt;
|-&lt;br /&gt;
|Schalter 4fach&lt;br /&gt;
|[[HM-LC-Sw4-DR_4fach_Schaltaktor_Hutschiene|HM-LC-Sw4-DR]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-schaltaktor-4fach-hutschiene.html Produkt] [https://files.elv.com/Assets/Produkte/9/918/91836/Downloads/91836_Funk_Schaltaktor_UM.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V, 4 TE, kein Tastereingang, auch als Bausatz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck: Unterputz&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Schalter &lt;br /&gt;
|[[HM-LC-SW1-FM_Schaltaktor_1-fach_UP|HM-LC-Sw1-FM]]&lt;br /&gt;
|[http://www.elv.de/homematic-hm-lc-sw1-fm-unterputzschalter-1fach.html Produkt] [https://files.elv.com/Assets/Produkte/7/767/76793/Downloads/76793_HM_LC_Sw1_FM_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V, mit Tastereingang, 16A&lt;br /&gt;
|-&lt;br /&gt;
|Schalter 2fach&lt;br /&gt;
|[[HM-LC-SW2-FM_Schaltaktor_2-fach_UP|HM-LC-Sw2-FM]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-schaltaktor-2fach-unterputzmontage-1.html Produkt] [https://files.elv.com/service/manuals/76793_HM_Unterputzschalter_UM.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V, mit Tastereingang, 5A zusammen. 2 x HM-LC-Sw1-FM empfohlen.&lt;br /&gt;
|-&lt;br /&gt;
|Schalter &lt;br /&gt;
|[[HM-LC-Sw1PBU-FM_Unterputz-Schaltaktor_1-fach|HM-LC-Sw1PBU-FM]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-schaltaktor-fuer-markenschalter-1fach-unterputzmontage.html Produkt] [https://files.elv.com/Assets/Produkte/10/1030/103029/Downloads/103029_FunkSchaltaktor_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V, passend zu 55mm-Installationsrahmen verschiedener Hersteller &lt;br /&gt;
|-&lt;br /&gt;
|Schalter PEHA&lt;br /&gt;
|[[HM-LC-Sw1PB-FM_Schaltaktor_mit_Tasteraufsatz_1fach|HM-LC-Sw1PB-FM]]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|230V, End-of-Sale&lt;br /&gt;
|-&lt;br /&gt;
|Schalter 2fach PEHA&lt;br /&gt;
|[[HM-LC-Sw2PB-FM_Schaltaktor_mit_Tasteraufsatz_2fach|HM-LC-Sw2PB-FM]]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|230V, End-of-Sale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck: Zwischenstecker&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Schalter Zwischenstecker&lt;br /&gt;
|[[HM-LC-Sw1-Pl2_Funk-Zwischenstecker-Schaltaktor_1fach|HM-LC-Sw1-Pl2]]&lt;br /&gt;
|&lt;br /&gt;
|[[HM-LC-Sw1-Pl-DN-R1|HM-LC-Sw1-Pl-DN-R1]]&lt;br /&gt;
|End-of-Sale&lt;br /&gt;
|-&lt;br /&gt;
|Schalter Zwischenstecker&lt;br /&gt;
|[[HM-LC-Sw1-Pl-DN-R1|HM-LC-Sw1-Pl-DN-R1]]&lt;br /&gt;
|[https://www.elv.de/homematic-132989-funk-schaltaktor-zwischenstecker-fuer-smart-home-hausautomation.html Produkt] [https://files.elv.com/Assets/Produkte/13/1329/132989/Downloads/HM-LC-Sw1-Pl-DN-R1_UM_GEFN_eQ-3_150407.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|Nachfolger des HM-LC-Sw1-Pl2&lt;br /&gt;
|-&lt;br /&gt;
|Schalter Frankreich, Polen, Belgien&lt;br /&gt;
|ADDME&lt;br /&gt;
|ADDME&lt;br /&gt;
|&lt;br /&gt;
|Artikelnummer 141127&lt;br /&gt;
|-&lt;br /&gt;
|Schalter England, Irland&lt;br /&gt;
|ADDME&lt;br /&gt;
|ADDME&lt;br /&gt;
|&lt;br /&gt;
|Artikelnummer 131132&lt;br /&gt;
|-&lt;br /&gt;
|Schalter Italien&lt;br /&gt;
|ADDME&lt;br /&gt;
|ADDME&lt;br /&gt;
|&lt;br /&gt;
|Artikelnummer 141129&lt;br /&gt;
|-&lt;br /&gt;
|Schalter Schweiz&lt;br /&gt;
|ADDME&lt;br /&gt;
|ADDME&lt;br /&gt;
|&lt;br /&gt;
|Artikelnummer 141130&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck: Batterie&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Schalter 1fach&lt;br /&gt;
|[[HM-LC-Sw1-Ba-PCB_1-Kanal-Funk-Schaltaktor_für_Batteriebetrieb|HM-LC-Sw1_Ba-PCB]]&lt;br /&gt;
|[http://www.elv.de/elv-homematic-schaltaktor-fuer-batteriebetrieb-fertiggeraet.html Produkt] [https://files.elv.com/Assets/Produkte/10/1048/104895/Downloads/104895_Funk_Schaltaktor_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|4-15VDC oder 2-3VDC, Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|Schalter 4fach&lt;br /&gt;
|[[HM-LC-Sw4-Ba-PCB_4-Kanal-Funk-Schaltaktor_für_Batteriebetrieb|HM-LC-Sw4-Ba-PCB]]&lt;br /&gt;
|[http://www.elv.de/homematic-4-kanal-funk-schaltaktor-fuer-batteriebetrieb-bausatz.html Produkt] [https://files.elv.com/Assets/Produkte/13/1305/130557/Downloads/130557_hm_schaltaktor_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|7-15VDC, 160mA, schaltet 4 x 42VDC/30VAC, 1A auch als Bausatz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Homematic Steuern ==&lt;br /&gt;
Für die Konfiguration der Jalousieaktoren ist [[HomeMatic_Type_Blind]] hilfreich.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Jalousieaktor Unterputz&lt;br /&gt;
|[[HM-LC-BL1-FM_Funk-Jalousieaktor|HM-LC-BL1-FM]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-rollladenaktor-1fach-unterputzmontage.html Produkt] [https://files.elv.com/Assets/Produkte/7/767/76799/Downloads/76799_HM_LC_Sw1_FM_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V, 250W Motorlast&lt;br /&gt;
|-&lt;br /&gt;
|Jalousieaktor Unterputz PEHA&lt;br /&gt;
|[[HM-LC-BL1-PB-FM_Unterputz_Jalousieaktor_PEHA|HM-LC-BL1-PB-FM]]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|230V, End-of-Sale&lt;br /&gt;
|-&lt;br /&gt;
|Jalousieaktor Aufputz&lt;br /&gt;
|[[HM-LC-Bl1-SM_Funk-Jalousieaktor|HM-LC-Bl1-SM]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-rollladenaktor-1fach-aufputzmontage.html Produkt] [https://files.elv.com/Assets/Produkte/7/768/76800/Downloads/76800_hm_lc_bl1_sm_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V, 800W Motorlast&lt;br /&gt;
|-&lt;br /&gt;
|Jalousieaktor Unterputz&lt;br /&gt;
|[[HM-LC-Bl1PBU-FM_Unterputz-Jalousieaktor|HM-LC-Bl1PBU-FM]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-rollladenaktor-fuer-markenschalter-1fach-unterputzmontage.html Produkt] [https://files.elv.com/Assets/Produkte/10/1030/103038/Downloads/103038_FunkRollladenaktor_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V Motorlast, passend zu 55mm-Installationsrahmen verschiedener Hersteller&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Dimmer Zwischenstecker Anschnitt&lt;br /&gt;
|[[HM-LC-Dim1L-Pl-2_Funk-Zwischenstecker-Dimmaktor_1fach_Phasenanschnitt|HM-LC-Dim1L-Pl-2]]&lt;br /&gt;
|&lt;br /&gt;
|HM-LC-Dim1L-Pl-3&lt;br /&gt;
|End-of-Sales&lt;br /&gt;
|-&lt;br /&gt;
|Dimmer Zwischenstecker Anschnitt&lt;br /&gt;
|[[HM-LC-Dim1L-Pl-2_Funk-Zwischenstecker-Dimmaktor_1fach_Phasenanschnitt|HM-LC-Dim1L-Pl-3]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-dimmaktor-zwischenstecker-phasenanschnitt.html Produkt] [https://files.elv.com/Assets/Produkte/7/767/76797/Downloads/76797_HM-LC-Sw1-Pl-2_UM_GE_eQ-3_120723_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|Phasen&#039;&#039;&#039;an&#039;&#039;&#039;schnitt, identische Konfiguration&lt;br /&gt;
|-&lt;br /&gt;
|Dimmer Zwischenstecker Anschnitt&lt;br /&gt;
|HM-LC-Dim1T-Pl-3&lt;br /&gt;
|ADDME&lt;br /&gt;
|&lt;br /&gt;
|230V, Phasen&#039;&#039;&#039;ab&#039;&#039;&#039;schnitt&lt;br /&gt;
|-&lt;br /&gt;
|Dimmer Unterputz PWM/LED&lt;br /&gt;
|[[HM-LC-Dim1PWM-CV_Dimmaktor_PWM_DC-LED|HM-LC-Dim1PWM-CV]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-dimmer-1-fach-12v-pwm-fertiggeraet.html Produkt] [https://files.elv.com/Assets/Produkte/9/994/99444/Downloads/99444_Funk_Dimmaktor_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|12-24VDC, 60VA Anschlußleistung&lt;br /&gt;
|-&lt;br /&gt;
|Dimmer PWM/LED&lt;br /&gt;
|[[HM-LC-RGBW-WM_Funk-RGBW-Controller|HM-LC-RGBW-WM]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-rgbw-controller.html Produkt] [https://files.elv.com/Assets/Produkte/14/1419/141952/Downloads/141952_rgbw_controller_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|12-24VDC, 34W je Kanal, auch als Bausatz erhältlich&lt;br /&gt;
|-&lt;br /&gt;
|Dimmer Unterputz&lt;br /&gt;
|[[HM-LC-DIM1T-FM_1-Kanal-Dimmer_UP|HM-LC-Dim1T-FM]]&lt;br /&gt;
|[http://www.elv.de/elv-1-kanal-unterputzdimmer-phasenabschnitt.html Produkt] [https://files.elv.com/Assets/Produkte/9/918/91816/Downloads/91816_HM_LC_Dim1T_FM_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V, 180W Anschlußleistung, Phasen&#039;&#039;&#039;ab&#039;&#039;&#039;schnitt&lt;br /&gt;
|-&lt;br /&gt;
|Dimmer Zwischendecke&lt;br /&gt;
|HM-LC-Dim1T-CV&lt;br /&gt;
|ADDME&lt;br /&gt;
|&lt;br /&gt;
|230V, Phasen&#039;&#039;&#039;ab&#039;&#039;&#039;schnitt&lt;br /&gt;
|-&lt;br /&gt;
|Dimmer Zwischendecke&lt;br /&gt;
|HM-LC-Dim1L-CV&lt;br /&gt;
|ADDME&lt;br /&gt;
|&lt;br /&gt;
|230V, Phasen&#039;&#039;&#039;an&#039;&#039;&#039;schnitt&lt;br /&gt;
|-&lt;br /&gt;
|Dimmer Unterputz&lt;br /&gt;
|[[HM-LC-Dim1TPBU-FM_1-Kanal-Dimmer_UP|HM-LC-Dim1TPBU-FM]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-dimmaktor-1fach-fuer-markenschalter-phasenabschnitt-unterputzmontage.html Produkt] [https://files.elv.com/Assets/Produkte/10/1030/103020/Downloads/103020_FunkDimmaktor_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V, 180VA Anschlußleistung, passend zu 55mm-Installationsrahmen verschiedener Hersteller &lt;br /&gt;
|-&lt;br /&gt;
|Dimmer Aufputz, 2fach Abschnitt&lt;br /&gt;
|HM-LC-Dim2T-SM&lt;br /&gt;
|ADDME&lt;br /&gt;
|&lt;br /&gt;
|230V, Phasen&#039;&#039;&#039;ab&#039;&#039;&#039;schnitt&lt;br /&gt;
|-&lt;br /&gt;
|Dimmer Aufputz, 2fach Anschnitt&lt;br /&gt;
|HM-LC-Dim2L-SM&lt;br /&gt;
|ADDME&lt;br /&gt;
|&lt;br /&gt;
|230V, Phasen&#039;&#039;&#039;an&#039;&#039;&#039;schnitt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Homematic Messen ==&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Zählermodul Gas, Strom&lt;br /&gt;
|[[HM-ES-TX-WM_Zählersensor_für_Strom-_und_Gaszähler|HM-ES-TX-WM]]&lt;br /&gt;
|[http://www.elv.de/homematic-komplettbausatz-zaehlersensor-sendeeinheit-strom-gas.html Produkt] [https://files.elv.com/Assets/Produkte/14/1401/140143/Downloads/140143_sensor_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|Nur als Bausatz verfügbar, 4 AA Batterien, Gaszähler-Reedrelais leicht tauschbar&lt;br /&gt;
|-&lt;br /&gt;
|Schalter Hutschiene mit Leistungsmessung&lt;br /&gt;
|[[HM-ES-PMSw1-DR_Hutschienen-Schaltaktor_mit_Leistungsmessung|HM-ES-PMSw1-DR]]&lt;br /&gt;
|[http://www.elv.de/output/controller.aspx?cid=74&amp;amp;detail=10&amp;amp;detail2=51780 Produkt] [https://files.elv.com/Assets/Produkte/14/1411/141107/Downloads/HM-ES-PMSw1-DR_UM_G_150506.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V, nur als Bausatz verfügbar, hohe Funklast durch Messung&lt;br /&gt;
|-&lt;br /&gt;
|Schalter Zwischenstecker mit Leistungsmessung&lt;br /&gt;
|[[HM-ES-PMSw1-Pl_Funk-Schaltaktor_1-fach_mit_Leistungsmessung|HM-ES-PMSw1-Pl]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-schaltaktor-1fach-mit-leistungsmessung-zwischenstecker.html Produkt] [https://files.elv.com/Assets/Produkte/13/1302/130248/Downloads/130248_schaltaktor_messen_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V Zwischenstecker, hohe Funklast durch Messung&lt;br /&gt;
|-&lt;br /&gt;
|Füllstandsmesser&lt;br /&gt;
|[[HM-Sen-Wa-Od_kapazitiver_Funk-Füllstandsmesser|HM-SEN-WA-OD]]&lt;br /&gt;
|[http://www.elv.de/kapazitiver-fuellstandsmesser-hm-sen-wa-od-komplettbausatz.html Produkt] [https://files.elv.com/Assets/Produkte/10/1049/104945/Downloads/104945_HMSenWaOd_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|3 AA Batterien, kapazitive Messung, z.B. für Zisternen&lt;br /&gt;
|-&lt;br /&gt;
|Temperatur/Luftfeuchte aussen&lt;br /&gt;
|[[HM-WDS10-TH-O_Funk-Temperatur-/Feuchtesensor_außen_(OTH)|HM-WDS10-TH-O]]&lt;br /&gt;
|[http://www.elv.de/homematic-hm-wds10-th-o-funk-temperatur-luftfeuchtesensor-oth.html Produkt] [https://files.elv.com/Assets/Produkte/7/769/76923/Downloads/76923_HM_WDS10_TH_O_UM_GE_eQ3_120921_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|2 AA Batterien, Falsche Werte bei schwachen Batterien, nur bis -19,9°C&lt;br /&gt;
|-&lt;br /&gt;
|Temperatur/Luftfeuchte aussen&lt;br /&gt;
|HM-WDS30-TO&lt;br /&gt;
|[http://www.elv.de/homematic-hm-wds30-t-o-funk-temperatursensor-aussen.html Produkt] [https://files.elv.com/service/manuals/76857_HM-WDS30_T_O_GE.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|Abgesetzter Sensor, nur bis -19,9°C&lt;br /&gt;
|-&lt;br /&gt;
|Temperatur/Luftfeuchte innen&lt;br /&gt;
|[[HM-WDS40-TH-I_Funk-Temperatur-/Feuchtesensor_innen_(IT)|HM-WDS40-TH-I]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-innensensor-ith.html Produkt] [https://files.elv.com/service/manuals/76998_HM_GE_WDS40_TH_I_GE_V1_1.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Kombi-Sensor Wetter Aussen&lt;br /&gt;
|[[HM-WDS100-C6-O_Funk-Kombi-Sensor_OC3|HM-WDS100-C6-O]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-kombisensor.html Produkt] [https://files.elv.com/Assets/Produkte/13/1321/132192/Downloads/132192_kombisensor_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|Im Vergleich zu Vantage Pro schlechte Messungen, schlechtere Böen-Erkennung&lt;br /&gt;
|-&lt;br /&gt;
|Differenz-Temperatur&lt;br /&gt;
|[[HM-WDS30-OT2-SM_Differenz-Temperatur-Sensor|HM-WDS30-OT2-SM]]&lt;br /&gt;
|[http://www.elv.de/homematic-differenz-temperatur-sensor-fuer-smart-home-hausautomation-1.html Produkt] [https://files.elv.com/Assets/Produkte/14/1434/143420/Downloads/143420_temperatur_sensor_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|Fühler nicht dauerhaft wasserdicht&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Homematic Sicherheit ==&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Bewegungsmelder Innen&lt;br /&gt;
|[[HM-Sec-MDIR_Funk-Bewegungsmelder_innen|HM-SEC-MDIR]]&lt;br /&gt;
|&lt;br /&gt;
|HM-Sec-MDIR-2&lt;br /&gt;
|End-of-Sale, Nachfolgemodell identisch zu konfigurieren&lt;br /&gt;
|-&lt;br /&gt;
|Bewegungsmelder Innen&lt;br /&gt;
|[[HM-Sec-MDIR_Funk-Bewegungsmelder_innen|HM-SEC-MDIR-2]]&lt;br /&gt;
|[http://www.elv.de/homematic-bewegungsmelder-1.html Produkt] [https://files.elv.com/Assets/Produkte/13/1317/131776/Downloads/131776_hm_sec_mdir_2_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|3 AA Batterien&lt;br /&gt;
|-&lt;br /&gt;
|Bewegungsmelder Außen&lt;br /&gt;
|[[HM-Sen-MDIR-O_Funk-IR-Bewegungsmelder_außen|HM-SEN-MDIR-O]]&lt;br /&gt;
|&lt;br /&gt;
|HM-SEN-MDIR-O-2&lt;br /&gt;
|End-of-Sale, Nachfolgemodell identisch zu konfigurieren&lt;br /&gt;
|-&lt;br /&gt;
|Bewegungsmelder außen&lt;br /&gt;
|[[HM-Sen-MDIR-O_Funk-IR-Bewegungsmelder_außen|HM-SEN-MDIR-O-2]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-ir-bewegungsmelder-aussen-2.html Produkt] [https://files.elv.com/Assets/Produkte/10/1041/104109/Downloads/104109_Funk_IR_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|Es wird von Problemen mit Ameisen im Sensor und Ausfällen nach zwei Jahren berichtet&lt;br /&gt;
|-&lt;br /&gt;
|Bewegungsmelder außen&lt;br /&gt;
|[[HM-Sen-MDIR-SM_Außen-Bewegungsmelder|HM-SEN-MDIR-SM]]&lt;br /&gt;
|[http://www.elv.de/homematic-hm-sen-mdir-aussen-bewegungsmelder-komplettbausatz.html Produkt] [https://files.elv.com/service/manuals/84579_HM_Sen_MDIR_SM_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|IP65 für Außeneinsatz, Bausatz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Fenster Drehgriffkontakt&lt;br /&gt;
|[[HM-Sec-RHS_Funk-Fenster-Drehgriffkontakt|HM-SEC-RHS]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-fenster-drehgriffkontakt-1.html Produkt] [https://files.elv.com/service/manuals/75643_HM_Sec_RHS_GE_V1_0.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|LR44 Batterien, [http://www.techwriter.de/beispiel/funkeig1.htm Sendeeigenschaften verbessern]&lt;br /&gt;
|-&lt;br /&gt;
|Tür/Fenster-Kontakt&lt;br /&gt;
|[[HM-SEC-SC_Tür-Fensterkontakt|HM-SEC-SC]]&lt;br /&gt;
|[http://www.elv.de/homematic-hm-sec-sc-funk-tuer-fensterkontakt-1.html Produkt] [https://files.elv.com/service/manuals/76788_HM_Sec_SC_GE_V1_0_UM.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|LR44 Batterien, [[HomeMatic_Type_threeStateSensor|Notwendige Konfiguration]]&lt;br /&gt;
|-&lt;br /&gt;
|Tür/Fenster-Kontakt (optisch)&lt;br /&gt;
|[[HM-Sec-SCo_Tür-Fensterkontakt,_optisch|HM-SEC-SCo]]&lt;br /&gt;
|[http://www.elv.de/homematic-ir-tuer-fensterkontakt.html Produkt] [https://files.elv.com/Assets/Produkte/13/1302/130297/Downloads/130297_fensterkontakt_optisch_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|AAA Batterie, [[HomeMatic_Type_threeStateSensor|Notwendige Konfiguration]]&lt;br /&gt;
|-&lt;br /&gt;
|Zylinderschloss steuern&lt;br /&gt;
|[[HM-SEC-KEY_KeyMatic|HM-SEC-KEY]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-tuerschlossantrieb-keymatic-weiss-inkl-funk-handsender.html Produkt] [https://files.elv.com/Assets/Produkte/13/1317/131761/Downloads/131761_keymatic_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|3 AA Batterien, eigener AES-Key &#039;&#039;dringend&#039;&#039; empfohlen, auch in Silber&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Rauchmelder&lt;br /&gt;
|[[HM-SEC-SD_Rauchmelder|HM-SEC-SD]]&lt;br /&gt;
|&lt;br /&gt;
|HM-Sec-SD-2&lt;br /&gt;
|End-of-Sale&lt;br /&gt;
|-&lt;br /&gt;
|Rauchmelder&lt;br /&gt;
|[[HM-SEC-SD_Rauchmelder|HM-SEC-SD-2]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-rauchmelder-hm-sec-sd-2.html Produkt] [https://files.elv.com/Assets/Produkte/13/1314/131408/Downloads/131408_rauchmelder_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|Lithium, 10 Jahresbatterie&lt;br /&gt;
|-&lt;br /&gt;
|Sirenensteuerung&lt;br /&gt;
|[[HM-Sec-SFA-SM_Funk-Sirenensteuerung|HM-SEC-SFA-SM]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-sirenenansteuerung-bidcos.html Produkt] [https://files.elv.com/Assets/Produkte/8/843/84392/Downloads/84392_HM_Sec_SFA_GE_V1_1_UM.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V, stellt 2x12V 1A für Sirene und Blitzer zur Verfügung, Notakku 1.2Ah&lt;br /&gt;
|-&lt;br /&gt;
|Neigungssensor&lt;br /&gt;
|[[HM-SEC-TIS_Funk-Neigungssensor|HM-SEC-TIS]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-neigungssensor-hm-sec-tis.html Produkt] [https://files.elv.com/Assets/Produkte/8/831/83146/Downloads/83146_neu_HM_Sec_TIS_GE_UM.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|CR2032, erkennt nur offen/zu, keine Winkel&lt;br /&gt;
|-&lt;br /&gt;
|Wassermelder&lt;br /&gt;
|[[HM-Sec-WDS_Funk-Wassermelder|HM-SEC-WDS]]&lt;br /&gt;
|&lt;br /&gt;
|HM-SEC-WDS-2&lt;br /&gt;
|End-of-Sale&lt;br /&gt;
|-&lt;br /&gt;
|Wassermelder&lt;br /&gt;
|[[HM-Sec-WDS_Funk-Wassermelder|HM-SEC-WDS-2]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-wassermelder.html Produkt] [https://files.elv.com/service/manuals/Homematic/83459_HM_Sec_WDS_D_v1_0_UM.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|2 AA Batterien, unterstützt nicht die Alarmzentrale HM-SEC-Cen&lt;br /&gt;
|-&lt;br /&gt;
|Regensensor&lt;br /&gt;
|[[HM-Sen-RD-O_Funk-Regensensor|HM-SEN-RD-O]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-regensensor-1.html Produkt] [https://files.elv.com/Assets/Produkte/13/1302/130220/Downloads/130220_hm_regensensor_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|7,5-30VDC 1W max, auch als Bausatz verfügbar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Homematic Anzeigen ==&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Retro-Anzeige&lt;br /&gt;
|[[HM-Dis-TD-T_Retro_Anzeige|HM-Dis-TD-T]]&lt;br /&gt;
|[http://www.elv.de/homematic-statusanzeige-mit-batteriebetrieb-und-klappanzeige-komplettbausatz.html Produkt] [https://files.elv.com/Assets/Produkte/10/1037/103721/Downloads/103721_HM-Dis-TD-T_UM_G_150226_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|Nur als Bausatz (enge Bestückung) verfügbar, Temperaturbereich 0°-50°C&lt;br /&gt;
|-&lt;br /&gt;
|Farbige Statusanzeige OLED&lt;br /&gt;
|[[HM-Dis-WM55_Funk_Statusanzeige|HM-Dis-WM55]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-statusanzeige-aufputzmontage-bausatz.html Produkt] [https://files.elv.com/Assets/Produkte/13/1326/132656/Downloads/132656_statusanzeige.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|Passend zu 55mm-Installationsrahmen verschiedener Hersteller&lt;br /&gt;
|-&lt;br /&gt;
|B&amp;amp;W Statusanzeige ePaper&lt;br /&gt;
|HM-Dis-EP-WM55&lt;br /&gt;
|[http://www.elv.de/homematic-komplettbausatz-funk-statusanzeige-mit-e-paper-display.html Produkt] [https://files.elv.com/Assets/Produkte/14/1424/142414/Downloads/HM-Dis-EP-WM55_UM_GE_142413_160519.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|Passend zu 55mm-Installationsrahmen verschiedener Hersteller&lt;br /&gt;
|-&lt;br /&gt;
|LED Statusanzeige 16fach&lt;br /&gt;
|[[HM-OU-LED16_Funk-Statusanzeige_LED16|HM-OU-LED16]]&lt;br /&gt;
|[http://www.elv.de/elv-homematic-statusanzeige-fertiggeraet.html Produkt] [https://files.elv.com/Assets/Produkte/10/1047/104798/Downloads/104798_HM_OU_LED16_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|7,5VDC Netzteil&lt;br /&gt;
|-&lt;br /&gt;
|Funkgong mit Signalleuchte&lt;br /&gt;
|[[HM-OU-CFM-Pl_MP3_Funk-Gong_mit_Signalleuchte|HM-OU-CFM-Pl]]&lt;br /&gt;
|[http://www.elv.de/homematic-mp3-funk-tuergong-mit-signal-led.html Produkt] [https://files.elv.com/Assets/Produkte/9/990/99060/Downloads/99060_tuergong_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|230V Steckdose, unterstützt abspielen von MP3s von Speicherkarte&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Homematic Heizen ==&lt;br /&gt;
Die Heizungsgeräte sind für den Inneneinsatz gedacht und werden mit AA/AAA-Batterien betrieben. Die Wiki-Seiten [[HomeMatic_Type_Thermostat|Homematic-Thermostaten]] und [[HomeMatic_HMInfo_TempList/Weekplan|Homematic-Temperaturlisten]] geben einen Überblick, wie Temperaturlisten zu lesen und zu speichern sind. Für den HM-CC-RT-DN gibt es bei ELV im Zubehör-Bereich eine große Anzahl von Ventiladaptern aus Plastik und Messing, manchmal helfen auch Cent-Münzen als Unterlegscheibe, erhöhen jedoch die Lautstärke.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|Heizkörperthermostat&lt;br /&gt;
|[[HM-CC-RT-DN_Funk-Heizk%C3%B6rperthermostat|HM-CC-RT-DN]]&lt;br /&gt;
|[http://www.elv.de/homematic-heizkoerperthermostat-1.html Produkt] [https://files.elv.com/Assets/Produkte/10/1051/105155/Downloads/105155_thermostat_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Heizkörperthermostat&lt;br /&gt;
|[[HM-CC-VD_Funk-Stellantrieb|HM-CC-VD]]&lt;br /&gt;
|&lt;br /&gt;
|HM-CC-RT-DN&lt;br /&gt;
|End-of-Sale&lt;br /&gt;
|-&lt;br /&gt;
|Wandthermostat&lt;br /&gt;
|[[HM-CC-TC_Funk-Wandthermostat|HM-CC-TC]]&lt;br /&gt;
|&lt;br /&gt;
|HM-TC-IT-WM-W-EU&lt;br /&gt;
|End-of-Sale&lt;br /&gt;
|-&lt;br /&gt;
|Wandthermostat&lt;br /&gt;
|[[HM-TC-IT-WM-W-EU_Funk-Wandthermostat_AP|HM-TC-IT-WM-W-EU]]&lt;br /&gt;
|[http://www.elv.de/homematic-funk-wandthermostat-1.html Produkt] [https://files.elv.com/Assets/Produkte/13/1320/132030/Downloads/132030_thermostat_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|Passend zu Installationsrahmen verschiedener Hersteller&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Homematic Wired ==&lt;br /&gt;
Alle Homematic-Wired Geräte sind zur Hutschienen-Montage (DIN Rail) innerhalb eines Schaltschrankes gedacht. Die Geräte benötigen zum Betrieb ein Netzteil 24V DC innerhalb des Schaltschrankes. Der [https://de.wikipedia.org/wiki/EIA-485 RS485]-Bus wird von dem LAN-Gateway bereitgestellt und unterstützt maximal 127 Module. Zur Verkabelung eignet sich JSTY 4x2x0.6-Kabel.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-datatable&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:350px&amp;quot;|Einsatzzweck&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|fhem Wiki&lt;br /&gt;
!style=&amp;quot;width:200px&amp;quot;|ELV&lt;br /&gt;
!style=&amp;quot;width:150px&amp;quot;|Nachfolger&lt;br /&gt;
!style=&amp;quot;width:650px&amp;quot;|Zu beachten&lt;br /&gt;
|-&lt;br /&gt;
|LAN-Gateway&lt;br /&gt;
|HMW-Sys-OP-DR&lt;br /&gt;
|[http://www.elv.de/homematic-rs485-gateway-1.html Produkt] [https://files.elv.com/Assets/Produkte/10/1037/103755/Downloads/103755_rs485_gateway_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IO-Modul, 12xIN&lt;br /&gt;
|HMW-Sen-SC-12-DR&lt;br /&gt;
|[http://www.elv.de/homematic-wired-rs485-schliesserkontakt-12-eingaenge-hutschienenmontage.html Produkt] [https://files.elv.com/Assets/Produkte/8/858/85840/Downloads/85840_HMW_Sen_SC_12_DR_UM.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IO-Modul 12xIN, 14xOUT&lt;br /&gt;
|[[HMW-IO-12-Sw14-DR_Wired_RS485_I/O-Modul_12_Eingänge_14_Ausgänge|HMW-IO-12-SW14-DR]]&lt;br /&gt;
|[http://www.elv.de/homematic-wired-rs485-i-o-modul-12-eingaenge-14-ausgaenge.html Produkt]  [https://files.elv.com/Assets/Produkte/9/920/92011/Downloads/wired_rs485_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IO-Modul 12xIN, 7xOUT&lt;br /&gt;
|[[HMW-IO-12-Sw7-DR_Wired_RS485_I/O-Modul_12_Eingänge_7_Ausgänge|HMW-IO-12-SW7-DR]]&lt;br /&gt;
|[http://www.elv.de/homematic-wired-rs485-i-o-modul-12-eingaenge-7-schaltausgaenge-1.html Produkt] [https://files.elv.com/Assets/Produkte/7/768/76805/Downloads/76805_HMWIO12DRV1_02_UM.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Dimmer, Phasenanschnitt&lt;br /&gt;
|HMW-LC-Dim1L-DR&lt;br /&gt;
|[http://www.elv.de/homematic-wired-rs485-dimmaktor-1fach-phasenanschnitt-1.html Produkt] [https://files.elv.com/Assets/Produkte/7/768/76803/Downloads/76803_hmw_lc_dim1l_dr_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Jalousieaktor&lt;br /&gt;
|HMW-LC-Bl1-DR&lt;br /&gt;
|[http://www.elv.de/homematic-wired-hmw-lc-bl1-dr-wired-rs485-rollladenaktor-1fach.html Produkt] [https://files.elv.com/Assets/Produkte/7/768/76802/Downloads/76802_hmw_lc_bl1_dr_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Schalter, 2fach&lt;br /&gt;
|HMW-LC-Sw2-DR&lt;br /&gt;
|[http://www.elv.de/homematic-wired-hmw-lc-sw2-dr-rs485-schaltaktor-2fach.html Produkt] [https://files.elv.com/Assets/Produkte/7/768/76801/Downloads/76801_hmw_lc_sw2_dr_um.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Überspannungsschutz&lt;br /&gt;
|HMW-Sys-OP-DR&lt;br /&gt;
|[http://www.elv.de/homematic-wired-rs485-ueberspannungsschutz.html Produkt] [https://files.elv.com/Assets/Produkte/8/859/85978/Downloads/85978_HMW_Sys_OP_DR_UM.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Busabschluss-Widerstand&lt;br /&gt;
|HMW-Sys-Tm-DR&lt;br /&gt;
|[http://www.elv.de/homematic-wired-rs485-busabschluss-widerstand-hutschienenmontage-1.html Produkt] [https://files.elv.com/Assets/Produkte/7/768/76807/Downloads/75168_HMW_Sys_TM_UM.pdf Anleitung]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components|2Info]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Devices_pairen&amp;diff=23898</id>
		<title>HomeMatic Devices pairen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Devices_pairen&amp;diff=23898"/>
		<updated>2017-12-29T10:32:09Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HomeMatic Geräte müssen mit dem für das HomeMatic-Protokoll eingesetzten IO-Device (zB [[CUL]], CUN,  [[HomeMatic|Homematic IO&#039;s]]) &#039;&#039;[[Pairing (HomeMatic)|gepairt]]&#039;&#039; (deutsch: &amp;quot;gepaart&amp;quot;) werden, damit sie von FHEM gesteuert oder ausgelesen werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Adresse eines HomeMatic Gerätes ist nicht frei einstellbar, sondern für jedes Gerät fest vorgegeben. Da die HM-Geräte über eine sehr komplexe Kanalstruktur verfügen, empfiehlt sich daher, die Geräte in FHEM per &#039;&#039;autocreate&#039;&#039; Funktion anlegen zu lassen, Eine nachträgliche Umbenennung oder manuelle Bearbeitung der erzeugten Konfigurationsdaten ist problemlos möglich.&lt;br /&gt;
&lt;br /&gt;
Zunächst mal muss man einen [[HomeMatic_Installieren|CUL/CUN/Homematic IO installieren]]. &lt;br /&gt;
&lt;br /&gt;
Einige Geräte werden mit aktivierter [[AES Encryption]] ausgeliefert (Meistens, aber nicht immer mit SEC im Namen). Das Anlernen an HM IO&#039;s funktioniert ohne Probleme, für alle CUL Derivate muss unbedingt der Hinweis im Artikel AES Encryption im Abschnitt I/O-Device &amp;lt;-&amp;gt; Gerät beachtet werden. &#039;&#039;&#039;Die dort beschriebene Installation sollte generell vorgenommen werden!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Danach geht es hier weiter:&lt;br /&gt;
&lt;br /&gt;
= Grundlagen=&lt;br /&gt;
Durch das Pairing wird ein HM-Gerät genau einem IO-Device (zB CUL) zugeordnet. Wenn ein Gerät mit dem IO-Device gepairt ist, kann es darüber gesteuert werden.  &lt;br /&gt;
  &lt;br /&gt;
Beim Pairing wird die HMID des IO-Device in das Gerät geschrieben. Das Pairing findet also im Wesentlichen im Gerät statt, nicht in FHEM selbst.&lt;br /&gt;
&lt;br /&gt;
Zu bemerken ist, dass ein IO-Device (zB CUL) standardmäßig die ID F11034 von FHEM erhält. Da viele HM-Geräte das IO-Device nur anhand der HMIDs erkennen, können alle in Reichweite der HM-Geräte befindlichen IO-Devices mit der in das HM-Gerät geschriebenen HMID das HM-Gerät steuern. Hinzu kommt, dass die &#039;&#039;autocreate&#039;&#039; Funktion die in Reichweite befindlichen HM-Geräte findet und automatisch einbindet. Nachbarn, die IO-Devices mit der gleichen HMID betreiben, können also HM-Geräte untereinander sehen und steuern!&lt;br /&gt;
&lt;br /&gt;
Es ist daher dringen zu empfehlen, die HMID vor dem Pairing der HM-Geräte mit: &lt;br /&gt;
&lt;br /&gt;
  attr &amp;lt;CUL&amp;gt; hmId &amp;lt;6-stellige Hexadresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zu individualisieren.  &lt;br /&gt;
&lt;br /&gt;
Gepairt wird nur das Device. Die Channels sind dem Device untergeordnet und somit implizit auch gepairt. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Ist ein Device gepairt werden Konfigurationsänderungen über die Zentrale (FHEM) vorgenommen. Man kann u.a. keine Kanäle mehr &#039;&#039;direkt&#039;&#039; peeren (verknüpfen). Stattdessen verwendet man Kommandos in FHEM. Siehe &amp;lt;u&amp;gt;[[Homematic_Peering_Beispiele|peeren]]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IO-Device in den Pairing-Modus versetzen =&lt;br /&gt;
* CUL/CUN/HMLAN Konfigurator in den &amp;quot;Akzeptiere-Pairing-Requests-Modus&amp;quot; bringen:&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;CUL&amp;gt; hmPairForSec 600&lt;br /&gt;
&lt;br /&gt;
600 bedeutet hier, dass das IO-Device 600 Sekunden, also 10 Minuten lang im Pairing-Modus ist.&lt;br /&gt;
&lt;br /&gt;
Bei aktivem Pairing-Modus gibt das IO-Device folgende &#039;&#039;Internals&#039;&#039; Variable zurück: &lt;br /&gt;
&lt;br /&gt;
  hmPair 1&lt;br /&gt;
&lt;br /&gt;
Alternativ kann &lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;CUL&amp;gt; hmPairSerial &amp;lt;serial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
genutzt werden.&lt;br /&gt;
&lt;br /&gt;
= Devices pairen =&lt;br /&gt;
&lt;br /&gt;
Das Gerät wird in den Anlern- oder auch Konfigurationsmode versetzt. Es sendet hierzu eine entsprechende Nachricht an alle. &lt;br /&gt;
Das Vorgehen ist stark vom Gerät(Typ) abhängig, bitte unbedingt das Handbuch lesen: Stichwort &amp;quot;anlernen&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Falls das Gerät einen separaten Anlernknopf hat, ist der normalerweise nur ganz kurz zu drücken. &lt;br /&gt;
Danach beginnt die LED regelmäßig zu blinken.&lt;br /&gt;
 &lt;br /&gt;
Hat das Gerät keinen separaten Anlernknopf, muss in der Regel eine Taste solange gedrückt werden, bis die LED anfängt regelmäßig zu blinken.&lt;br /&gt;
&lt;br /&gt;
Kommt der Anlernvorgang in Gang, wird dies durch ein wechselndes, schnelles  Blinken signalisiert. Kommt kein Anlernvorgang zustande, blinkt die LED regelmäßig für einen bestimmten Zeitraum (ca. 20 sec). &lt;br /&gt;
Ist das Gerät schon gepairt, werden bei batteriebetriebenen Geräten eventuell auch noch nicht übertragende Daten gesendet. Dabei blinkt die LED auch unregelmäßig.&lt;br /&gt;
{{Randnotiz|RNText=Hinweis: Das genaue Vorgehen ist bei jedem Gerätetyp anders -&amp;gt; unbedingt Handbuch genau lesen!}}&lt;br /&gt;
In FHEM werden nun:&lt;br /&gt;
* alle fehlenden Devices und Channels angelegt&lt;br /&gt;
* das Register pairCentral im Device gesetzt. &lt;br /&gt;
&lt;br /&gt;
Ein save danach sichert die neu gepairten Geräte in der Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch mit hmPairForSec kann jeweils nur &#039;&#039;&#039;ein&#039;&#039;&#039; Device gepaired werden. Für mehrere Devices den Vorgang bitte wiederholen.&lt;br /&gt;
&lt;br /&gt;
= Pairing verifizieren =&lt;br /&gt;
Nur weil ein Gerät angelegt wurde, heißt das &#039;&#039;&#039;nicht&#039;&#039;&#039;, dass es auch gepaired ist. In den Readings eines Devices muss stehen (list &amp;lt;name&amp;gt; oder im Webinterface):&lt;br /&gt;
&lt;br /&gt;
  R_pairCentral  0xABCDEF&lt;br /&gt;
&lt;br /&gt;
ABCDEF steht dabei für die HMID des IO-Device (zB CUL). Wurde für das IO-Device kein attribute mit einer individuellen HMID gesetzt, sollte hier die Standard-ID F11034 stehen. Die führende 0x steht für den Hinweis auf eine HEX-Adresse. &lt;br /&gt;
&lt;br /&gt;
Ist das Pairing noch nicht abgeschlossen, kann man nach kurzer Pause den Befehl: &lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;HM-Gerät&amp;gt; getConfig &lt;br /&gt;
&lt;br /&gt;
absetzen, um zu prüfen, ob sich der Status zwischenzeitlich geändert hat. Wenn das Reading R_pairCentral nicht auftaucht oder der Wert mit set_ beginnt hat das Pairing &#039;&#039;&#039;nicht&#039;&#039;&#039; geklappt. Man kann entweder:&lt;br /&gt;
* noch einmal probieren, ein getConfig auszulösen - vielleicht hat das Lesen nicht funktioniert&lt;br /&gt;
* noch einmal pairen - das schadet nichts&lt;br /&gt;
* die Anlerntaste / Configtaste / irgendeine Taste am Gerät (hängt vom konkreten Device ab) wiederholt drücken um die Datenübertragung anzustoßen.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch mit HMinfo einen Config check durchführen:&lt;br /&gt;
&lt;br /&gt;
  define hm HMInfo&lt;br /&gt;
  get hm configCheck&lt;br /&gt;
&lt;br /&gt;
= Vorgehen bei Problemen =&lt;br /&gt;
&lt;br /&gt;
Wenn das Pairing nicht erfolgreich ist, das Gerät sich also nicht steuern lässt, ist es möglich, dass es schon bzw. noch mit einem anderen IO-Device gepairt ist. Dann das Gerät in den Auslieferungszustand bringen (siehe Handbuch, oft Knopf mindestens 5 Sekunden drücken, bis es blinkt, dann loslassen und nochmals 5 Sekunden drücken, bis es schneller blinkt) und danach erneut pairen. &lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Pairing per Befehl gelöst werden. Siehe dazu unten. &lt;br /&gt;
&lt;br /&gt;
Wenn das zu pairende Geräte ein Empfänger ist, kann mit FHEM per Telnet oder in der Kommandozeile des Webinterfaces folgendes Kommando abgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;CUL&amp;gt; hmPairSerial &amp;lt;10-stellige Seriennummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die 10-stellige Seriennummer ist beim Empfängern idR. auf der Rückseite des Geräte aufgedruckt. Die Seriennummer fängt normalerweise mit Buchstaben an und endet mit Zahlen.&lt;br /&gt;
&lt;br /&gt;
Es gilt auch sicherzustellen, dass das zu pairende Gerät nicht bereits zuvor mit der Homematic Config Software gepairt wurde. Ist dies der Fall, so sollte das Pairing in der Homematic Config Software gelöscht und das Pairing in FHEM erneut durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Beim Pairen ist, wie im normalen Betrieb auch, ein Mindestabstand (etwa 1-2 Meter) zwischen dem Sender der Zentrale (CUL, HMLAN etc.) einzuhalten, da die Funkempfänger sonst mit Übersteuerung reagieren und keine Kommunikation zustande kommt.&lt;br /&gt;
Außerdem kann die Funklast beim Auslesen einer unfangreichen Konfiguration eines Gerätes bereits nach wenigen Versuchen das Limit der 1%-Regel erreichen. Sollte also scheinbar keine Kommunikation stattfinden können, ist auch zu prüfen, ob der Zentralensender sich deswegen temporär deaktiviert hat.&lt;br /&gt;
&lt;br /&gt;
= Gezieltes Pairing =&lt;br /&gt;
Bei bereits bekanntem HM-Gerät kann man mit:&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;Name HM-Gerät&amp;gt; pair&lt;br /&gt;
&lt;br /&gt;
das pairing überschreiben. Es funktioniert aber nur, wenn schon ein IO-Device eingetragen ist.&lt;br /&gt;
&lt;br /&gt;
= Pairing lösen =&lt;br /&gt;
Das Pairing kann mit:&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;Name HM-Gerät&amp;gt; unpair&lt;br /&gt;
&lt;br /&gt;
gelöst werden. Wichtig ist dabei, dass das IO-Device, das entpairt werden soll, mit der ursprünglich in das HM-Gerät geschriebenen HMID konfiguriert ist.  &lt;br /&gt;
&lt;br /&gt;
Sollte man z.B. ein HomeMatic HM-CC-RT-DN Funk-Heizkörperthermostat und ein Fensterkontakt verbunden haben, so steht unter THERMOSTAT_WindowRec im Attribut peerIDs die ID des Fensterkontakts.&lt;br /&gt;
Bei einem Defekt des Fensterkontakts sollte man wie im HM-CC-RT-DN beschrieben das unset durchführen. Hat man aber das Device Fensterkontakt gelöscht und das Pairing nicht durchgeführt, so kann man die Zuordnung im Heizkörperthermostat dennoch mit folgenden Befehl aufheben.&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;Name HM-Gerät&amp;gt;_WindowRec peerBulk &amp;lt;peerID&amp;gt; unset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components|1toolsAndWork]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Firmware_Update&amp;diff=23897</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=23897"/>
		<updated>2017-12-29T10:31:46Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &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;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
Unter OpenSuse 13.2 64 Bit:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git://git.zerfleddert.de/hmcfgusb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Und mit den Anweisungen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hmcfgusb&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
Für ein Update mit einem COC muss folgendes eingegeben werden (/dev/ttyAMA0):&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
Für ein Update mit HM-CFG-USB&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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|1toolsAndWork]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Nachrichten_sniffen&amp;diff=23896</id>
		<title>HomeMatic Nachrichten sniffen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Nachrichten_sniffen&amp;diff=23896"/>
		<updated>2017-12-29T10:31:24Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Um Probleme besser zu verstehen und Support zu ermöglichen kann man Roh-Nachrichten sniffen. Meist ist es sinnvoll, andere Logs zu dieser Zeit zu reduzieren und genauere Zeitstempel zu erzeugen. &lt;br /&gt;
&lt;br /&gt;
Die Nachrichten landen im Logfile.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls die Attribute in die fhem.cfg gesetzt werden, sind diese erst nach einem &#039;rereadcfg&#039; oder &#039;shutdown restart&#039; aktiv. Bei erfolgter Eingabe über die Konsole bzw. das Web Interface werden die Parameter sofort übernommen.&lt;br /&gt;
&lt;br /&gt;
Wird die Logging-Funktion nicht mehr benötigt, so sollte diese wieder deaktiviert werden, um ein unnötiges Anwachsen des Logfiles zu verhindern. Dafür müssen lediglich die zuvor getätigen Schritte wieder rückgängig gemacht werden. Daher entweder die eingetragenen Zeilen wieder aus der Config-Datei löschen und die [[Konfiguration]] auf einen der oben beschriebenen Wege neu einlesen oder aber die Attribute einfach über die Konsole bzw. das Web Interface löschen.&lt;br /&gt;
&lt;br /&gt;
=== HMLAN/HMUSB/HMUART ===&lt;br /&gt;
 attr global verbose 1&lt;br /&gt;
 attr global mseclog 1&lt;br /&gt;
 attr &amp;lt;hmio&amp;gt; logIDs all,sys&lt;br /&gt;
logIDs erlaubt das selektive loggen einzelner HM-Komponenten, was die Log-Größe erheblich reduzieren kann uns somit auch sehr lange Aufzeichnungen zulässt. Siehe auch [[HM-CFG-LAN_LAN_Konfigurations-Adapter#Attribute|logIDs]]. Diese Funktion steht analog auch beim neueren Funk-Lan-Gateway und dem Raspberry-Aufsteckmodul, beide Typ [[HMUARTLGW]], zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== CUL/CUNO ===&lt;br /&gt;
  attr global verbose 1&lt;br /&gt;
  attr global mseclog 1&lt;br /&gt;
  attr &amp;lt;cul&amp;gt; verbose 4&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Quelle: {{Link2Forum|Topic=16563|LinkText=FHEM Forum}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components|1toolsAndWork]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Peering_Beispiele&amp;diff=23895</id>
		<title>HomeMatic Peering Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Peering_Beispiele&amp;diff=23895"/>
		<updated>2017-12-29T10:31:01Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel beschreibt wie mit FHEM Homematic Sensoren und Aktoren gepeert werden können. Peering ist nicht zu verwechseln mit Pairing, d.h. dem Verknüpfen von Homematic Geräten mit einer Zentrale (wie beispielsweise FHEM). Details zum Pairing findet man [[HomeMatic_Devices_pairen|&#039;&#039;&#039;hier&#039;&#039;&#039;]].&lt;br /&gt;
&lt;br /&gt;
= Grundlagen =&lt;br /&gt;
Beim &#039;&#039;Peering&#039;&#039; (deutsch sinngemäß: Verbindung von Gleichen) handelt es sich um das Verknüpfen von Kanälen (Channels) verschiedender HomeMatic-Geräte, um diese auch ohne Zentrale kommunizieren zu lassen. Nach dem Peering sendet meist ein Sensorkanal (remote, push-button, Bewegungsmelder,...) einen Trigger an einen Aktorkanal des anderen Gerätes. &lt;br /&gt;
Besonderheiten:&lt;br /&gt;
* peeren kann man nur Channels, nicht HomeMatic-Geräte. Die Peer-Listen der verschiedenen Kanäle eines Gerätes sind unabhängig voneinander.&lt;br /&gt;
* gepeert werden immer ein oder mehrere Sensorkanäle mit einem oder mehreren Aktorkanälen&lt;br /&gt;
* der Sensor sendet einen Trigger, evtl. mit einem Zusatzwert. Es ist &#039;&#039;immer&#039;&#039; der Aktorkanal, der festlegt, welche Aktion ergriffen wird. Ein Button kann demnach gleichzeitig ein Einschalter für einen Aktor und ein Ausschalter für einen anderen Aktor sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Das in vielen mitgelieferten HomeMatic-Anleitungen beschriebene Peering von Kanälen ohne Zentrale funktioniert nur, wenn keines der beiden Geräte gepairt ist. Im Folgenden gehen wir davon aus, dass beide Geräte bereits mit einer Homematic-Zentrale (z.B. FHEM) [[HomeMatic_Devices_pairen|gepairt]] sind.}}&lt;br /&gt;
&lt;br /&gt;
== Kommandos ==&lt;br /&gt;
&lt;br /&gt;
=== peerChan ===&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;sensChan&amp;gt; peerChan 0 &amp;lt;actChan&amp;gt; [single|dual] [set|unset]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;peerChan&amp;lt;/code&amp;gt; peert (verbindet) einen Sensorkanal mit einem Aktorkanal.&lt;br /&gt;
Dabei ist &amp;lt;code&amp;gt;&amp;amp;lt;sensChan&amp;amp;gt;&amp;lt;/code&amp;gt; der Name des Sensorkanals und &amp;lt;code&amp;gt;&amp;amp;lt;actChan&amp;amp;gt;&amp;lt;/code&amp;gt; der Name des Aktorkanals.&lt;br /&gt;
&lt;br /&gt;
* Mit dem Schlüsselwort &#039;&#039;single&#039;&#039; wird genau dieser Sensorkanal gepeert. &lt;br /&gt;
* Mit dem Schlüsselwort &#039;&#039;dual&#039;&#039; werden zwei zusammengehörende Sensorkanäle mit dem Aktorkanal verknüpft. Die beiden Sensorkanäle lösen unterschiedliche Aktionen aus, beispielsweise &#039;&#039;an&#039;&#039; und &#039;&#039;aus&#039;&#039;.&lt;br /&gt;
* Das Schlüsselwort &#039;&#039;set&#039;&#039; legt das Peering an, das Schlüsselwort &#039;&#039;unset&#039;&#039; hebt es auf.&lt;br /&gt;
&lt;br /&gt;
Das Kommando unterliegt den allgemeinen [[HomeMatic#Kommunikation|Regeln]]. Es wirkt auf zwei Geräte gleichzeitig, weshalb beide Geräte beobachtet werden sollten – ggf. muss an einem oder beiden Geräten die Anlerntaste gedrückt werden.&lt;br /&gt;
&lt;br /&gt;
=== peerIODev ===&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;actChan&amp;gt; peerIODev &amp;lt;IO&amp;gt; &amp;lt;chan&amp;gt; [set|unset]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;peerIODev&amp;lt;/code&amp;gt; peert (verbindet) einen Aktorkanal mit einem I/O-Device.&lt;br /&gt;
Dabei ist &amp;lt;code&amp;gt;&amp;amp;lt;IO&amp;amp;gt;&amp;lt;/code&amp;gt; der Namen des I/O-Devices und &amp;lt;code&amp;gt;&amp;amp;lt;chan&amp;amp;gt;&amp;lt;/code&amp;gt; die Nummer des virtuellen Kanals ist. Kanäle von 1 bis 50 sind zulässig.&lt;br /&gt;
&lt;br /&gt;
=== peerBulk ===&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;sensChan&amp;gt; peerBulk &amp;lt;peer1,peer2,...&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;peerBulk&amp;lt;/code&amp;gt; dient der Wiederherstellung einer gesicherten Konfiguration.&lt;br /&gt;
Dieser Befehlt erlaubt eine Liste von Peers en-block in ein Gerät zu schreiben. Die Gegenstelle und die Kommunikation der Beiden wird nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
==Sensoren ==&lt;br /&gt;
Ist ein Sensorkanal mit einem Aktorkanal gepeert, gibt es meist nur wenig mögliche Einstellungen. Wichtige Beispiele sind &lt;br /&gt;
* Notwendigkeit, den Peer mit einem burst aufzuwecken (Register peerNeedsBurst). &lt;br /&gt;
* Erwartung von AES-Verschlüsselung/Authentifizierung (Register expectAES).&lt;br /&gt;
&lt;br /&gt;
===LED===&lt;br /&gt;
Ein ungepeerter Sensorkanal signalisiert einen Tastendruck meist mit gelber LED. Ist der Kanal gepeert, wird mit einer grünen LED signalisiert, dass ALLE Peers den Empfang des Triggers bestätigt (d.h. &amp;quot;ACK&amp;quot; gesendet) haben. Sollten nicht alle Peers eine Bestätigung senden, wird mit einer rot LED quittiert. &lt;br /&gt;
&lt;br /&gt;
==Aktoren==&lt;br /&gt;
Ist ein Sensorkanal mit einem Aktorkanal gepeert, muss im Aktorkanal eingestellt werden, welche Trigger gültig sind und welche Aktionen ergriffen werden sollen. Im Channel wird ein Satz Register angelegt, die als Reading mit &#039;&#039;&#039;R-&amp;lt;peername&amp;gt;...&#039;&#039;&#039; zusammengefasst sind. Meist sind 2 Gruppen je Peer vorhanden, eine für langen &#039;&#039;&#039;lg&#039;&#039;&#039; und eine für kurzen &#039;&#039;&#039;sh&#039;&#039;&#039; Tastendruck. Die Register für long und short sind deckungsgleich, bis auf das Register multiExec in der Gruppe long.&lt;br /&gt;
&lt;br /&gt;
Für das Setzen des Wertes im Aktorkanal gilt die Syntax&lt;br /&gt;
   set &amp;lt;actChan&amp;gt; regSet &amp;lt;register&amp;gt; &amp;lt;value&amp;gt; &amp;lt;peername&amp;gt;&lt;br /&gt;
===Condition Table===&lt;br /&gt;
Mit den Registern der Condition Table &#039;&#039;&#039;CT&#039;&#039;&#039; kann man Trigger filtern. So sendet beispielsweise ein Fensterkontakt einen Trigger mit einem Zusatzwert open=200 oder closed=0. Die CT hat 2 Vergleichswerte, &#039;&#039;&#039;Hi&#039;&#039;&#039; und &#039;&#039;&#039;Lo&#039;&#039;&#039;. Der Zusatzwert des Triggers wird entsprechend des Einträgen in der CT verglichen. Ist der Schalter z.B. an, dann wird auf den Eintrag in &#039;&#039;&#039;CTon&#039;&#039;&#039; genutzt. Steht dort &#039;&#039;&#039;geLo&#039;&#039;&#039; wird gprüft, ob der Zusatzwert des triggers grösser oder gleich dem Lo-Wert ist. Ist dies nicht der Fall, wird keine Aktion ausgeführt.&lt;br /&gt;
Register zur Condition Table sind:&lt;br /&gt;
   CtDlyOff |  literal | Jmp on condition from delayOff options:geLo,between,outside,ltLo,geHi,ltHi&lt;br /&gt;
   CtDlyOn  |  literal | Jmp on condition from delayOn options:geLo,between,outside,ltLo,geHi,ltHi&lt;br /&gt;
   CtOff    |  literal | Jmp on condition from off options:geLo,between,outside,ltLo,geHi,ltHi&lt;br /&gt;
   CtOn     |  literal | Jmp on condition from on options:geLo,between,outside,ltLo,geHi,ltHi&lt;br /&gt;
   CtValHi  |0 to 255  | Condition value high for CT table&lt;br /&gt;
   CtValLo  |0 to 255  | Condition value low for CT table&lt;br /&gt;
Remotes liefern keinen Zusatzwert. Die Conditon Table wird nicht genutzt. &lt;br /&gt;
===Jump Table===&lt;br /&gt;
In der Jump Table wird zusammen mit ActionType festgelegt, welche Aktion ein gültiger Trigger ausführen soll. Die Aktion ist vom Gerät abhängig.&lt;br /&gt;
&lt;br /&gt;
===Interne Peers===&lt;br /&gt;
Aktoren können eingebaute oder direkt angeschlossene Taster oder Tasteneingänge haben, die auch als Peers verarbeitet werden. Normalerweise sind diese nicht sichtbar, sie können aber durch Absetzen des Befehls &lt;br /&gt;
  set &amp;lt;device&amp;gt; regSet intKeysVisib visib&lt;br /&gt;
sichtbar und einstelllbar gemacht werden.&lt;br /&gt;
&lt;br /&gt;
==Virtuelle Entities==&lt;br /&gt;
Soll ein FHEM-Befehl bei einem Aktor nicht nur eine Aktion auslösen, muss er mit einem Kanal einer &amp;lt;u&amp;gt;[[HomeMatic#Virtuelle_Entities|virtuellen Entität]]&amp;lt;/u&amp;gt; oder einer &amp;lt;u&amp;gt;[[HomeMatic#IO_Entities|IO Entität]]&amp;lt;/u&amp;gt; gepeert werden. Das Peering erfolgt wie bei realen Homematic-Geräten. Achtung: da diese virtuellen Peers nicht in einem realen Gerät gespeichert werden, ist nach der Definition ein &#039;&#039;&#039;Save config&#039;&#039;&#039; nötig. &amp;lt;br /&amp;gt;&lt;br /&gt;
Dadurch lassen sich nicht nur einfache Befehle je Kanal aussenden, sondern die Peering-Listen in Aktoren nutzen um mit einem Funkbefehl z.B.&lt;br /&gt;
*Schleifen zu starten (z.B. bei Alarmauslösung ein Pulsieren der Beleuchtung, alle x Min eine kurze Unterbrechung, ...)&lt;br /&gt;
*Abläufe zu starten (z.B. Treppenhauslicht mit Vorwarnung bei Dimmern, ...)&lt;br /&gt;
*mehrere Aktoren gleichzeitig schalten zu lassen&lt;br /&gt;
Sonst müsste man für jede Zustandsänderung bzw. für jeden Aktor einen eigenen Befehl senden. Somit reagieren mehrere Aktoren auf ein FHEM-Kommando gleichzeitig.&lt;br /&gt;
&lt;br /&gt;
===IO Entities===&lt;br /&gt;
&amp;lt;u&amp;gt;[[HomeMatic#IO_Entities|IO Entities]]&amp;lt;/u&amp;gt; sind virtuelle Kanäle eines IO-Devices (z.B. [[Virtueller Controller VCCU|VCCU]], [[HM-CFG-LAN|HMLAN]], ...) und können somit gepeert werden. Hierfür gibt es das Kommando [[Homematic Peering Beispiele#peerIODev|peerIODev]].&lt;br /&gt;
&lt;br /&gt;
= Beispiele=&lt;br /&gt;
== Peering der Kanäle einer Fernbedienung mit einem Aktor ==&lt;br /&gt;
Dabei muss beachtet werden, dass auf den Fernbedienungen immer zwei Buttons zusammengehören, also z.B. lock/unlock, open/light oder Btn01/Btn02, Btn03/Btn04. Achtung: Für ein erfolgreiches Peering muss ggf. auf der Fernbedienung die Anlerntaste gedrückt werden.&lt;br /&gt;
&lt;br /&gt;
Bei einem &amp;quot;dual&amp;quot; Peering werden die beiden zusammengehörenden Kanäle der Fernbedienung mit einem Aktorkanal gepeert - einer der Buttons wirkt dann als &amp;quot;on&amp;quot;, der andere als &amp;quot;off&amp;quot;-Schalter.&lt;br /&gt;
&lt;br /&gt;
  set fb_Btn03 peerChan 0 blind&lt;br /&gt;
peert die Buttons Btn03 und Btn04 mit dem Aktorkanal &#039;&#039;blind&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei einem &amp;quot;single&amp;quot; Peering wird nur einer der beiden Kanäle der Fernbedienung mit einem Aktorkanal gepeert - als Aktion wird dann im Aktorkanal ein &amp;quot;toggle&amp;quot; eingetragen.&lt;br /&gt;
&lt;br /&gt;
  set fb_Btn07 peerChan 0 blind single&lt;br /&gt;
peert nur den Button Btn07 mit dem Aktorkanal &#039;&#039;blind&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Unpeering, also das Löschen einer Paarung, erfolgt z.B. durch den Befehl&lt;br /&gt;
  set fb_Btn07 peerChan 0 blind single unset&lt;br /&gt;
&lt;br /&gt;
== Peering von I/O-Entities ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set blind peerIODev HMLAN1 5&lt;br /&gt;
set blind peerIODev HMLAN1 7 unset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components|1toolsAndWork]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Examples]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Register_programmieren&amp;diff=23894</id>
		<title>HomeMatic Register programmieren</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Register_programmieren&amp;diff=23894"/>
		<updated>2017-12-29T10:30:33Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Bitte noch an geeigneten Stellen Links auf diese Seite einfügen --&amp;gt;&lt;br /&gt;
{{Baustelle}}&lt;br /&gt;
Ein HomeMatic-Gerät besitzt mehr oder weniger umfangreiche Registersätze, mit denen das Verhalten des Gerätes vielfältig feinkonfiguriert werden kann. Die damit erreichbare Funktionsvielfalt geht weit über die standardisierten Vorgaben einer einfachen Direktverknüpfung ([[Peering_(HomeMatic)|Peering]]) hinaus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Grundlagen (in Auszügen) ==&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden nur exemplarisch einige Grundlagen und einfache Beispiele benannt, ohne jeden Anspruch auf Vollständigkeit.&lt;br /&gt;
&lt;br /&gt;
FHEM unterstützt die Programmierung der Register mit dem Befehl &#039;&#039;regSet&#039;&#039;. &amp;lt;peer&amp;gt; entfällt bei rein gerätebezogenen Programmierungen.&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; regSet &amp;lt;register&amp;gt; &amp;lt;value&amp;gt; [&amp;lt;peer&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
Darüberhinaus gibt es vor- oder selbstdefinierte [[HomeMatic_HmInfo_Templates_erstellen|Templates]] (Vorlagen), die alle erforderlichen Änderungen für standardisierte Anwendungen wie Treppenhauslichtschalter beinhalten. Die Anwendung von Templates auf Geräte wird protokolliert und der Registerzustand kann überprüft werden. Für viele Anwendungen genügt jedoch auch die einmalige Anwendung einer direkten Programmierung. Das genaue Verständnis der Vorgänge und Zusammenhänge ist nicht trivial, das Erlernen wird aber mit einer enormen erreichbaren Funktionsvielfalt belohnt. Viele wissenswerte Zusammenhänge sind im Homematic-Anhang der bekannten Einsteiger-Dokumentation erläutert, deren Lektüre zu Recht immer wieder empfohlen wird. Dieser Beitrag ist auch nur als Ergänzung zu verstehen!&lt;br /&gt;
&lt;br /&gt;
Die HomeMatic Aktoren (Schalter, Dimmer, ...) arbeiten so, wie es für verknüpften ([[Peering (HomeMatic)|peering]]) Sender vorgegeben ist. Sie nutzen Registersätze, die für jede Verknüpfung (peer) neu angelegt und gespeichert werden. Man kann also mit einem Taster ein- und ausschalten (toggeln), mit einem Tastenpaar gezielt ein- und ausschalten und mit einem weiteren Taster eine Zeitschaltung für 10 Sekunden starten. Dabei wird niemals der Taster oder der Schalter auf eine globale Aktion programmiert, sondern im Schalter (Aktor) die gewünschte Aktion für jeden verknüpften Taster separat gespeichert. Die auszulösende Aktion ist zudem abhängig vom aktuellen Zustand des Aktors und von der Länge des Tastendruckes (kurz oder länger - short or long).&lt;br /&gt;
&lt;br /&gt;
Kleines Beispiel:&lt;br /&gt;
 T1 schaltet S1 für 10 sec an&lt;br /&gt;
 T2 schaltet S1 an oder aus  &lt;br /&gt;
 T3 schaltet S1 an  &lt;br /&gt;
 T4 schaltet S1 aus.  &lt;br /&gt;
&lt;br /&gt;
Diese Tabelle ist im Schalter S1 gespeichert.&lt;br /&gt;
&lt;br /&gt;
Schaltet man mit T3 den S1 an und drückt dann nach beliebiger Zeit kurz T1 geht S1 nach weiteren 10 sec aus. Schaltet man mit T1 kurz den S1 für 10 sec an, aber innerhalb dieser Zeit mit T3 nochmal an, dann bleibt S1 nach Ablauf der 10 sec an.&lt;br /&gt;
&lt;br /&gt;
Die verfügbaren Register unterscheiden sich im Gerät und in den jeweiligen Kanälen. &lt;br /&gt;
Eine kurze Beschreibung der Register inklusive der erlaubten Werte erhält man durch:&lt;br /&gt;
:&amp;lt;code&amp;gt;get &amp;lt;name&amp;gt; regList &amp;lt;/code&amp;gt;&lt;br /&gt;
Dabei kann &amp;lt;name&amp;gt; ein Gerät oder ein separater Gerätekanal sein.&lt;br /&gt;
&lt;br /&gt;
== Spezielle Register (Auswahl) ==&lt;br /&gt;
Im folgenden sollen einige Register vorgestellt werden, die in vielen Geräten vorhanden sind. &#039;&#039;Ergänzungen sind ausdrücklich erwünscht!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gerätebezogene Register ===&lt;br /&gt;
Gerätebezogene Register existieren für jedes HomeMatic-Gerät nur einmal und werden in der sogenannten &#039;&#039;&#039;List0&#039;&#039;&#039; gespeichert (in der FHEM-Oberfläche als Hexbytefolge unter &#039;&#039;RegL_00.&#039;&#039; zu finden).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;confBtnTime&#039;&#039; - Kurz oder lang und der Konfigurationsmodus ====&lt;br /&gt;
Nicht immer sind die internen Tasten eines Gerätes ohne weiteres mit Aktionen für kurzen und langen Tastendruck programmierbar. Bei allen Hutschienen-Aktoren sowie den Zwischensteckern (mit nur einem Bedienknopf) versetzt ein langer Tastendruck (4 Sekunden) den Schalter normalerweise in den Konfigurations- bzw. Anlern-Modus, bei den in Unterputzdosen versenkbaren Schalt- und Dimmaktoren (-FM ohne PBU in der Bezeichnung) ohne eigenen Konfigurations-Button gilt dies sogar für die zur normalen Funktion extern angeschlossenen Taster. Dieses Verhalten kann man mit dem Register &#039;&#039;confBtnTime&#039;&#039; beeinflussen. Bis zum Ablauf der dort einstellbaren Zeit (in Minuten) nach dem Versorgen mit Strom (powerUp) erreicht man den Konfigurationsmodus wie bisher, danach interpretiert der Aktor die Tastendrücke stets als kurz (short) oder lang (long). Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; regSet confBtnTime 2&amp;lt;/code&amp;gt;&lt;br /&gt;
Möchte man den Aktor später zurücksetzen oder lokal konfigurieren, so erreicht man das ursprüngliche Verhalten in diesem Beispiel für die ersten zwei Minuten, nachdem man den Aktor (ausreichend lange) stromlos gemacht hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;intKeyVisib&#039;&#039; - Interne Tasten sichtbar machen ====&lt;br /&gt;
Die internen &amp;quot;Tasten&amp;quot; eines Aktors (z.B. die Schaltwippe bei Wandschaltern/-tastern, der Bedienknopf bei Zwischensteckern, aber auch die angeschlossenen externen Taster bei Aktoren für Unterputzdosen oder die von außen zugängliche &amp;quot;Notbedientaste&amp;quot; etwa bei Zwischendecken-Dimmern) sind logisch ebenso mit dem Aktor verknüpft wie externe Bedienelemente wie Funkfernbedienungen oder per Funk verknüpfte Wandtaster. Ihre Betätigung wird (außer mit präparierter Firmware) zwar nicht gesendet (und kann daher von FHEM nicht &amp;quot;gelesen&amp;quot; werden), die vom Hersteller vorgesehenen Funktionen lassen sich aber genauso frei programmieren. Allerdings sind diese internen Verknüpfungen zur Vermeidung versehentlicher Programmierungen zunächst verborgen und müssen daher explizit sichtbar gemacht werden. &lt;br /&gt;
&lt;br /&gt;
Dies geschieht mit&lt;br /&gt;
 set &amp;lt;name&amp;gt; regSet intKeyVisib visib  &lt;br /&gt;
 attr &amp;lt;name&amp;gt; expert 1&lt;br /&gt;
Anschließend sind der oder die internen Taste(n) mit der Bezeichnung self01 (self02, ...) sichtbar und ihre Aktionen können gezielt wie bei einem externen Peer umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
Wer nun auf die Idee kommt, man könne durch entsprechendes zusätzliches peering bei mehrkanaligen Geräten die (mehreren) internen Tasten beliebig zuweisen und so raffinierte Zusatzschaltungen auslösen, muss hier enttäuscht werden: Zwar kann man tatsächlich mit peerBulk bei den Aktorkanälen zusätzliche interne Peers eintragen und programmieren und mit einer Fernauslösung aus FHEM die neuen Verknüpfungen erfolgreich nutzen - das Gerät selbst reicht die Tastenbetätigungen aber immer nur an den ursprünglich dafür vorgesehenen Kanal weiter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;ledMode&#039;&#039; - Funktion der Onboard-LED bei Bausätzen ====&lt;br /&gt;
Die (batteriebetriebenen) -PCB-Aktoren und die 8-Kanal-Module haben kleine LED an Bord, die für Diagnosezwecke hilfreich sind, einem sparsamen Betrieb aber in der Regel entgegenstehen. Sie werden daher nur bei außergewöhnlichen Zuständen wie dem Anlernmodus, einem Reset, oder auch bei niedriger Batteriespannung als Hinweis an den Anwender benutzt und sind ansonsten ab Werk deaktiviert. Bei einer Dauerstromversorgung kann aber eine Schaltzustandsanzeige oder eine Quittung über eine Befehlsaussendung nicht nur zur Diagnose hilfreich sein.&lt;br /&gt;
&lt;br /&gt;
Besitzt das Gerät das Register &#039;&#039;ledMode&#039;&#039;, so kann man mit&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; regSet ledMode on&amp;lt;/code&amp;gt;&lt;br /&gt;
die LED auch für die &amp;quot;normalen&amp;quot; Betriebszustände aktivieren. Sie zeigen dann bei Aktoren, ob der Aktor eingeschaltet ist (blinkend, wenn eine Einschaltzeitbegrenzung aktiv ist), und bei den Sensormodulen HM-Mod-EM8(bit) zeigt die zweifarbige LED den von Fernbedienungen bekannten Sendezustand mit gelb, dem dann ein grün oder rot folgt - je nachdem ob eine Quittung angefordert ist und ob sie erfolgreich empfangen wurde.&lt;br /&gt;
&lt;br /&gt;
Leider lässt sich umgekehrt die bei Wandtastern oder Fensterkontakten mitunter gewünschte Deaktivierung der LED nicht so bewerkstelligen - diese Geräte haben das entsprechende Register nicht. Da hilft nur ein Eingriff ins Gerät mit Gaffa oder schwarzem Edding...  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kanalbezogene Register ===&lt;br /&gt;
Kanalbezogene Register existieren für jeden Kanal eines Gerätes einmal und werden in der sogenannten &#039;&#039;&#039;List1&#039;&#039;&#039; gespeichert (in der FHEM-Oberfläche als Hexbytefolge unter &#039;&#039;RegL_01.&#039;&#039; zu finden). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;powerUpAction&#039;&#039; - Automatischer Knopfdruck bei (wiederkehrender) Stromversorgung ====&lt;br /&gt;
Mit diesem Register (default &#039;&#039;off&#039;&#039;) kann erreicht werden, dass ein Schaltaktor nach einem Stromausfall sich bei Wiederkehr der Versorgungsspannung automatisch einschaltet. Dies ist z.B. sinnvoll für Zwischenstecker mit Messfunktion ([[HM-ES-PMSw1-Pl Funk-Schaltaktor 1-fach mit Leistungsmessung|HM-ES-PMSw1-Pl]]), wenn dieser als Langzeitmonitor etwa für Kühlgeräte verwendet wird - nach einem Stromausfall bliebe der Kühlschrank sonst aus und der Inhalt würde verderben. &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; regSet powerUpAction on&amp;lt;/code&amp;gt;&lt;br /&gt;
Achtung: Das Setzen dieses Registers auf &#039;&#039;on&#039;&#039; bedeutet nicht immer einen eingeschalteten Aktor nach der Wiederkehr der Stromversorgung. Vielmehr wird nur ein &#039;&#039;short&#039;&#039;-Ereignis auf den zugehörigen internen Taster ausgelöst, was nur im Normalfall zum Einschalten des Aktors führt - nicht aber wenn die Funktion dieses kurzen Tastendruckes gezielt verändert wurde, denn dann wird eben diese Aktion ausgeführt! Das gilt zum Beispiel auch für zeitlich begrenztes Einschalten. Als Alternative für eine lokale Schaltmöglichkeit bietet sich in solchen Fällen der lange Tastendruck an, sofern er vom Aktor unterstützt wird (so lässt sich die Einschaltzeit bei langem Tastendruck mit &#039;&#039;lgOnTime&#039;&#039; begrenzen). Dessen Aktion wird bei powerUp nicht ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Verknüpfungsbezogene Register ===&lt;br /&gt;
Diese Register sind am umfangreichsten und werden für jeden Verknüpfungspartner einzeln separat angelegt in der &#039;&#039;&#039;List3&#039;&#039;&#039; (&#039;&#039;RegL_03.&amp;lt;peer&amp;gt;&#039;&#039;). Die grundsätzlichen Funktionen und ihre Zusammenhänge sind ausführlich in der Einsteigerdokumentation erklärt, inklusive Skizzen für die sogenannte &#039;&#039;state machine&#039;&#039;. Hier sollen daher nur die in den folgenden Beispielen verwendeten Register erklärt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;shOnTime&#039;&#039; und &#039;&#039;lgOnTime&#039;&#039; - das interne &#039;&#039;on-for-timer&#039;&#039; von Schaltern oder Dimmern ====&lt;br /&gt;
Die wohl populärsten Register begrenzen die Einschaltzeit eines Aktors. Um z.B. eine Steckdose für 10 sec bei Knopfdruck lokal einzuschalten kann man folgendes programmieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; regSet shOnTime 10 self01 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;shOnTime&#039;&#039; ist dabei das zuständige Register für die Einschaltzeit bei kurzem (sh=short) Tastendruck, entsprechend gilt &#039;&#039;lgOnTime&#039;&#039; für einen langen Tastendruck. &lt;br /&gt;
&lt;br /&gt;
In den Readings werden die Register mit dem jeweiligen verknüpften Taster angezeigt, in unserem Fall also:&lt;br /&gt;
:&amp;lt;code&amp;gt;R-self01-shOnTime &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Defaultwert für shOnTime ist 111600 und bedeutet unendlich (von FHEM mit &amp;quot;unused&amp;quot; dargestellt), d.h. die maximale einstellbare Zeit ist 111599 sec (knapp 31 Stunden). So kann man die Zeit löschen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; regSet shOnTime 111600 self01 &amp;lt;/code&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; regSet shOnTime unused self01 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Übrigens gibt es diese Register auch für die Ausschaltzeit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;shCtOn&#039;&#039; und &#039;&#039;shCtOff&#039;&#039; - Bedingtes Schalten mit Schwellwerten ====&lt;br /&gt;
Fernbedienungen (im weitesten Sinne, &#039;&#039;remote&#039;&#039;) von HomeMatic übermitteln je nach Betätigungsdauer &#039;&#039;short&#039;&#039;- oder &#039;&#039;long&#039;&#039;-Trigger. Zustandsübermittelnde Sensoren (etwa ein Fensterkontakt oder Neigungssensor sowie Bewegungsmelder) senden ausschließlich &#039;&#039;short&#039;&#039;, gekoppelt mit einem Wert zwischen 0 und 200, entsprechend 0-100% in 0,5-%-Schritten. Ob ein solcher Trigger vom Aktor verarbeitet wird, kann vom gesendeten Wert abhängen.&lt;br /&gt;
&lt;br /&gt;
HomeMatic kennt dazu (für jeden Peer und Triggertyp (short/long) separat) zwei Schaltschwellen Lo und Hi, die default bei 50 und 100 liegen. Ob ein Trigger in Relation zu diesen Schwellen verarbeitet wird, regeln u.a. die shCtxxx-Register. Wie auch bei den allgemeinen Schaltbedingungen stehen &#039;&#039;On&#039;&#039; und &#039;&#039;Off&#039;&#039; jeweils für den aktuellen Schaltzustand (Achtung: nicht den, der erreicht werden soll). Ihr Wert beträgt default &amp;quot;geLo&amp;quot; (greater or equal Lo), hier 50 und höher. Trigger für Werte darunter werden bei der Einstellung &amp;quot;ltLo&amp;quot; (less than Lo) verarbeitet. Diese Schwellen gibt es entsprechend auch für den Hi-Wert, also &amp;quot;geHi&amp;quot; oder &amp;quot;ltHi&amp;quot;. Besonders interessant sind aber auch die Werte &amp;quot;outside&amp;quot; und &amp;quot;between&amp;quot;, bezogen auf die beiden Schwellen Lo und Hi. In letzterem Fall wird der Trigger verarbeitet, wenn der Wert zwischen 50 und 100 liegt, bei &amp;quot;outside&amp;quot; entsprechend bei 0-49 oder 101-200.&lt;br /&gt;
&lt;br /&gt;
Sogenannte Three-State-Sensoren wie Fensterkontakt- oder -griffsensoren senden 0 für &amp;quot;closed&amp;quot; (geschlossen), 100 für &amp;quot;tilted&amp;quot; (gekippt) und 200 für &amp;quot;open&amp;quot; (offen). Gleiches gilt für Schalterkontaktinterfaces, die den Zustand eines angeschlossenen Schaltkontaktes übermitteln. Im Grundzustand (Vergleichsbefehl auf &amp;quot;geLo&amp;quot;) führt daher nur der Trigger &amp;quot;offen&amp;quot; (200) zu einer Aktion. Ändert man den Vergleichsbefehl auf &amp;quot;ltLo&amp;quot;, so wird lediglich &amp;quot;closed&amp;quot; ausgewertet, bei &amp;quot;between&amp;quot; ist es &amp;quot;tilted&amp;quot;. Mit &amp;quot;outside&amp;quot; führt sowohl &amp;quot;closed&amp;quot; als auch &amp;quot;open&amp;quot; zu einer Aktion.&lt;br /&gt;
&lt;br /&gt;
Bei Bewegungsmeldern wird der mit übermittelte Helligkeitswert im Zusammenhang mit den (dann variabel einzustellenden) Schwellen als Kriterium für das Einschalten des Aktors mit herangezogen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;shSwJtOn&#039;&#039; &amp;amp; Co. - Was soll passieren? ====&lt;br /&gt;
Nachdem wir nun kennengelernt haben, wie man auswählt, &#039;&#039;&#039;welcher&#039;&#039;&#039; Anstoss von außen zu einer Aktion führt, hier ein kleiner Exkurs in die Beeinflussung, &#039;&#039;&#039;was&#039;&#039;&#039; daraufhin passieren soll. Diese Frage regelt die &#039;&#039;jump table&#039;&#039; und liefert damit das Regelwerk für die Abfolge der Aktionen, die &#039;&#039;state machine&#039;&#039;. Ein HomeMatic-Aktor geht nämlich keineswegs einfach nur an oder aus. Vielmehr hangelt er sich nacheinander an einer Reihe von Zuständen entlang - auch das ist in der Einsteigerdokumentation erschöpfend beschrieben und soll hier nicht wiederholt werden. Ein Schalter durchläuft aber mindestens die Zustände&lt;br /&gt;
  Aus &amp;gt; Einschaltverzögerung &amp;gt; Ein &amp;gt; Ausschaltverzögerung &amp;gt; Aus &amp;gt; (usw)&lt;br /&gt;
Hier soll reichen, dass am Ende jeder (Teil-)Kette in der Regel ein dauerstabiler Zustand bleibt, in der Regel ist das der Aus-Zustand und auch der Ein-Zustand, wenn dessen Laufzeit nicht durch &#039;&#039;shOnTime&#039;&#039; &amp;amp; Co. begrenzt ist. Ein- und Ausschaltverzögerung sind aber in der Regel 0 (Sekunden), so dass effektiv nur &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; übrig bleiben.&lt;br /&gt;
&lt;br /&gt;
Das Register &#039;&#039;shSwJtOn&#039;&#039; regelt, wohin die Reise geht, wenn ein gültiger &#039;&#039;short&#039;&#039;-Trigger im eingeschalteten Zustand eintrifft, sinngemäß &#039;&#039;...Off&#039;&#039; im Auszustand und &#039;&#039;lg...&#039;&#039; für die &#039;&#039;long&#039;&#039;-Trigger. Für &#039;&#039;shSwJtOn&#039;&#039; ist normalerweise als nächstes die Ausschaltverzögerung &amp;quot;dlyOff&amp;quot; vorgesehen. Da die Ausschaltverzögerung in der Regel 0 ist, folgt darauf, in &#039;&#039;shSwJtDly&#039;&#039; festgelegt, &amp;quot;off&amp;quot; usw. Die Zustände bilden so quasi einen Kreis, dessen Durchlauf von außen gelegentlich &amp;quot;angeschubst&amp;quot; wird. Mit diesen Registern kann man den Kreislauf aber auch umbiegen oder sogar unterbrechen, so dass ein eintreffender Trigger eben nicht zu einer Aktion führt. Als Ziele bieten sich, quasi selbstsprechend, &amp;quot;on&amp;quot;, &amp;quot;dlyOff&amp;quot;, &amp;quot;off&amp;quot; und &amp;quot;dlyOn&amp;quot; an - oder eben &amp;quot;no&amp;quot;, was nichts anderes bedeutet, als dass der betreffende Trigger an dieser Stelle zu keiner Aktion führt.&lt;br /&gt;
&lt;br /&gt;
Bei einem Dimmer heißen die Register statt &#039;&#039;..Sw....&#039;&#039; nur &#039;&#039;..Dim....&#039;&#039; und es gibt ein paar mehr Bedingungen - die Funktion ist aber entsprechend gleich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;shOnDly&#039;&#039; und &#039;&#039;shOffDly&#039;&#039; - es muss nicht immer sofort sein! ====&lt;br /&gt;
Nicht nur welcher Anstoße welche Aktion auslöst, sondern auch wann oder wie schnell die Aktion ausgeführt wird, lässt sich in gewissen Grenzen einstellen. Die beiden genannten Register etwa regeln die Ein- oder Ausschaltverzögerung nach einem gültigen Trigger. So kann man nach einem Ausschaltbefehl einen Raum noch im Hellen verlassen, wenn das Licht noch ein paar Sekunden länger leuchtet.&lt;br /&gt;
&lt;br /&gt;
Bei Dimmern gibt es zusätzlich auch bei Ein- und Ausschaltvorgängen durch eine neu eingerichtete Verknüpfung eine sogenannte Rampenzeit von 0,5 Sekunden, in der das Licht hoch- oder heruntergedimmt wird. Durch Programmierung von &#039;&#039;shRampOnTime&#039;&#039; und &#039;&#039;shRampOffTime&#039;&#039; kann man ein sehr augenschonendes langsames Ein- oder Ausschalten des Lichts wie im Kino erreichen. Zwar gibt es die Zeiten auch für long-Trigger, aber da machen sie im Normalfall wenig Sinn - der lange Tastendruck löst immer einen manuellen Dimmvorgang aus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(wird ergänzt)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Praktische Beispiele ==&lt;br /&gt;
Die folgenden Beispiele beschreiben nur in Kurzform die erforderlichen Aktionen. Weiterführende Informationen sind der Einsteigerdokumentation oder den o.g. Registerbeschreibungen zu entnehmen.&lt;br /&gt;
Übrigens: ein einmal konfigurierter Vorgang für eine Verknüpfung kann aus FHEM auch bequem fernausgelöst (bzw. simuliert) werden. Der Aktor führt dabei genau die Aktion aus, die für die benannte Verknüpfung vorgesehen ist. Der kurze Knopfdruck auf den internen Knopf eines Aktors wird beispielsweise so simuliert:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; press short self01 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Lokal bedienbarer Zeitschalter mit HomeMatic Aktoren: Pool für eine Stunde schalten ===&lt;br /&gt;
Ich habe einen HM-LC-SW4-DR und der channel_01 schaltet die Poolzirkulationspumpe. Dies passiert zeitgesteuert zweimal am Tag. Manchmal möchte ich im Keller diese Pumpe einfach für eine Stunde aktivieren, der Aktor ist bequem erreichbar an der Wand.&lt;br /&gt;
Die internen Tasten vom Hauptdevice (der Aktor hat vier Kanäle (channel), die in FHEM einzeln dargestellt werden) sichtbar machen:&lt;br /&gt;
 set LichtKeSW1 regSet intKeyVisib visib  &lt;br /&gt;
 attr LichtKeSW1 expert 1  &lt;br /&gt;
&lt;br /&gt;
Jetzt sieht man im Channel 01 - LichtKeSW1_Sw01 den internen peer self01. (Channel 02 ist self02 usw.)&lt;br /&gt;
Also jetzt einfach die Zeit eintragen:&lt;br /&gt;
 set LichtKeSW1 regSet shOnTime 3600 self01  &lt;br /&gt;
&lt;br /&gt;
Die Toggle Funktion der Taste bleibt erhalten. Ein zweiter Tastendruck schaltet die Pumpe auch sofort wieder aus. Während die Zeit läuft, blinkt die Status LED des Kanals.&lt;br /&gt;
Die Zeitbegrenzung funktioniert in diesem Beispiel ohne jedes Zutun von FHEM und damit auch bei einem Ausfall des Servers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Es werde Licht! Automatisches Licht mit Tor oder Tür ===&lt;br /&gt;
Im Kühlschrank geht das Licht ja schon praktischerweise automatisch an und aus, aber es gibt auch andere Situationen, in denen ein automatisches Licht sehr nützlich sein kann - in dunklen Abstellräumen oder Garagen. Vor allem weil man nicht vergessen kann es auszuschalten, weil es auch von allein ausgeht. Eine solche Funktion, so könnte man meinen, wird ganz einfach erreicht, indem man das Licht mit einem Aktor schalten lässt und diesen mit einem Tür- oder Fensterkontakt verknüpft. Hat man die beiden dann mit &#039;&#039;peerChan&#039;&#039; verknüpft, so wird man feststellen, dass das Licht mitnichten das Gewünschte tut: es schaltet sich beim Öffnen der Tür abwechselnd ein und aus und ignoriert das Schließen der Tür komplett.&lt;br /&gt;
&lt;br /&gt;
Verantwortlich für dieses &amp;quot;Fehlverhalten&amp;quot; sind die Register &#039;&#039;shCtOn&#039;&#039; und &#039;&#039;shCtOff&#039;&#039;. Beide stehen nach der Verknüpfung auf &amp;quot;geLo&amp;quot;. Wie bei den Registern oben erläutert, führt in diesem Fall nur die &amp;quot;offen&amp;quot;-Meldung des Türkontaktes zu einer Aktion. Das Öffnen der Tür soll den Aktor einschalten, das klappt. Das Schließen der Tür soll den eingeschalteten Aktor aber ausschalten. Also muss die Schaltbedingung im On-Zustand geändert werden (die Bezeichnungen natürlich durch die realen Namen des Schaltaktorkanals und des Türkontaktes ersetzen):&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;Schalter&amp;gt; regSet shCtOn ltLo &amp;lt;Türkontakt&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
Nun führt auch das Schließen der Tür wunschgemäß stets zu einem Abschalten des Lichts. &#039;&#039;shCtOff&#039;&#039; muss auf &amp;quot;geLo&amp;quot; bleiben!&lt;br /&gt;
&lt;br /&gt;
Kombinieren ließe sich das noch mit einer Laufzeitbegrenzung etwa für eine Stunde - sollte man die Tür versehentlich offenlassen, so brennt das Licht nicht stundenlang. Vor allem geht das Licht dann auch aus, wenn aus welchem Grund auch immer die Schließmeldung verloren geht.&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;Schalter&amp;gt; regSet shOnTime 3600 &amp;lt;Türkontakt&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lampe mit Kippschalter(n) fernschalten - eindeutig oder als Wechselschaltung ===&lt;br /&gt;
Oft besteht der Wunsch, eine Lampe mit einem herkömmlichen Schalter (statt eines Tasters) fernzuschalten. So kann man einen herkömmlichen Schalter mit einer Schließerkontaktinterface wie dem [[HM-SCI-3-FM 3-Kanal-Funk-Schließerkontakt-Interface|HM-SCI-3-FM]] ergänzen (oder einem Kanal des [[HM-MOD-EM-8 8-Kanal-Sendemodul|8-Kanal-Sendemoduls]] in der Betriebsart &#039;&#039;sensor&#039;&#039;) und wiederum die Verknüpfung mit dem Lampen-Aktor setzen. Ganz ähnlich wie bei der vorgenannten Abstellraum-Aufgabe führt nun aber das Schließen des Schalters nicht zu einem Einschalten. Daher ist nun &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;Lampenaktor&amp;gt; regSet shCtOff ltLo &amp;lt;Sensorkontakt&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
das Mittel der Wahl, &#039;&#039;shCtOn&#039;&#039; muss dieses Mal auf &amp;quot;geLo&amp;quot; bleiben. Jetzt folgt der Aktor dem (sichtbaren) Schaltzustand des Schaltes - zumindest solange er nicht anderweitig ein- oder ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
Nun kann man auch mehrere Schalter so mit der Lampe koppeln. Das ergibt aber keine Wechselschaltung im herkömmlichen Sinn - um eine Lampe ein- oder auszuschalten, muss man den Schalter möglicherweise einmal zusätzlich auf die aktuelle Schaltposition kippen, ehe die nächste Betätigung den gewünschten Effekt bringt. Für Wechselschaltungen bietet sich daher das Kontaktinterface [[HM-SwI-3-FM]] (oder das erwähnte 8-Kanal-Sendemodul in der Betriebsart &#039;&#039;switch&#039;&#039;) an. Hier führt jede Zustands&#039;&#039;änderung&#039;&#039; zu einem Schaltvorgang.&lt;br /&gt;
&lt;br /&gt;
Hat man hingegen nur ein HM-SCI-3-FM zur Hand, lässt sich dieses Verhalten auch erreichen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;Lampenaktor&amp;gt; regSet shCtOn outside &amp;lt;Sensorkontakt&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;Lampenaktor&amp;gt; regSet shCtOff outside &amp;lt;Sensorkontakt&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gezieltes Schalten eines (unsichtbaren) Aktors mit nur einer Taste ===&lt;br /&gt;
Für so etwas braucht man gewöhnlich zwei Tasten. Koppelt man einen Schalt-Aktor mit nur einer Taste (&amp;quot;single&amp;quot; beim &#039;&#039;peerChan&#039;&#039;-Kommando), so führt sowohl ein kurzer als auch ein langer Tastendruck immer nur zu einem Umschalten des Zustandes. Das ist unschön, wenn man den aktuellen Zustand nicht einsehen kann. &lt;br /&gt;
&lt;br /&gt;
Üblicherweise sind die Schaltabfolgen für eine Eintasten-Verknüpfung sowohl für kurze als auch lange Betätigungen gleich (bei Dimmern wird auf langen Tastendruck hingegen abwechselnd auf- oder abgedimmt). &lt;br /&gt;
 shSwJtOff = dlyOn	# Ist Gerät aus, wird Einschaltverzögerung gewählt (die aber normal 0 ist)&lt;br /&gt;
 lgSwJtOff = dlyOn	# dito, für lang&lt;br /&gt;
 shSwJtOn = dlyOff	# Ist Gerät an, wird Ausschaltverzögerung gewählt (die aber normal 0 ist)&lt;br /&gt;
 lgSwJtOn = dlyOff	# dito, für lang&lt;br /&gt;
Hier kann man sich zunutze machen, dass man mit einem gezielten &amp;quot;no&amp;quot; oder &amp;quot;dlyOn&amp;quot; bzw. &amp;quot;dlyOff&amp;quot; im richtigen Register die Schaltfolge abbrechen oder umbiegen kann.&lt;br /&gt;
Möchte man das Gerät &amp;lt;aktor&amp;gt; mit einem kurzen Tastendruck auf &amp;lt;button&amp;gt; ein- und mit einem langen Tastendruck ausschalten, so ändere man:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;aktor&amp;gt; regSet shSwJtOn dlyOn &amp;lt;button&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;aktor&amp;gt; regSet lgSwJtOff dlyOff &amp;lt;button&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
So laufen die entsprechenden Aktionen quasi ins Leere, wenn der Aktor bereits den gewünschten Zustand hat.&lt;br /&gt;
&lt;br /&gt;
Den umgekehrten Effekt (lang schaltet ein, kurz aus) erreicht man entsprechend mit&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;aktor&amp;gt; regSet shSwJtOff dlyOff &amp;lt;button&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;aktor&amp;gt; regSet lgSwJtOn dlyOn &amp;lt;button&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Welche Bedienhaptik man nun bevorzugt, muss man selbst entscheiden. In der Regel sollte die normale (sichere) Aktion &amp;quot;kurz&amp;quot; und die gefährlichere &amp;quot;lang&amp;quot; sein - eine PC-Stromversorgung mit einem kurzen Tastendruck versehentlich einzuschalten ist bestimmt besser als auszuschalten (das dann eben nur über lang) - für ein potentiell gefährliches Arbeitsgerät wie einen Heizofen wird es sicher andersherum sein.&lt;br /&gt;
&lt;br /&gt;
Sinngemäß verwendet der Autor sozusagen eine Hälfte davon als &amp;quot;Sicherheitsaktion&amp;quot; für einen [[HM-LC-Sw2PB-FM Schaltaktor mit Tasteraufsatz 2fach]] - der gewöhnliche Tastendruck auf die zugehörige Wippenseite schaltet den Aktor abwechselnd ein und aus, ein langer Tastendruck immer aus, dafür reicht:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;aktor&amp;gt; regSet lgSwJtOff dlyOff &amp;lt;button&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Übrigens: Nichts anderes wird normalerweise auch automatisch beim Verknüpfen eines Aktors mit einem Tastenpaar an der entsprechenden Stelle gemacht - ist eine Taste nur zum Ausschalten gedacht, so wird in beiden Schaltzuständen entsprechend &amp;quot;dlyOff&amp;quot; eingetragen. Als &amp;quot;Sprungziel&amp;quot; müsste aber genauso gut auch &amp;quot;no&amp;quot; funkionieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== WARNUNG! - Selbsttätiges Blinken eines HM-Aktors ===&lt;br /&gt;
Statt einer separaten Warnleuchte kann es durchaus sinnvoll sein, eine vorhandene Lampe zu Warnzwecken periodisch ein- und auszuschalten. Leider beherrschen die HomeMatic-Aktoren keine direkt aus FHEM erreichbare Blinkfunktion (ähnlich dem on-for-timer für eine Zeitbegrenzung), und das rhythmische Ein- und Ausschalten aus FHEM erzeugt eine recht hohe Funklast.&lt;br /&gt;
&lt;br /&gt;
Wir wissen aber, dass die Aktoren für jeden Peer nicht nur eine Ein-, sondern auch eine Ausschaltzeit speichern. Definiert man nun für einen Peer entsprechend beide Zeiten, so wird der Aktor bei einem Telegramm von diesem Peer sich entsprechend selbsttätig fortlaufend ein- und ausschalten. Jeder andere Schaltbefehl eines anderen Peers oder aus FHEM beendet die Schleife umgehend. So ließe sich das Blinken auch mit einer aktoreigenen Taste stoppen - oder starten, wenn man es entsprechend programmiert. Einen Zwischenstecker-Schalter beispielsweise kann man also (wenn man zuvor seine &#039;&#039;confBtnTime&#039;&#039; entsprechend setzt und so die langen Tastendrücke auswertbar macht) durch das Programmieren von &#039;&#039;lgOnTime&#039;&#039; und &#039;&#039;lgOffTime&#039;&#039; für den Peer &amp;quot;self01&amp;quot; wie gewohnt mit einem kurzen Tastendruck ein- und ausschalten und mit einem langen in den Blinkmodus versetzen.&lt;br /&gt;
&lt;br /&gt;
Einen Haken hat die Sache aber (möglicherweise): Der Aktor meldet seinen Schaltzustand natürlich periodisch. Allerdings tut er das mit einer gewissen Verzögerung. Beim Blinken in einem 2-Sekunden-Rhythmus kommen jedenfalls noch keine regelmäßigen Statustelegramme, die die Funklast erhöhen würden.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit wäre, virtuelle Buttons (etwa einer VCCU) zum Ein- und Ausschalten der Blinkfunktion zu verwenden. &amp;quot;Opfert&amp;quot; man dafür zwei aufeinanderfolgende Kanäle, kann man die Aktoren mit &amp;quot;dual set&amp;quot; peeren und bekommt so einen Blink- und einen Deaktivierungsbutton ohne weitere Kopfstände. Anschließend passt man die short-Laufzeiten für den Einschaltkanal an: &lt;br /&gt;
&lt;br /&gt;
Ein Beispiel für einen Dimmer (als virtuelle Buttons dienen vccu_Btn8 und vccuBtn9):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;vccu_Btn8&amp;gt; peerChan 0 &amp;lt;dimmerkanal&amp;gt; dual set&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann man mit &amp;quot;set vccu_Btn9 press short&amp;quot; den Dimmer ein- und mit &amp;quot;set vccu_Btn8 press short&amp;quot; ausschalten. Das Blinken im Dimmer wird eingestellt mit &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;set dimmer regSet shOnTime 1 vccu_Btn9&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set dimmer regSet shOffTime 1 vccu_Btn9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird der Dimmer nun mit &amp;quot;set vccu_Btn9 press short&amp;quot; eingeschaltet, so blinkt er im 3-Sekunden-Takt: zu den jeweils 1 Sekunde Ein- und Auszeit gesellen sich noch 2x 0,5s Rampenzeit, sofern nichts anderes programmiert wurde.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man eine größere Anzahl von Aktoren mit den virtuellen Buttons peeren und so ein ganzes Feuerwerk zünden ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Einer nach dem Anderen! - Sequentielles Schalten mehrerer Aktoren ===&lt;br /&gt;
Eine großflächige Beleuchtung mit viel Leistung sollte man aus Lastgründen niemals zugleich einschalten. Auch LED-Lampen ziehen im Einschaltmoment, wennauch extrem kurz, beträchtliche Ströme, die die von gewöhnlichen Glühlampen deutlich übersteigen können. Schaltet man mehrere Aktoren gleichzeitig mit einer Taste, so hilft eine individuelle Verzögerung des Einschaltvorgangs in jedem Aktor, die Sicherung vor dem Herausfliegen zu bewahren. Oder man macht gezielt einen Effekt daraus. Der Phantasie sind wenig Grenzen gesetzt...&lt;br /&gt;
&lt;br /&gt;
Hat man drei Aktoren &amp;quot;Aussenlicht1...3&amp;quot; mit dem Taster &amp;quot;Aussenlicht_Ein&amp;quot; gepeert, so erreicht man auf folgende Weise, dass sie beim Einschalten mit einer Verzögerung von jeweils einer Sekunde nacheinander einschalten.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;set Aussenlicht2 regSet shOnDly 1 Aussenlicht_Ein&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set Aussenlicht3 regSet shOnDly 2 Aussenlicht_Ein&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components|1toolsAndWork]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Pairing_und_Peering&amp;diff=23893</id>
		<title>Pairing und Peering</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Pairing_und_Peering&amp;diff=23893"/>
		<updated>2017-12-29T10:30:09Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Todo|Dieser Artikel ist obsolet da pairen und peeren schon beschrieben sind. }}&lt;br /&gt;
Pairing und Peering sind Begriffe aus dem [[HomeMatic]]-Programm von Sensoren und Aktoren.&lt;br /&gt;
&lt;br /&gt;
* Beim &#039;&#039;&#039;Pairing&#039;&#039;&#039; (deutsch: Paarung) wird ein HomeMatic-Gerät mit einem IO-Device (z.B. CUL/CUN/HM-LAN) verknüpft, so dass das HomeMatic-Gerät von FHEM über dieses IO-Device abgefragt und gesteuert werden kann. FHEM spielt hierbei die Rolle einer HomeMatic-Zentrale. Näheres zum Pairing siehe unter [[HomeMatic Devices pairen]].&lt;br /&gt;
* Beim &#039;&#039;&#039;Peering&#039;&#039;&#039; (deutsch sinngemäß: Verbindung mit Gleichen) wird ein HomeMatic-Geräte-Kanal mit einem oder mehreren anderen HomeMatic-Geräte-Kanälen so verknüpft, dass es mit diesen Daten austauschen kann. Dabei kann es sich sowohl um Zahlenwerte handeln (z.B. die Solltemperatur), als auch um Kommandos (z.B. Schaltzustände).  Näheres zum Peering siehe unter [[Homematic Peering Beispiele]].&lt;br /&gt;
&lt;br /&gt;
Ein direktes Peering zweier HomeMatic-Geräte ist nur möglich, wenn keines zuvor gepairt wurde. Anderenfalls ist das Peering nur noch indirekt, d.h. über die Zentrale (in diesem Falle also FHEM) möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components|1toolsAndWork]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=1%25_Regel&amp;diff=23892</id>
		<title>1% Regel</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=1%25_Regel&amp;diff=23892"/>
		<updated>2017-12-29T10:29:41Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1% Relative Frequenzbelegungsdauer =&lt;br /&gt;
Die Bundesnetzagentur schreibt für die Nutzung verschiedener ansonsten frei nutzbarer Frequenzbereiche sogenannte maximale relative Frequenzbelegungsdauern fest. Sinn dieser Maßnahme ist es, die Nutzung der Frequenzbänder durch mehrere Nutzer auch bei Reichweitenüberlagerung zu ermöglichen. Für 868,35&amp;amp;#160;MHz, also der Frequenz, in dem z.B. das HM, FS20 und FHT System arbeiten, sind ≤ 1% vorgeschrieben. Dies ergibt 36 Sekunden Sendedauer je Stunde. Besonders bei der eher langsamen Datenübertragung der FHT und FS20 Protokolle kann es zu Engpässen kommen.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
Um einen Kommunikationskanal durch mehrere Teilnehmer effektiv zu nutzen, bieten sich mehrere Verfahren an. Im Wesentlichen sind dies:&lt;br /&gt;
&lt;br /&gt;
* Token-Verfahren. Senden darf nur, wer gerade ein von Teilnehmer zu Teilnehmer herumgereichtes &amp;quot;Pfand&amp;quot; (=Token) besitzt. Tokenverfahren sind aufwändig zu implementieren und erfordern bidirektionale Kommunikation.&lt;br /&gt;
* LBT-Verfahren. Senden darf ein Teilnehmer nur, wenn er sich vorher durch &amp;quot;Lauschen&amp;quot; vergewissert hat, dass sonst niemand sendet, der Kanal also frei ist. (LBT = Listen before talk). Es ist theoretisch jedoch denkbar, dass zwei Sender zugleich lauschen, den Kanal frei vorfinden und zugleich anfangen zu senden. LBT Verfahren sind in frei nutzbaren Kanälen mit vielen Teilnehmern schwierig zu implementieren. (Die Kommunikation zwischen [[CUL]]/CUNO und [[RFR CUL]] arbeitet aber z.B. nach diesem Verfahren.)&lt;br /&gt;
* Zeitbeschränkung. Jeder Teilnehmer darf nur sehr kurz senden. Die Sendedauer ist so zu wählen, dass jeder Teilnehmer eine signifikante Chance hat, zufällig auf einen freien Kanal zu treffen. Dies ist beispielsweise gegeben, wenn der Kanal zu 90 oder mehr Prozent frei ist.&lt;br /&gt;
&lt;br /&gt;
Bei LBT und Zeitbeschränkung sind außerdem Verfahren zu implementieren, die greifen wenn der Kanal nicht frei war, die Aussendung also durch Überlagerung einer anderen Sendung gestört wurde. In der Regel wird man den erfolglosen Sendeversuch nach einer zufälligen Zeit wiederholen.&lt;br /&gt;
&lt;br /&gt;
Die Verfahren sind in der obigen Reihenfolge weniger aufwändig zu implementieren, d.h. Zeitbeschränkung erfordert den geringsten Aufwand.&lt;br /&gt;
&lt;br /&gt;
Die Bundesnetzagentur schreibt vor, dass im Frequenzbereich von 868,000 bis 868,600&amp;amp;#160;MHz 1% &amp;quot;Duty cycle&amp;quot; ODER die Nutzung von LBT-Verfahren implementiert sind, wobei sie definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&amp;lt;dd&amp;gt;&#039;&#039;Die relative Frequenzbelegungsdauer (duty cycle) in&amp;amp;#160;% kennzeichnet die Dauer der Aussendungen eines Senders auf einer Frequenz bezogen auf 1 Stunde. Die Gesamtsendezeit kann auf mehrere Intervalle aufgeteilt werden.&#039;&#039;&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&amp;lt;dd&amp;gt;&#039;&#039;LBT: Verfahren, mit dem die Kanalbelegungssituation vor Beginn und während der Aussendung geprüft wird. Aussendung erfolgt nur bei freiem Kanal.&#039;&#039;&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
Zumindest wegen des geringen Implementierungsaufwandes hat ELV als Entwickler der FS20 / FHT / HomeMatic Funkkomponenten kein LBT verwendet, sondern beachtet vielmehr die maximale Frequenzbelegungsdauer.&lt;br /&gt;
&lt;br /&gt;
== Bedeutung für das FS20 / FHT Funksystem ==&lt;br /&gt;
Aus der relativen Frequenzbelegungsdauer von 1% je Stunde, also nur 36 Sekunden je Stunde, ergeben sich für das FS20 / FHT System deutliche Einschränkungen. Insbesondere ist die [[Maximal nutzbare Geräte]] stark eingeschränkt. Wegen der umfangreichen bidirektionalen Kommunikation zwischen Raumreglern und der Zentrale mit einer im Vergleich zu HomeMatic eher geringen Bandbreite lassen sich beispielsweise sinnvoll nur etwa 10-12 Räume mit FHT über Funk steuern. &lt;br /&gt;
&lt;br /&gt;
Problematisch kann die 1% Regel auch in Debuggingphasen sein, wenn also neue FHEM Konfigurationen mehrfach in kurzer Folge ausprobiert werden.&lt;br /&gt;
&lt;br /&gt;
Praktisch umgesetzt ist das 1% Sendelimit z.B. im [[LOVF]] (= Limit-overflow). Eine FS20 Übertragung benötigt mindestens ca. 220ms also ca. 22 Sendeeinheiten. Ist die maximale Frequenzbelegungsdauer erreicht, dauert es also mindestens 22 Sekunden, bis erstmals wieder gesendet werden kann. &lt;br /&gt;
&lt;br /&gt;
Daraus ergibt sich, dass maximal 163 FS20 Kommandos pro Stunde gesendet werden können. Wird dieser Wert überschritten, meldet FHEM &#039;&#039;&#039;CUL TRANSMIT LIMIT EXCEEDED&#039;&#039;&#039;. Eine weitere Schaltung von FS20 Komponenten ist dann nicht mehr möglich. Dies ist insbesondere auch beim Einsatz von [[FS20_PIRA_Infrarot-Bewegungsmelder|Bewegungsmeldern]] von Bedeutung, wenn deren Sendeabstand sehr kurz eingestellt ist.&lt;br /&gt;
&lt;br /&gt;
== Bedeutung für das HomeMatic Funksystem ==&lt;br /&gt;
HomeMatic verwendet eine höhere Datenübertragungsrate, sodass die Kommunikation wesentlich schneller abläuft und die Grenzen wesentlich weiter sind. Dennoch kann es auch bei HomeMatic vorkommen, dass die Grenzen erreicht werden.&lt;br /&gt;
&lt;br /&gt;
Überschlägig kann HM etwa 1600 Nachrichten Je Stunde senden. Dazu zählen auch ACKs.&lt;br /&gt;
Ein Burst kostet 16 Messages. Es können also nur ca. 100 Bursts je Stunde gesendet werden. &lt;br /&gt;
Das gilt jeweils für das Aufwecken eines Device, die folgenden Messages sind &amp;quot;billiger&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist allerdings, dass z.B. der [[HMLAN Konfigurator]] Sendungen 3mal wiederholt, wenn keine Antwort kommt. Sendet man also ein Burst an ein Device, das nicht aktiv ist, ist das Sendekontingent nach nur 30 Versuchen je Stunde verbraucht.&lt;br /&gt;
&lt;br /&gt;
Es gibt aber noch andere Prozesse die viel Funklast erzeugen.&lt;br /&gt;
&lt;br /&gt;
*Insbesondere ist bei FHEM Versionen ab Oktober 2013 das Attribut &#039;&#039;autoReadReg&#039;&#039; auf &amp;quot;4_reqStatus&amp;quot; gesetzt. Damit wird für jedes HM-Device mit diesem so gesetzten Attribut beim FHEM-Start ein &#039;&#039;getConfig&#039;&#039; durchgeführt, was viel Funkverkehr erfordert.&lt;br /&gt;
&lt;br /&gt;
Je nach Anzahl der Geräte kann dazu führen, dass insgesamt zu viel Funklast erzeugt wird, im Logfile erscheint dann eine Meldung wie:&lt;br /&gt;
&lt;br /&gt;
 2013.10.03 13:41:18 2: HMLAN_Parse: HMLAN1 new condition ERROR-Overload&lt;br /&gt;
&lt;br /&gt;
Ab diesem Moment werden eben auch keine anderen Befehle mehr an weitere HM-Geräte geschickt, da das Funkkontingent aufgebraucht ist. Erst nach einer Stunde kann erneut gesendet werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;autoReadReg&#039;&#039; auf &amp;quot;4_reqStatus&amp;quot;  kann also dazu führen, dass nach einem Neustart HM sofort sein Funkkontingent aufgebracht hat.&lt;br /&gt;
&lt;br /&gt;
Als &#039;&#039;&#039;Notbehelf&#039;&#039;&#039; kann die Funkschnittstelle resetted oder  ([[HMLAN Konfigurator]]) kurz stromlos gemacht werden. Dann wird der Zähler wieder auf Null gesetzt.&lt;br /&gt;
Alternativ können so viele HM-Geräte wie möglich auf &#039;&#039;autoReadReg 0_off&#039;&#039; gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
* Ausserdem ist zu berücksichtigen, dass sich bei Einschaltung des  [[AES Encryption|Signing Requests]] der Funkverkehr in etwa verdoppelt, was bei grossen Installationen schon im Normalbetrieb zum Erreichen der Grenze führen könnte.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[Maximal nutzbare SlowRF Geräte]]&lt;br /&gt;
&lt;br /&gt;
* Bundesnetzagentur [http://www.bundesnetzagentur.de/cae/servlet/contentblob/134184/publicationFile/2570/FundstelleId5772pdf.pdf] Vfg. 20 / 2006&lt;br /&gt;
[http://www.bundesnetzagentur.de/cae/servlet/contentblob/38206/publicationFile/2580/ShortRangeDevicesSRD_ID17299pdf.pdf] Vfg 30 / 2006, geändert mit Vfg. 39/2009&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;br /&gt;
[[Kategorie:FHT Components]]&lt;br /&gt;
[[Kategorie:HomeMatic Components|2Info]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=1%25_Regel&amp;diff=23891</id>
		<title>1% Regel</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=1%25_Regel&amp;diff=23891"/>
		<updated>2017-12-29T10:29:14Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1% Relative Frequenzbelegungsdauer =&lt;br /&gt;
Die Bundesnetzagentur schreibt für die Nutzung verschiedener ansonsten frei nutzbarer Frequenzbereiche sogenannte maximale relative Frequenzbelegungsdauern fest. Sinn dieser Maßnahme ist es, die Nutzung der Frequenzbänder durch mehrere Nutzer auch bei Reichweitenüberlagerung zu ermöglichen. Für 868,35&amp;amp;#160;MHz, also der Frequenz, in dem z.B. das HM, FS20 und FHT System arbeiten, sind ≤ 1% vorgeschrieben. Dies ergibt 36 Sekunden Sendedauer je Stunde. Besonders bei der eher langsamen Datenübertragung der FHT und FS20 Protokolle kann es zu Engpässen kommen.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
Um einen Kommunikationskanal durch mehrere Teilnehmer effektiv zu nutzen, bieten sich mehrere Verfahren an. Im Wesentlichen sind dies:&lt;br /&gt;
&lt;br /&gt;
* Token-Verfahren. Senden darf nur, wer gerade ein von Teilnehmer zu Teilnehmer herumgereichtes &amp;quot;Pfand&amp;quot; (=Token) besitzt. Tokenverfahren sind aufwändig zu implementieren und erfordern bidirektionale Kommunikation.&lt;br /&gt;
* LBT-Verfahren. Senden darf ein Teilnehmer nur, wenn er sich vorher durch &amp;quot;Lauschen&amp;quot; vergewissert hat, dass sonst niemand sendet, der Kanal also frei ist. (LBT = Listen before talk). Es ist theoretisch jedoch denkbar, dass zwei Sender zugleich lauschen, den Kanal frei vorfinden und zugleich anfangen zu senden. LBT Verfahren sind in frei nutzbaren Kanälen mit vielen Teilnehmern schwierig zu implementieren. (Die Kommunikation zwischen [[CUL]]/CUNO und [[RFR CUL]] arbeitet aber z.B. nach diesem Verfahren.)&lt;br /&gt;
* Zeitbeschränkung. Jeder Teilnehmer darf nur sehr kurz senden. Die Sendedauer ist so zu wählen, dass jeder Teilnehmer eine signifikante Chance hat, zufällig auf einen freien Kanal zu treffen. Dies ist beispielsweise gegeben, wenn der Kanal zu 90 oder mehr Prozent frei ist.&lt;br /&gt;
&lt;br /&gt;
Bei LBT und Zeitbeschränkung sind außerdem Verfahren zu implementieren, die greifen wenn der Kanal nicht frei war, die Aussendung also durch Überlagerung einer anderen Sendung gestört wurde. In der Regel wird man den erfolglosen Sendeversuch nach einer zufälligen Zeit wiederholen.&lt;br /&gt;
&lt;br /&gt;
Die Verfahren sind in der obigen Reihenfolge weniger aufwändig zu implementieren, d.h. Zeitbeschränkung erfordert den geringsten Aufwand.&lt;br /&gt;
&lt;br /&gt;
Die Bundesnetzagentur schreibt vor, dass im Frequenzbereich von 868,000 bis 868,600&amp;amp;#160;MHz 1% &amp;quot;Duty cycle&amp;quot; ODER die Nutzung von LBT-Verfahren implementiert sind, wobei sie definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&amp;lt;dd&amp;gt;&#039;&#039;Die relative Frequenzbelegungsdauer (duty cycle) in&amp;amp;#160;% kennzeichnet die Dauer der Aussendungen eines Senders auf einer Frequenz bezogen auf 1 Stunde. Die Gesamtsendezeit kann auf mehrere Intervalle aufgeteilt werden.&#039;&#039;&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&amp;lt;dd&amp;gt;&#039;&#039;LBT: Verfahren, mit dem die Kanalbelegungssituation vor Beginn und während der Aussendung geprüft wird. Aussendung erfolgt nur bei freiem Kanal.&#039;&#039;&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
Zumindest wegen des geringen Implementierungsaufwandes hat ELV als Entwickler der FS20 / FHT / HomeMatic Funkkomponenten kein LBT verwendet, sondern beachtet vielmehr die maximale Frequenzbelegungsdauer.&lt;br /&gt;
&lt;br /&gt;
== Bedeutung für das FS20 / FHT Funksystem ==&lt;br /&gt;
Aus der relativen Frequenzbelegungsdauer von 1% je Stunde, also nur 36 Sekunden je Stunde, ergeben sich für das FS20 / FHT System deutliche Einschränkungen. Insbesondere ist die [[Maximal nutzbare Geräte]] stark eingeschränkt. Wegen der umfangreichen bidirektionalen Kommunikation zwischen Raumreglern und der Zentrale mit einer im Vergleich zu HomeMatic eher geringen Bandbreite lassen sich beispielsweise sinnvoll nur etwa 10-12 Räume mit FHT über Funk steuern. &lt;br /&gt;
&lt;br /&gt;
Problematisch kann die 1% Regel auch in Debuggingphasen sein, wenn also neue FHEM Konfigurationen mehrfach in kurzer Folge ausprobiert werden.&lt;br /&gt;
&lt;br /&gt;
Praktisch umgesetzt ist das 1% Sendelimit z.B. im [[LOVF]] (= Limit-overflow). Eine FS20 Übertragung benötigt mindestens ca. 220ms also ca. 22 Sendeeinheiten. Ist die maximale Frequenzbelegungsdauer erreicht, dauert es also mindestens 22 Sekunden, bis erstmals wieder gesendet werden kann. &lt;br /&gt;
&lt;br /&gt;
Daraus ergibt sich, dass maximal 163 FS20 Kommandos pro Stunde gesendet werden können. Wird dieser Wert überschritten, meldet FHEM &#039;&#039;&#039;CUL TRANSMIT LIMIT EXCEEDED&#039;&#039;&#039;. Eine weitere Schaltung von FS20 Komponenten ist dann nicht mehr möglich. Dies ist insbesondere auch beim Einsatz von [[FS20_PIRA_Infrarot-Bewegungsmelder|Bewegungsmeldern]] von Bedeutung, wenn deren Sendeabstand sehr kurz eingestellt ist.&lt;br /&gt;
&lt;br /&gt;
== Bedeutung für das HomeMatic Funksystem ==&lt;br /&gt;
HomeMatic verwendet eine höhere Datenübertragungsrate, sodass die Kommunikation wesentlich schneller abläuft und die Grenzen wesentlich weiter sind. Dennoch kann es auch bei HomeMatic vorkommen, dass die Grenzen erreicht werden.&lt;br /&gt;
&lt;br /&gt;
Überschlägig kann HM etwa 1600 Nachrichten Je Stunde senden. Dazu zählen auch ACKs.&lt;br /&gt;
Ein Burst kostet 16 Messages. Es können also nur ca. 100 Bursts je Stunde gesendet werden. &lt;br /&gt;
Das gilt jeweils für das Aufwecken eines Device, die folgenden Messages sind &amp;quot;billiger&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist allerdings, dass z.B. der [[HMLAN Konfigurator]] Sendungen 3mal wiederholt, wenn keine Antwort kommt. Sendet man also ein Burst an ein Device, das nicht aktiv ist, ist das Sendekontingent nach nur 30 Versuchen je Stunde verbraucht.&lt;br /&gt;
&lt;br /&gt;
Es gibt aber noch andere Prozesse die viel Funklast erzeugen.&lt;br /&gt;
&lt;br /&gt;
*Insbesondere ist bei FHEM Versionen ab Oktober 2013 das Attribut &#039;&#039;autoReadReg&#039;&#039; auf &amp;quot;4_reqStatus&amp;quot; gesetzt. Damit wird für jedes HM-Device mit diesem so gesetzten Attribut beim FHEM-Start ein &#039;&#039;getConfig&#039;&#039; durchgeführt, was viel Funkverkehr erfordert.&lt;br /&gt;
&lt;br /&gt;
Je nach Anzahl der Geräte kann dazu führen, dass insgesamt zu viel Funklast erzeugt wird, im Logfile erscheint dann eine Meldung wie:&lt;br /&gt;
&lt;br /&gt;
 2013.10.03 13:41:18 2: HMLAN_Parse: HMLAN1 new condition ERROR-Overload&lt;br /&gt;
&lt;br /&gt;
Ab diesem Moment werden eben auch keine anderen Befehle mehr an weitere HM-Geräte geschickt, da das Funkkontingent aufgebraucht ist. Erst nach einer Stunde kann erneut gesendet werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;autoReadReg&#039;&#039; auf &amp;quot;4_reqStatus&amp;quot;  kann also dazu führen, dass nach einem Neustart HM sofort sein Funkkontingent aufgebracht hat.&lt;br /&gt;
&lt;br /&gt;
Als &#039;&#039;&#039;Notbehelf&#039;&#039;&#039; kann die Funkschnittstelle resetted oder  ([[HMLAN Konfigurator]]) kurz stromlos gemacht werden. Dann wird der Zähler wieder auf Null gesetzt.&lt;br /&gt;
Alternativ können so viele HM-Geräte wie möglich auf &#039;&#039;autoReadReg 0_off&#039;&#039; gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
* Ausserdem ist zu berücksichtigen, dass sich bei Einschaltung des  [[AES Encryption|Signing Requests]] der Funkverkehr in etwa verdoppelt, was bei grossen Installationen schon im Normalbetrieb zum Erreichen der Grenze führen könnte.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[Maximal nutzbare SlowRF Geräte]]&lt;br /&gt;
&lt;br /&gt;
* Bundesnetzagentur [http://www.bundesnetzagentur.de/cae/servlet/contentblob/134184/publicationFile/2570/FundstelleId5772pdf.pdf] Vfg. 20 / 2006&lt;br /&gt;
[http://www.bundesnetzagentur.de/cae/servlet/contentblob/38206/publicationFile/2580/ShortRangeDevicesSRD_ID17299pdf.pdf] Vfg 30 / 2006, geändert mit Vfg. 39/2009&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;br /&gt;
[[Kategorie:FHT Components]]&lt;br /&gt;
[[Kategorie:HomeMatic Components|1Info]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=AES_Encryption&amp;diff=23890</id>
		<title>AES Encryption</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=AES_Encryption&amp;diff=23890"/>
		<updated>2017-12-29T10:28:45Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Grundlagen =&lt;br /&gt;
Anders als der Name vermuteten lässt, handelt es sich beim HM (HomeMatic) AES-Encryption Modus des &amp;quot;BidCos&amp;quot;-Protokolls nicht um verschlüsselten Funkverkehr, sondern um das Einschalten eines Signatur-Modus (AES-Challenge-Response (CR)). Hierbei muss sich der Sender durch das Signieren seiner Nachrichten mit einem allen Kommunikationspartnern bekannten AES-Schlüssel authentifizieren. Der Empfänger wird das Kommando nur ausführen, wenn die Authentifizierung korrekt ist.&lt;br /&gt;
Die eigentliche Datenübertragung findet im Klartext statt und kann immer mitgelesen bzw. abgehört werden, jedoch werden keine Kommandos von nicht autorisierter Quellen ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Der AES-Encryption Modus sichert, wenn eingeschaltet&lt;br /&gt;
* das Ändern der Gerätekonfiguration&lt;br /&gt;
* das Auslösen von Triggern (Tasten, Sensoren,...)&lt;br /&gt;
* das Schalten von Aktoren&lt;br /&gt;
&lt;br /&gt;
== AES-Prinzip ==&lt;br /&gt;
Der &#039;&#039;&#039;Advanced Encryption Standard&#039;&#039;&#039; (AES) ist ein im Auftrag der US-Regierung entwickeltes symmetrisches Verschlüsselungsverfahren, bei dem sowohl Sender als auch Empfänger über die Kenntnis eines &#039;&#039;geheimen&#039;&#039; Schlüssels verfügen müssen. Das AES-Verfahren ist öffentlich bekannt und erfüllt damit ein wesentliches Kriterium sicherer Verfahren, nämlich ihre Überprüfbarkeit. Bis heute ist kein Verfahren bekannt, mit dem man eine AES-Verschlüsselung ohne Kenntnis des Schlüssels &amp;quot;knacken&amp;quot; kann. Es gibt auch keine Hinweise darauf, dass die NSA dazu im Stande sein könnte.&lt;br /&gt;
&lt;br /&gt;
== Signatur ==&lt;br /&gt;
Bei einer digitalen Signatur werden nicht Schlüssel verglichen, sondern das Ergebnis der Verschlüsselung bestimmter kurzer Datensätze. Ist das Ergebnis der Verschlüsselung bei Sender und Empfänger gleich, kennen bei den gleichen geheimen Schlüssel.&lt;br /&gt;
&lt;br /&gt;
= Kommunikationsstrecken =&lt;br /&gt;
Der sichere Betrieb von Hausautomatisierungssystemen betrifft unterschiedliche Kommunikationspfade. &lt;br /&gt;
* Von der SmartHome-Zentrale gibt es einen Weg zum Eingabeterminal (Web-Interface auf PC, Smartphone o.ä.), die Zentrale-Frontend-Schnittstelle. &lt;br /&gt;
* Weiter gibt es einen Weg zum I/O-Gerät ([[HMLAN Konfigurator]], [[HM-CFG-USB USB Konfigurations-Adapter]], [[CUL]], [[CUN]], [[CUNO]]) welches die Brücke zur Funk- oder Kabelstrecke herstellt. Wenn FHEM die Zentrale bildet, ist das die FHEM-I/O-Schnittstelle.&lt;br /&gt;
* Es folgt die I/O-Geräte-Schnittstelle, die Funk- oder Kabelstrecke.&lt;br /&gt;
* Letztlich gibt es noch die Geräte-Geräte Schnittstelle für die direkte Kommunikation der HomeMatic-Geräte untereinander. &lt;br /&gt;
&lt;br /&gt;
== Zentrale ←→ Frontend ==&lt;br /&gt;
Diese Schnittstelle ist in der Regel eine internetbasierte Verbindung, meist in Form eines Aufrufes im Web-Browser. Hier muss durch eines der standardisierten Sicherheitsverfahren im Internet für sichere Kommunikation gesorgt werden: Virtual Private Network (VPN), verschlüsseltes WLAN und HTTPS sind gängige Methoden, die hier nicht weiter diskutiert werden sollen.&lt;br /&gt;
&lt;br /&gt;
== Zentrale ←→ I/O-Device ==&lt;br /&gt;
HomeMatic unterstützt auf dieser Strecke prinzipiell eine AES-Verschlüsselung, dies ist in FHEM allerdings nicht überall implementiert. Nutzt man stattdessen eine originale HomeMatic CCU2-Zentrale, kann hier AES aktiviert werden. Wenn FHEM die Zentrale ist, muss im [[HMLAN Konfigurator]] die netzwerkseitige AES-Verschlüsselung über die HM-PC-Software abgeschaltet werden, sonst kann FHEM nicht mit dem [[HMLAN Konfigurator]] kommunizieren. &lt;br /&gt;
Das [[HM-LGW-O-TW-W-EU Funk-LAN Gateway]] kann mit und ohne LAN AES genutzt werden (Konfiguration mit LAN Konfigurator/Netfinder von eq3). Für LAN AES muss das Perl-Modul &amp;lt;code&amp;gt;Crypt::Rijndael&amp;lt;/code&amp;gt; (Debian: &amp;lt;code&amp;gt;libcrypt-rijndael-perl&amp;lt;/code&amp;gt;) installiert sein.&lt;br /&gt;
&lt;br /&gt;
Es sind 2 Schnittstellen zu betrachten: &lt;br /&gt;
Nutzt man ein USB Interface besteht i.a. kein Sicherheitsproblem. Man muss sicherstellen, dass niemand in die Zentrale eindringen kann.&lt;br /&gt;
Sollte man ein I/O-Device per LAN  oder WLAN benutzen ([[HMLAN Konfigurator]], [[CUN]], [[CUNO]]) muss dieses Netz entsprechend gesichert sein. Entsprechende Verfahren (z.B. VLAN, Firewalls,...) werden hier nicht weiter besprochen.&lt;br /&gt;
&lt;br /&gt;
== I/O-Device ←→ Gerät ==&lt;br /&gt;
Dieses Teilstück kann mit AES gesichert werden. &lt;br /&gt;
Die Kommunikation auf Signaturbasis ist im Abschnitt [[#Ablauf|Ablauf]] beschrieben. &lt;br /&gt;
&lt;br /&gt;
Es kann ein [[HomeMatic#FHEM_als_Zentrale|HomeMatic]] IO oder ein [[CUL]] kompatibler Io genutzt werden. &lt;br /&gt;
Die HomeMatic Module und IOs können AES von sich aus. Für alle [[CUL]]-kompatiblen Geräte muss das Perl-Modul &amp;lt;code&amp;gt;Crypt::Rijndael&amp;lt;/code&amp;gt; (Debian: &amp;lt;code&amp;gt;libcrypt-rijndael-perl&amp;lt;/code&amp;gt;) installiert sein.&lt;br /&gt;
&lt;br /&gt;
Bei CUL Kompatiblen Geräten kann es zu Timingproblemen kommen. Für CUL Geräte ist für HomeMatic generell die {{Link2Forum|Topic=31421|LinkText=TS Firmware}} angeraten!&lt;br /&gt;
&lt;br /&gt;
Beim Einsatz von AES-CBC, z.B. dem Rauchmelder HM-SEC-SD-2, wird generell das Perl-Modul &amp;lt;code&amp;gt;Crypt::Rijndael&amp;lt;/code&amp;gt; (Debian: &amp;lt;code&amp;gt;libcrypt-rijndael-perl&amp;lt;/code&amp;gt;) benötigt!&lt;br /&gt;
&lt;br /&gt;
== Gerät ←→ Gerät ==&lt;br /&gt;
AES kann auch für die Kommunikation zwischen den Geräten aktiviert werden. Hierbei werden Trigger von Sensoren (z.B. Tasten) durch den Empfänger durch Anforderung einer AES-Signatur überprüft. Dies kann je Kanal aktiviert bzw. deaktiviert werden: Ein 2-Kanal Schalter kann also auf einem Kanal AES nutzen und auf dem anderen nicht.&lt;br /&gt;
&lt;br /&gt;
= Ablauf =&lt;br /&gt;
Bei eingeschaltetem AES-Encryption Modus wird ein Kommando durch den Empfänger nicht sofort ausgeführt. Der Empfänger sendet vielmehr einen Binärwert mit Signaturanforderung an den Sender (Challenge), welche dieser mit seinem bekannten AES-Schlüssel kodieren und zurücksenden muss (Response). Der Empfänger vergleicht diese mit einem Wert, den er selbst aus der Verschlüsselung mit seinem Schlüssel erhält. Nur wenn beide verschlüsselten Datenwerte übereinstimmen, wird das zuerst erhaltene Kommando ausgeführt und der Empfänger quittiert mit einem ACK an den Sender.&lt;br /&gt;
&lt;br /&gt;
Die AES Challenge-Response Antwort wird mit dem System-Schlüssel erzeugt. Der System-Schlüssel wird von der Zentrale bzw. dem [[HMLAN Konfigurator]] auf alle gepairten HomeMatic Geräte verteilt. Ab Werk ist ein einheitlicher Standard-Schlüssel hinterlegt. Dieser ist in &#039;&#039;&#039;allen&#039;&#039;&#039; HM-Geräten gleich und &#039;&#039;&#039;muss&#039;&#039;&#039; somit vom User geändert werden um einen sinnvollen Schutz zu erreichen.&lt;br /&gt;
&lt;br /&gt;
== Overhead ==&lt;br /&gt;
Es ist aus diesem Ablauf klar, dass der AES-Encryption Modus zu einer zusätzlichen Zeitverzögerung zwischen dem Absenden und dem Ausführen eines Kommandos führt. Im günstigen Fall kann diese etwa 200 ms betragen, in ungünstigen Fällen auch höher sein. Außerdem erhöht sich auf einer Funkstrecke mit AES-Encryption Modus die Funklast auf den dreifachen Wert. Wegen der 1%-Regel kann dies ein I/O-Gerät durchaus in die Überladung mit Befehlen steuern.&lt;br /&gt;
&lt;br /&gt;
Es ist deshalb zu empfehlen, den AES-Encryption Modus nur für sicherheitskritische HomeMatic-Geräte einzuschalten, etwa für Türöffner. Auch der Hersteller eQ-3 gibt diese Empfehlung.&lt;br /&gt;
&lt;br /&gt;
== Sicherheit ==&lt;br /&gt;
Der genaue Ablauf des AES-Signaturverfahrens ist in &amp;quot;[https://git.zerfleddert.de/hmcfgusb/AES/ Dissecting HomeMatic AES]&amp;quot; beschrieben. Henryk Plötz hat die Sicherheit des Kommunikationsprotokolls in &amp;quot;[https://blog.ploetzli.ch/2015/on-the-security-of-aes-in-homematic/ On the Security of AES in HomeMatic]&amp;quot; näher betrachtet.&lt;br /&gt;
&lt;br /&gt;
= Aktivieren, Einrichten, Umgang in FHEM =&lt;br /&gt;
== Zentrale ==&lt;br /&gt;
*Der erste Schritt ist, in der virtuellen CCU von FHEM oder nur einem I/O-Device einen Schlüssel (Key) zu vergeben In FHEM kann mehr als ein Schlüssel hinterlegt sein (Attribute hmKey, hmKey2, hmKey3), als aktiv wird aber nur der Schlüssel mit dem höchsten Index betrachtet, und nur dieser wird, wie unten beschrieben, an ein Gerät übertragen. Fügt man einen neuen Schlüssel hinzu und ein Gerät ist gerade nicht aktiv, kann/muss das System den vorigen Schlüssel noch nutzen. &lt;br /&gt;
** Der Systemverwalter muss sich den Schlüssel unbedingt merken. Er kann nicht aus den Geräten gelöscht werden! Im Zweifelsfall muss das Gerät kostenpflichtig von eQ-3 zurückgesetzt werden. &lt;br /&gt;
** Die Schlüssel werden MD5 kodiert - man kann ihn im Klartext oder bereits kodiert eingeben. FHEM kodiert ihn, wenn er im Klartext eingegeben werden sollte. FHEM speichert das Attribut ausschließlich kodiert.&lt;br /&gt;
:: &amp;lt;code&amp;gt;attr VCCU hmKey geheimerSchluessel&amp;lt;/code&amp;gt;&lt;br /&gt;
*Der zweite Schritt besteht darin, den Schlüssel mit dem höchstenm Index mit dem gerätespezifischen FHEM-Kommando &#039;&#039;assignHmKey&#039;&#039; an alle gepairten Geräte zu übertragen, mindestens aber an diejenigen, bei denen der AES-Encryption Modus eingeschaltet werden soll. Es ist aber auch möglich, diese Aktion mit der HM Konfigurationssoftware (HM-PC-Software) oder einer CCU durchzuführen.&lt;br /&gt;
:: &amp;lt;code&amp;gt;set Geraet assignHmKey&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;set Schalter assignHmKey&amp;lt;/code&amp;gt;&lt;br /&gt;
Der aktuelle Schlüsselindex kann aus dem Reading &amp;lt;code&amp;gt;aesKeyNbr&amp;lt;/code&amp;gt; des Geräts berechnet werden, wobei das Reading den im Funkprotokoll angeforderten Schlüssel wiederspiegelt, welcher den &#039;&#039;&#039;doppelten&#039;&#039;&#039; Wert des eigentlichen Schlüsselindex hat. Weiterhin muss beachtet werden, dass das Reading &amp;lt;code&amp;gt;aesKeyNbr&amp;lt;/code&amp;gt; nur angepasst wird, wenn das Gerät eine Signatur anfordert, d.h. eine Schaltaktion ausgeführt oder ein Register geändert wird. &#039;&#039;&#039;Direkt nach dem &amp;lt;code&amp;gt;assignHmKey&amp;lt;/code&amp;gt; hat das Reading noch einen veralteten Wert!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Geräte ==&lt;br /&gt;
* Eine AES-Signatur muss vom Empfänger angefordert werden. Dementsprechend wird die Nutzung auch dort aktiviert. Dies wird durch das Setzen des Registers &#039;&#039;&#039;sign&#039;&#039;&#039; auf &#039;&#039;&#039;on&#039;&#039;&#039; erreicht, wobei es für jeden Kanal des Geräts separat gesteuert wird. &lt;br /&gt;
:: &amp;lt;code&amp;gt;set Geraet sign on&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;set Schalter_Btn_01 sign on&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ein Sender, der mit einem Empfänger gepeert ist sollte wissen, dass dieser AES nutzen wird. Das Register &#039;&#039;&#039;expectAES&#039;&#039;&#039; ist hierbei auf on zu setzen. Hiermit kann der Sender überprüfen, ob tatsächlich eine AES-Transaktion stattgefunden hat und diese vom Gerät korrekt bestätigt wurde. Falls dies nicht der Fall ist, wird die Anfrage wiederholt bzw. dem Benutzer ein Fehler signalisiert.&lt;br /&gt;
:: &amp;lt;code&amp;gt;set Schalter_Btn_01 regSet expectAES on Geraet&amp;lt;/code&amp;gt;&lt;br /&gt;
* Die Zentrale kann ebenfalls eine AES-Signatur von einem Gerät anfordern, so sie einen Trigger empfängt. Hierzu ist im Device (und evtl. entsprechendem Kanal) eines Geräts das Attribut &amp;lt;code&amp;gt;aesCommReq&amp;lt;/code&amp;gt; auf 1 zu setzen. Damit die Signatur angefordert wird, muss das Attribut auf jeden Fall auch im Gerät gesetzt werden, auch wenn nur ein einzelner Kanal betroffen ist. Hiermit kann die Überprüfung für ein Gerät sehr schnell deaktiviert werden, indem nur das Geräteattribut wieder entfernt wird (z.B. nach Factory-Reset nötig, wenn das Gerät den eigenen Schlüssel noch nicht kennt). Sollte die Signaturüberprüfung fehlschlagen, verarbeitet FHEM den Befehl nicht.&lt;br /&gt;
:: &amp;lt;code&amp;gt;attr Geraet aesCommReq 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;attr Schalter aesCommReq 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;attr Schalter_Btn_01 aesCommReq 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Nachteile, Einschränkungen =&lt;br /&gt;
* Die zusätzliche Kommunikation führt zu einer Verzögerung von etwa 200ms je Vorgang.&lt;br /&gt;
* Die erhöhte Nachrichtenlast schlägt sich in der Auslastung der IO-Devices nieder. Wenn zwischen Zentrale und dem Gerät AES-Signatur genutzt wird reduziert sich das stündliche Sendekontingent des  IO-Devices, siehe [[1% Regel]]&lt;br /&gt;
* Jedes Kommando und seine Bestätigung wird unverschlüsselt übertragen, so dass Beobachter von außen den Zustand jedes Aktors durch mitlesen des Funkverkehrs ermitteln können. Dies trifft auch bei selbst gesetztem Schlüssel zu.&lt;br /&gt;
* Ein Sicherheitsgewinn ist nur gegeben, wenn ein eigener System-Sicherheitsschlüssel genutzt wird.&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
Eine Steigerung der Sicherheit ergibt sich nur, wenn man den werksseitig vorgegeben Schlüssel ändert. Solange Angreifern der eigene Schlüssel unbekannt bleibt, ist ein Fremdschalten oder die Änderung der Konfiguration nicht mehr möglich, wohl aber ein Ermitteln des aktuellen Schaltzustandes.&lt;br /&gt;
&lt;br /&gt;
Wurde ein eigener Schlüssel vergeben der nicht mehr bekannt ist und wird dann die Zentrale zurückgesetzt oder ausgetauscht ohne die Komponenten vorher auf Werkseinstellung zurückzusetzen, sind die entsprechenden Komponenten &#039;&#039;&#039;nicht mehr verwendbar&#039;&#039;&#039;. Die Geräte müssen kostenpflichtig eingeschickt und zurückgesetzt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WICHTIG&#039;&#039;&#039;: den eigenen Sicherheitsschlüssel gut und sicher aufbewahren.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Gerät mit gesetztem eigenem Sicherheitsschlüssel an eine andere/neue CCU angelernt werden soll, wird während des Anlernvorgangs nach dem eigenen Sicherheitsschlüssel gefragt. Dieser muss also bereits in der neuen Zentrale vorliegen.&lt;br /&gt;
&lt;br /&gt;
Die AES-Signierung kann mit einigen Ausnahmen (hauptsächlich Dimmer mit älteren Firmware-Versionen) in jedem HM-Gerät separat je Kanal aktiviert/deaktiviert werden.&lt;br /&gt;
In einigen Geräte wie z.B. KeyMatic kann die AES-Signierung nicht abgeschaltet werden. Diese Geräte kommunizieren &#039;&#039;&#039;immer&#039;&#039;&#039; AES-Signiert.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
* Durch Fehler in der Firmware einiger Aktoren/FW Versionen (HM-LC-Sw1-Pl und HM-LC-SW2-PB-FM) werden Toggle-Kommandos &#039;&#039;&#039;vor&#039;&#039;&#039; Eintreffen des Signingpaketes geschaltet. Beim HM-LC-SW1-PL mit Firmware Version 1.9 konnte dieses Verhalten nicht mehr reproduziert werden.&lt;br /&gt;
*Die Schlüsselimplementation der CCU in älteren Firmwareversionen (vor 1.504) ist mit Bugs behaftet. Es ergeben sich Risiken selbst dann, wenn der Schlüssel bekannt ist. So darf der Schlüssel z.b. keinesfalls ein &amp;quot;&amp;amp;amp;&amp;quot; enthalten. Gelegentlich wird auch berichtet, dass garantiert richtig eingegebene Schlüssel bei Systemwechseln nicht akzeptiert wurden. &#039;&#039;&#039;WICHTIG&#039;&#039;&#039;: Keine Sonderzeichen im eigenen Sicherheitsschlüssel verwenden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components|2Info]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Bekannte_HomeMatic_Ger%C3%A4te&amp;diff=23889</id>
		<title>Bekannte HomeMatic Geräte</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Bekannte_HomeMatic_Ger%C3%A4te&amp;diff=23889"/>
		<updated>2017-12-29T10:27:59Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine aktuelle Liste aller in FHEM unterstützten Homematik Geräte kann in FHEM mit HMInfo &amp;lt;u&amp;gt;[[Homematic HMInfo#Infos|HMInfo]]&amp;lt;/u&amp;gt; und dem Kommando &#039;&#039;&#039;models&#039;&#039;&#039; erzeugt werden. &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components|2Info]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=CUL_HM&amp;diff=23888</id>
		<title>CUL HM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=CUL_HM&amp;diff=23888"/>
		<updated>2017-12-29T10:26:50Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=HomeMatic Geräte (über CUL oder HMLAN)&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=CUL_HM&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=10_CUL_HM.pm &lt;br /&gt;
|ModOwner=martinp876 ([http://forum.fhem.de/index.php?action=profile;u=251 Forum] / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[CUL_HM]] implementiert die Unterstützung für [[HomeMatic]]-Geräte, die über einen [[CUL]] oder &lt;br /&gt;
[[HM-CFG-LAN LAN Konfigurations-Adapter|HMLAN Konfigurator]] angebunden sind.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
HomeMatic [[Interface]]: CUL im HomeMatic Modus oder  [[HM-CFG-LAN LAN Konfigurations-Adapter|HMLAN Konfigurator]].&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
Details in der [http://fhem.de/commandref.html#CUL_HM commandref].&lt;br /&gt;
&lt;br /&gt;
  define &amp;lt;name&amp;gt; CUL_HM &amp;lt;6-digit-hex-code|8-digit-hex-code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Details in der commandref.&lt;br /&gt;
&lt;br /&gt;
==== Virtuelle CCU (VCCU) ====&lt;br /&gt;
[[Datei:VirtualCCU.png|mini|400px|rechts|Standarddarstellung einer Virtual CCU im Webinterface]]&lt;br /&gt;
:&#039;&#039;→ Hauptartikel: [[Virtueller Controller VCCU]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Eine &#039;&#039;Virtuelle CCU&#039;&#039; implementiert einen HomeMatic-Controller und abstrahiert von den I/O-Devices, beispielsweise [[CUL]].&lt;br /&gt;
&lt;br /&gt;
  define vccu CUL_HM &amp;lt;hmId&amp;gt;&lt;br /&gt;
  &#039;&#039;&#039;attr vccu model CCU-FHEM&#039;&#039;&#039;&lt;br /&gt;
  attr vccu IOList &amp;lt;ioDev1&amp;gt;[,&amp;lt;ioDev2&amp;gt;,…]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Siehe auch:&#039;&#039;&#039;&lt;br /&gt;
* Foren-Thread {{Link2Forum|Topic=23008|LinkText=&amp;quot;HM virtual CCU&amp;quot;}} (April 2014)&lt;br /&gt;
* Foren-Beitrag {{Link2Forum|Topic=24048|Message=194876|LinkText=&amp;quot;virtual CCU (Homematic)&amp;quot;}} (August 2014)&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
=== Virtuellen Aktor erstellen ===&lt;br /&gt;
Ein virtueller Aktor ist nötig, damit Taster wie z.B. der [[HM-PB-6-WM55_6fach-Funk-Wandtaster|6fach-Wandtaster]] oder der [[HM-PB-2-WM55_2fach-Funk-Wandtaster|2fach-Wandtaster]] einen Tastendruck mit grünem Aufleuchten bestätigen. Diese Rückmeldung geben die Taster normalerweise wenn sie den Tastendruck an ihre [[Peering (HomeMatic)|Peers]] weitergeben haben. Hat man aber keine Homematic-Peers direkt gekoppelt (also nur die Zentrale [[Pairing (HomeMatic)|gepairt]]), leuchten die Taster lediglich orange.&lt;br /&gt;
&lt;br /&gt;
Mit einer virtuellen CCU kann man virtuelle Aktoren erstellen, mit denen man die Taster dann peeren kann. Zunächst muss dazu eine virtuelle CCU angelegt werden &amp;lt;code&amp;gt;define virtualCCU CUL_HM XXXXXX&amp;lt;/code&amp;gt;, wobei XXXXXX der hmId des HMLAN-Interfaces entspricht (bzw. dessen was statt HMLAN verwendet wird). Mit &amp;lt;code&amp;gt;attr virtualCCU model CCU-FHEM&amp;lt;/code&amp;gt; gibt man der CCU noch den korrekten Typ. &lt;br /&gt;
Virtuelle Aktoren kann man in der benötigten Anzahl (d.h. Anzahl aller Tasterbuttons) nun mit &amp;lt;code&amp;gt;set virtualCCU virtual X&amp;lt;/code&amp;gt; anlegen, wobei X der benötigten Anzahl virtueller Aktoren entspricht. Danach existieren die virtuellen Aktoren als z.b. &amp;lt;code&amp;gt;virtualCCU_Btn1, virtualCCU_Btn2&amp;lt;/code&amp;gt; usw. in FHEM. &lt;br /&gt;
&lt;br /&gt;
Die Peerings zwischen Tastern und den Buttons stellt man dann folgendermaßen her (CUL_HM_HM_PB_2_WM55_1F1xxx_Btn_01 und CUL_HM_HM_PB_2_WM55_1F1xxx_Btn_02 sind jeweils die Buttons des Tasters CUL_HM_HM_PB_2_WM55_1F1xxx):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set CUL_HM_HM_PB_2_WM55_1F1xxx_Btn_01 peerChan 0 virtualCCU_Btn1 single set&lt;br /&gt;
set CUL_HM_HM_PB_2_WM55_1F1xxx_Btn_02 peerChan 0 virtualCCU_Btn2 single set&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach führt man ein &amp;lt;code&amp;gt;set CUL_HM_HM_PB_2_WM55_1F1xxx getConfig&amp;lt;/code&amp;gt; aus und drückt einmal kurz den Anlern-Button des Tasters. Danach sollte der Taster mehrmals kurz orange blinken. &lt;br /&gt;
&lt;br /&gt;
Wenn alles geklappt hat wird nach dem betätigen der Taster in den States von CUL_HM_HM_PB_2_WM55_1F1xxx_Btn_01 bzw. CUL_HM_HM_PB_2_WM55_1F1xxx_Btn_02 ein &amp;quot;(to virtualCCU)&amp;quot; stehen. &lt;br /&gt;
&lt;br /&gt;
Save Config nicht vergessen :-).&lt;br /&gt;
&lt;br /&gt;
==== Tipps ==== &lt;br /&gt;
* Es wäre auch möglich nur einen virtuellen Aktor anzulegen und alle Buttons damit zu peeren.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components|1toolsAndWork]] &lt;br /&gt;
&amp;lt;!-- (Modulkategorie wird automatisch gesetzt) --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Register_programmieren&amp;diff=23887</id>
		<title>HomeMatic Register programmieren</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Register_programmieren&amp;diff=23887"/>
		<updated>2017-12-29T10:25:04Z</updated>

		<summary type="html">&lt;p&gt;Martinp876: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Bitte noch an geeigneten Stellen Links auf diese Seite einfügen --&amp;gt;&lt;br /&gt;
{{Baustelle}}&lt;br /&gt;
Ein HomeMatic-Gerät besitzt mehr oder weniger umfangreiche Registersätze, mit denen das Verhalten des Gerätes vielfältig feinkonfiguriert werden kann. Die damit erreichbare Funktionsvielfalt geht weit über die standardisierten Vorgaben einer einfachen Direktverknüpfung ([[Peering_(HomeMatic)|Peering]]) hinaus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Grundlagen (in Auszügen) ==&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden nur exemplarisch einige Grundlagen und einfache Beispiele benannt, ohne jeden Anspruch auf Vollständigkeit.&lt;br /&gt;
&lt;br /&gt;
FHEM unterstützt die Programmierung der Register mit dem Befehl &#039;&#039;regSet&#039;&#039;. &amp;lt;peer&amp;gt; entfällt bei rein gerätebezogenen Programmierungen.&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; regSet &amp;lt;register&amp;gt; &amp;lt;value&amp;gt; [&amp;lt;peer&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
Darüberhinaus gibt es vor- oder selbstdefinierte [[HomeMatic_HmInfo_Templates_erstellen|Templates]] (Vorlagen), die alle erforderlichen Änderungen für standardisierte Anwendungen wie Treppenhauslichtschalter beinhalten. Die Anwendung von Templates auf Geräte wird protokolliert und der Registerzustand kann überprüft werden. Für viele Anwendungen genügt jedoch auch die einmalige Anwendung einer direkten Programmierung. Das genaue Verständnis der Vorgänge und Zusammenhänge ist nicht trivial, das Erlernen wird aber mit einer enormen erreichbaren Funktionsvielfalt belohnt. Viele wissenswerte Zusammenhänge sind im Homematic-Anhang der bekannten Einsteiger-Dokumentation erläutert, deren Lektüre zu Recht immer wieder empfohlen wird. Dieser Beitrag ist auch nur als Ergänzung zu verstehen!&lt;br /&gt;
&lt;br /&gt;
Die HomeMatic Aktoren (Schalter, Dimmer, ...) arbeiten so, wie es für verknüpften ([[Peering (HomeMatic)|peering]]) Sender vorgegeben ist. Sie nutzen Registersätze, die für jede Verknüpfung (peer) neu angelegt und gespeichert werden. Man kann also mit einem Taster ein- und ausschalten (toggeln), mit einem Tastenpaar gezielt ein- und ausschalten und mit einem weiteren Taster eine Zeitschaltung für 10 Sekunden starten. Dabei wird niemals der Taster oder der Schalter auf eine globale Aktion programmiert, sondern im Schalter (Aktor) die gewünschte Aktion für jeden verknüpften Taster separat gespeichert. Die auszulösende Aktion ist zudem abhängig vom aktuellen Zustand des Aktors und von der Länge des Tastendruckes (kurz oder länger - short or long).&lt;br /&gt;
&lt;br /&gt;
Kleines Beispiel:&lt;br /&gt;
 T1 schaltet S1 für 10 sec an&lt;br /&gt;
 T2 schaltet S1 an oder aus  &lt;br /&gt;
 T3 schaltet S1 an  &lt;br /&gt;
 T4 schaltet S1 aus.  &lt;br /&gt;
&lt;br /&gt;
Diese Tabelle ist im Schalter S1 gespeichert.&lt;br /&gt;
&lt;br /&gt;
Schaltet man mit T3 den S1 an und drückt dann nach beliebiger Zeit kurz T1 geht S1 nach weiteren 10 sec aus. Schaltet man mit T1 kurz den S1 für 10 sec an, aber innerhalb dieser Zeit mit T3 nochmal an, dann bleibt S1 nach Ablauf der 10 sec an.&lt;br /&gt;
&lt;br /&gt;
Die verfügbaren Register unterscheiden sich im Gerät und in den jeweiligen Kanälen. &lt;br /&gt;
Eine kurze Beschreibung der Register inklusive der erlaubten Werte erhält man durch:&lt;br /&gt;
:&amp;lt;code&amp;gt;get &amp;lt;name&amp;gt; regList &amp;lt;/code&amp;gt;&lt;br /&gt;
Dabei kann &amp;lt;name&amp;gt; ein Gerät oder ein separater Gerätekanal sein.&lt;br /&gt;
&lt;br /&gt;
== Spezielle Register (Auswahl) ==&lt;br /&gt;
Im folgenden sollen einige Register vorgestellt werden, die in vielen Geräten vorhanden sind. &#039;&#039;Ergänzungen sind ausdrücklich erwünscht!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gerätebezogene Register ===&lt;br /&gt;
Gerätebezogene Register existieren für jedes HomeMatic-Gerät nur einmal und werden in der sogenannten &#039;&#039;&#039;List0&#039;&#039;&#039; gespeichert (in der FHEM-Oberfläche als Hexbytefolge unter &#039;&#039;RegL_00.&#039;&#039; zu finden).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;confBtnTime&#039;&#039; - Kurz oder lang und der Konfigurationsmodus ====&lt;br /&gt;
Nicht immer sind die internen Tasten eines Gerätes ohne weiteres mit Aktionen für kurzen und langen Tastendruck programmierbar. Bei allen Hutschienen-Aktoren sowie den Zwischensteckern (mit nur einem Bedienknopf) versetzt ein langer Tastendruck (4 Sekunden) den Schalter normalerweise in den Konfigurations- bzw. Anlern-Modus, bei den in Unterputzdosen versenkbaren Schalt- und Dimmaktoren (-FM ohne PBU in der Bezeichnung) ohne eigenen Konfigurations-Button gilt dies sogar für die zur normalen Funktion extern angeschlossenen Taster. Dieses Verhalten kann man mit dem Register &#039;&#039;confBtnTime&#039;&#039; beeinflussen. Bis zum Ablauf der dort einstellbaren Zeit (in Minuten) nach dem Versorgen mit Strom (powerUp) erreicht man den Konfigurationsmodus wie bisher, danach interpretiert der Aktor die Tastendrücke stets als kurz (short) oder lang (long). Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; regSet confBtnTime 2&amp;lt;/code&amp;gt;&lt;br /&gt;
Möchte man den Aktor später zurücksetzen oder lokal konfigurieren, so erreicht man das ursprüngliche Verhalten in diesem Beispiel für die ersten zwei Minuten, nachdem man den Aktor (ausreichend lange) stromlos gemacht hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;intKeyVisib&#039;&#039; - Interne Tasten sichtbar machen ====&lt;br /&gt;
Die internen &amp;quot;Tasten&amp;quot; eines Aktors (z.B. die Schaltwippe bei Wandschaltern/-tastern, der Bedienknopf bei Zwischensteckern, aber auch die angeschlossenen externen Taster bei Aktoren für Unterputzdosen oder die von außen zugängliche &amp;quot;Notbedientaste&amp;quot; etwa bei Zwischendecken-Dimmern) sind logisch ebenso mit dem Aktor verknüpft wie externe Bedienelemente wie Funkfernbedienungen oder per Funk verknüpfte Wandtaster. Ihre Betätigung wird (außer mit präparierter Firmware) zwar nicht gesendet (und kann daher von FHEM nicht &amp;quot;gelesen&amp;quot; werden), die vom Hersteller vorgesehenen Funktionen lassen sich aber genauso frei programmieren. Allerdings sind diese internen Verknüpfungen zur Vermeidung versehentlicher Programmierungen zunächst verborgen und müssen daher explizit sichtbar gemacht werden. &lt;br /&gt;
&lt;br /&gt;
Dies geschieht mit&lt;br /&gt;
 set &amp;lt;name&amp;gt; regSet intKeyVisib visib  &lt;br /&gt;
 attr &amp;lt;name&amp;gt; expert 1&lt;br /&gt;
Anschließend sind der oder die internen Taste(n) mit der Bezeichnung self01 (self02, ...) sichtbar und ihre Aktionen können gezielt wie bei einem externen Peer umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
Wer nun auf die Idee kommt, man könne durch entsprechendes zusätzliches peering bei mehrkanaligen Geräten die (mehreren) internen Tasten beliebig zuweisen und so raffinierte Zusatzschaltungen auslösen, muss hier enttäuscht werden: Zwar kann man tatsächlich mit peerBulk bei den Aktorkanälen zusätzliche interne Peers eintragen und programmieren und mit einer Fernauslösung aus FHEM die neuen Verknüpfungen erfolgreich nutzen - das Gerät selbst reicht die Tastenbetätigungen aber immer nur an den ursprünglich dafür vorgesehenen Kanal weiter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;ledMode&#039;&#039; - Funktion der Onboard-LED bei Bausätzen ====&lt;br /&gt;
Die (batteriebetriebenen) -PCB-Aktoren und die 8-Kanal-Module haben kleine LED an Bord, die für Diagnosezwecke hilfreich sind, einem sparsamen Betrieb aber in der Regel entgegenstehen. Sie werden daher nur bei außergewöhnlichen Zuständen wie dem Anlernmodus, einem Reset, oder auch bei niedriger Batteriespannung als Hinweis an den Anwender benutzt und sind ansonsten ab Werk deaktiviert. Bei einer Dauerstromversorgung kann aber eine Schaltzustandsanzeige oder eine Quittung über eine Befehlsaussendung nicht nur zur Diagnose hilfreich sein.&lt;br /&gt;
&lt;br /&gt;
Besitzt das Gerät das Register &#039;&#039;ledMode&#039;&#039;, so kann man mit&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; regSet ledMode on&amp;lt;/code&amp;gt;&lt;br /&gt;
die LED auch für die &amp;quot;normalen&amp;quot; Betriebszustände aktivieren. Sie zeigen dann bei Aktoren, ob der Aktor eingeschaltet ist (blinkend, wenn eine Einschaltzeitbegrenzung aktiv ist), und bei den Sensormodulen HM-Mod-EM8(bit) zeigt die zweifarbige LED den von Fernbedienungen bekannten Sendezustand mit gelb, dem dann ein grün oder rot folgt - je nachdem ob eine Quittung angefordert ist und ob sie erfolgreich empfangen wurde.&lt;br /&gt;
&lt;br /&gt;
Leider lässt sich umgekehrt die bei Wandtastern oder Fensterkontakten mitunter gewünschte Deaktivierung der LED nicht so bewerkstelligen - diese Geräte haben das entsprechende Register nicht. Da hilft nur ein Eingriff ins Gerät mit Gaffa oder schwarzem Edding...  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kanalbezogene Register ===&lt;br /&gt;
Kanalbezogene Register existieren für jeden Kanal eines Gerätes einmal und werden in der sogenannten &#039;&#039;&#039;List1&#039;&#039;&#039; gespeichert (in der FHEM-Oberfläche als Hexbytefolge unter &#039;&#039;RegL_01.&#039;&#039; zu finden). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;powerUpAction&#039;&#039; - Automatischer Knopfdruck bei (wiederkehrender) Stromversorgung ====&lt;br /&gt;
Mit diesem Register (default &#039;&#039;off&#039;&#039;) kann erreicht werden, dass ein Schaltaktor nach einem Stromausfall sich bei Wiederkehr der Versorgungsspannung automatisch einschaltet. Dies ist z.B. sinnvoll für Zwischenstecker mit Messfunktion ([[HM-ES-PMSw1-Pl Funk-Schaltaktor 1-fach mit Leistungsmessung|HM-ES-PMSw1-Pl]]), wenn dieser als Langzeitmonitor etwa für Kühlgeräte verwendet wird - nach einem Stromausfall bliebe der Kühlschrank sonst aus und der Inhalt würde verderben. &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; regSet powerUpAction on&amp;lt;/code&amp;gt;&lt;br /&gt;
Achtung: Das Setzen dieses Registers auf &#039;&#039;on&#039;&#039; bedeutet nicht immer einen eingeschalteten Aktor nach der Wiederkehr der Stromversorgung. Vielmehr wird nur ein &#039;&#039;short&#039;&#039;-Ereignis auf den zugehörigen internen Taster ausgelöst, was nur im Normalfall zum Einschalten des Aktors führt - nicht aber wenn die Funktion dieses kurzen Tastendruckes gezielt verändert wurde, denn dann wird eben diese Aktion ausgeführt! Das gilt zum Beispiel auch für zeitlich begrenztes Einschalten. Als Alternative für eine lokale Schaltmöglichkeit bietet sich in solchen Fällen der lange Tastendruck an, sofern er vom Aktor unterstützt wird (so lässt sich die Einschaltzeit bei langem Tastendruck mit &#039;&#039;lgOnTime&#039;&#039; begrenzen). Dessen Aktion wird bei powerUp nicht ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Verknüpfungsbezogene Register ===&lt;br /&gt;
Diese Register sind am umfangreichsten und werden für jeden Verknüpfungspartner einzeln separat angelegt in der &#039;&#039;&#039;List3&#039;&#039;&#039; (&#039;&#039;RegL_03.&amp;lt;peer&amp;gt;&#039;&#039;). Die grundsätzlichen Funktionen und ihre Zusammenhänge sind ausführlich in der Einsteigerdokumentation erklärt, inklusive Skizzen für die sogenannte &#039;&#039;state machine&#039;&#039;. Hier sollen daher nur die in den folgenden Beispielen verwendeten Register erklärt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;shOnTime&#039;&#039; und &#039;&#039;lgOnTime&#039;&#039; - das interne &#039;&#039;on-for-timer&#039;&#039; von Schaltern oder Dimmern ====&lt;br /&gt;
Die wohl populärsten Register begrenzen die Einschaltzeit eines Aktors. Um z.B. eine Steckdose für 10 sec bei Knopfdruck lokal einzuschalten kann man folgendes programmieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; regSet shOnTime 10 self01 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;shOnTime&#039;&#039; ist dabei das zuständige Register für die Einschaltzeit bei kurzem (sh=short) Tastendruck, entsprechend gilt &#039;&#039;lgOnTime&#039;&#039; für einen langen Tastendruck. &lt;br /&gt;
&lt;br /&gt;
In den Readings werden die Register mit dem jeweiligen verknüpften Taster angezeigt, in unserem Fall also:&lt;br /&gt;
:&amp;lt;code&amp;gt;R-self01-shOnTime &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Defaultwert für shOnTime ist 111600 und bedeutet unendlich (von FHEM mit &amp;quot;unused&amp;quot; dargestellt), d.h. die maximale einstellbare Zeit ist 111599 sec (knapp 31 Stunden). So kann man die Zeit löschen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; regSet shOnTime 111600 self01 &amp;lt;/code&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; regSet shOnTime unused self01 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Übrigens gibt es diese Register auch für die Ausschaltzeit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;shCtOn&#039;&#039; und &#039;&#039;shCtOff&#039;&#039; - Bedingtes Schalten mit Schwellwerten ====&lt;br /&gt;
Fernbedienungen (im weitesten Sinne, &#039;&#039;remote&#039;&#039;) von HomeMatic übermitteln je nach Betätigungsdauer &#039;&#039;short&#039;&#039;- oder &#039;&#039;long&#039;&#039;-Trigger. Zustandsübermittelnde Sensoren (etwa ein Fensterkontakt oder Neigungssensor sowie Bewegungsmelder) senden ausschließlich &#039;&#039;short&#039;&#039;, gekoppelt mit einem Wert zwischen 0 und 200, entsprechend 0-100% in 0,5-%-Schritten. Ob ein solcher Trigger vom Aktor verarbeitet wird, kann vom gesendeten Wert abhängen.&lt;br /&gt;
&lt;br /&gt;
HomeMatic kennt dazu (für jeden Peer und Triggertyp (short/long) separat) zwei Schaltschwellen Lo und Hi, die default bei 50 und 100 liegen. Ob ein Trigger in Relation zu diesen Schwellen verarbeitet wird, regeln u.a. die shCtxxx-Register. Wie auch bei den allgemeinen Schaltbedingungen stehen &#039;&#039;On&#039;&#039; und &#039;&#039;Off&#039;&#039; jeweils für den aktuellen Schaltzustand (Achtung: nicht den, der erreicht werden soll). Ihr Wert beträgt default &amp;quot;geLo&amp;quot; (greater or equal Lo), hier 50 und höher. Trigger für Werte darunter werden bei der Einstellung &amp;quot;ltLo&amp;quot; (less than Lo) verarbeitet. Diese Schwellen gibt es entsprechend auch für den Hi-Wert, also &amp;quot;geHi&amp;quot; oder &amp;quot;ltHi&amp;quot;. Besonders interessant sind aber auch die Werte &amp;quot;outside&amp;quot; und &amp;quot;between&amp;quot;, bezogen auf die beiden Schwellen Lo und Hi. In letzterem Fall wird der Trigger verarbeitet, wenn der Wert zwischen 50 und 100 liegt, bei &amp;quot;outside&amp;quot; entsprechend bei 0-49 oder 101-200.&lt;br /&gt;
&lt;br /&gt;
Sogenannte Three-State-Sensoren wie Fensterkontakt- oder -griffsensoren senden 0 für &amp;quot;closed&amp;quot; (geschlossen), 100 für &amp;quot;tilted&amp;quot; (gekippt) und 200 für &amp;quot;open&amp;quot; (offen). Gleiches gilt für Schalterkontaktinterfaces, die den Zustand eines angeschlossenen Schaltkontaktes übermitteln. Im Grundzustand (Vergleichsbefehl auf &amp;quot;geLo&amp;quot;) führt daher nur der Trigger &amp;quot;offen&amp;quot; (200) zu einer Aktion. Ändert man den Vergleichsbefehl auf &amp;quot;ltLo&amp;quot;, so wird lediglich &amp;quot;closed&amp;quot; ausgewertet, bei &amp;quot;between&amp;quot; ist es &amp;quot;tilted&amp;quot;. Mit &amp;quot;outside&amp;quot; führt sowohl &amp;quot;closed&amp;quot; als auch &amp;quot;open&amp;quot; zu einer Aktion.&lt;br /&gt;
&lt;br /&gt;
Bei Bewegungsmeldern wird der mit übermittelte Helligkeitswert im Zusammenhang mit den (dann variabel einzustellenden) Schwellen als Kriterium für das Einschalten des Aktors mit herangezogen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;shSwJtOn&#039;&#039; &amp;amp; Co. - Was soll passieren? ====&lt;br /&gt;
Nachdem wir nun kennengelernt haben, wie man auswählt, &#039;&#039;&#039;welcher&#039;&#039;&#039; Anstoss von außen zu einer Aktion führt, hier ein kleiner Exkurs in die Beeinflussung, &#039;&#039;&#039;was&#039;&#039;&#039; daraufhin passieren soll. Diese Frage regelt die &#039;&#039;jump table&#039;&#039; und liefert damit das Regelwerk für die Abfolge der Aktionen, die &#039;&#039;state machine&#039;&#039;. Ein HomeMatic-Aktor geht nämlich keineswegs einfach nur an oder aus. Vielmehr hangelt er sich nacheinander an einer Reihe von Zuständen entlang - auch das ist in der Einsteigerdokumentation erschöpfend beschrieben und soll hier nicht wiederholt werden. Ein Schalter durchläuft aber mindestens die Zustände&lt;br /&gt;
  Aus &amp;gt; Einschaltverzögerung &amp;gt; Ein &amp;gt; Ausschaltverzögerung &amp;gt; Aus &amp;gt; (usw)&lt;br /&gt;
Hier soll reichen, dass am Ende jeder (Teil-)Kette in der Regel ein dauerstabiler Zustand bleibt, in der Regel ist das der Aus-Zustand und auch der Ein-Zustand, wenn dessen Laufzeit nicht durch &#039;&#039;shOnTime&#039;&#039; &amp;amp; Co. begrenzt ist. Ein- und Ausschaltverzögerung sind aber in der Regel 0 (Sekunden), so dass effektiv nur &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; übrig bleiben.&lt;br /&gt;
&lt;br /&gt;
Das Register &#039;&#039;shSwJtOn&#039;&#039; regelt, wohin die Reise geht, wenn ein gültiger &#039;&#039;short&#039;&#039;-Trigger im eingeschalteten Zustand eintrifft, sinngemäß &#039;&#039;...Off&#039;&#039; im Auszustand und &#039;&#039;lg...&#039;&#039; für die &#039;&#039;long&#039;&#039;-Trigger. Für &#039;&#039;shSwJtOn&#039;&#039; ist normalerweise als nächstes die Ausschaltverzögerung &amp;quot;dlyOff&amp;quot; vorgesehen. Da die Ausschaltverzögerung in der Regel 0 ist, folgt darauf, in &#039;&#039;shSwJtDly&#039;&#039; festgelegt, &amp;quot;off&amp;quot; usw. Die Zustände bilden so quasi einen Kreis, dessen Durchlauf von außen gelegentlich &amp;quot;angeschubst&amp;quot; wird. Mit diesen Registern kann man den Kreislauf aber auch umbiegen oder sogar unterbrechen, so dass ein eintreffender Trigger eben nicht zu einer Aktion führt. Als Ziele bieten sich, quasi selbstsprechend, &amp;quot;on&amp;quot;, &amp;quot;dlyOff&amp;quot;, &amp;quot;off&amp;quot; und &amp;quot;dlyOn&amp;quot; an - oder eben &amp;quot;no&amp;quot;, was nichts anderes bedeutet, als dass der betreffende Trigger an dieser Stelle zu keiner Aktion führt.&lt;br /&gt;
&lt;br /&gt;
Bei einem Dimmer heißen die Register statt &#039;&#039;..Sw....&#039;&#039; nur &#039;&#039;..Dim....&#039;&#039; und es gibt ein paar mehr Bedingungen - die Funktion ist aber entsprechend gleich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;shOnDly&#039;&#039; und &#039;&#039;shOffDly&#039;&#039; - es muss nicht immer sofort sein! ====&lt;br /&gt;
Nicht nur welcher Anstoße welche Aktion auslöst, sondern auch wann oder wie schnell die Aktion ausgeführt wird, lässt sich in gewissen Grenzen einstellen. Die beiden genannten Register etwa regeln die Ein- oder Ausschaltverzögerung nach einem gültigen Trigger. So kann man nach einem Ausschaltbefehl einen Raum noch im Hellen verlassen, wenn das Licht noch ein paar Sekunden länger leuchtet.&lt;br /&gt;
&lt;br /&gt;
Bei Dimmern gibt es zusätzlich auch bei Ein- und Ausschaltvorgängen durch eine neu eingerichtete Verknüpfung eine sogenannte Rampenzeit von 0,5 Sekunden, in der das Licht hoch- oder heruntergedimmt wird. Durch Programmierung von &#039;&#039;shRampOnTime&#039;&#039; und &#039;&#039;shRampOffTime&#039;&#039; kann man ein sehr augenschonendes langsames Ein- oder Ausschalten des Lichts wie im Kino erreichen. Zwar gibt es die Zeiten auch für long-Trigger, aber da machen sie im Normalfall wenig Sinn - der lange Tastendruck löst immer einen manuellen Dimmvorgang aus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(wird ergänzt)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Praktische Beispiele ==&lt;br /&gt;
Die folgenden Beispiele beschreiben nur in Kurzform die erforderlichen Aktionen. Weiterführende Informationen sind der Einsteigerdokumentation oder den o.g. Registerbeschreibungen zu entnehmen.&lt;br /&gt;
Übrigens: ein einmal konfigurierter Vorgang für eine Verknüpfung kann aus FHEM auch bequem fernausgelöst (bzw. simuliert) werden. Der Aktor führt dabei genau die Aktion aus, die für die benannte Verknüpfung vorgesehen ist. Der kurze Knopfdruck auf den internen Knopf eines Aktors wird beispielsweise so simuliert:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; press short self01 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Lokal bedienbarer Zeitschalter mit HomeMatic Aktoren: Pool für eine Stunde schalten ===&lt;br /&gt;
Ich habe einen HM-LC-SW4-DR und der channel_01 schaltet die Poolzirkulationspumpe. Dies passiert zeitgesteuert zweimal am Tag. Manchmal möchte ich im Keller diese Pumpe einfach für eine Stunde aktivieren, der Aktor ist bequem erreichbar an der Wand.&lt;br /&gt;
Die internen Tasten vom Hauptdevice (der Aktor hat vier Kanäle (channel), die in FHEM einzeln dargestellt werden) sichtbar machen:&lt;br /&gt;
 set LichtKeSW1 regSet intKeyVisib visib  &lt;br /&gt;
 attr LichtKeSW1 expert 1  &lt;br /&gt;
&lt;br /&gt;
Jetzt sieht man im Channel 01 - LichtKeSW1_Sw01 den internen peer self01. (Channel 02 ist self02 usw.)&lt;br /&gt;
Also jetzt einfach die Zeit eintragen:&lt;br /&gt;
 set LichtKeSW1 regSet shOnTime 3600 self01  &lt;br /&gt;
&lt;br /&gt;
Die Toggle Funktion der Taste bleibt erhalten. Ein zweiter Tastendruck schaltet die Pumpe auch sofort wieder aus. Während die Zeit läuft, blinkt die Status LED des Kanals.&lt;br /&gt;
Die Zeitbegrenzung funktioniert in diesem Beispiel ohne jedes Zutun von FHEM und damit auch bei einem Ausfall des Servers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Es werde Licht! Automatisches Licht mit Tor oder Tür ===&lt;br /&gt;
Im Kühlschrank geht das Licht ja schon praktischerweise automatisch an und aus, aber es gibt auch andere Situationen, in denen ein automatisches Licht sehr nützlich sein kann - in dunklen Abstellräumen oder Garagen. Vor allem weil man nicht vergessen kann es auszuschalten, weil es auch von allein ausgeht. Eine solche Funktion, so könnte man meinen, wird ganz einfach erreicht, indem man das Licht mit einem Aktor schalten lässt und diesen mit einem Tür- oder Fensterkontakt verknüpft. Hat man die beiden dann mit &#039;&#039;peerChan&#039;&#039; verknüpft, so wird man feststellen, dass das Licht mitnichten das Gewünschte tut: es schaltet sich beim Öffnen der Tür abwechselnd ein und aus und ignoriert das Schließen der Tür komplett.&lt;br /&gt;
&lt;br /&gt;
Verantwortlich für dieses &amp;quot;Fehlverhalten&amp;quot; sind die Register &#039;&#039;shCtOn&#039;&#039; und &#039;&#039;shCtOff&#039;&#039;. Beide stehen nach der Verknüpfung auf &amp;quot;geLo&amp;quot;. Wie bei den Registern oben erläutert, führt in diesem Fall nur die &amp;quot;offen&amp;quot;-Meldung des Türkontaktes zu einer Aktion. Das Öffnen der Tür soll den Aktor einschalten, das klappt. Das Schließen der Tür soll den eingeschalteten Aktor aber ausschalten. Also muss die Schaltbedingung im On-Zustand geändert werden (die Bezeichnungen natürlich durch die realen Namen des Schaltaktorkanals und des Türkontaktes ersetzen):&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;Schalter&amp;gt; regSet shCtOn ltLo &amp;lt;Türkontakt&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
Nun führt auch das Schließen der Tür wunschgemäß stets zu einem Abschalten des Lichts. &#039;&#039;shCtOff&#039;&#039; muss auf &amp;quot;geLo&amp;quot; bleiben!&lt;br /&gt;
&lt;br /&gt;
Kombinieren ließe sich das noch mit einer Laufzeitbegrenzung etwa für eine Stunde - sollte man die Tür versehentlich offenlassen, so brennt das Licht nicht stundenlang. Vor allem geht das Licht dann auch aus, wenn aus welchem Grund auch immer die Schließmeldung verloren geht.&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;Schalter&amp;gt; regSet shOnTime 3600 &amp;lt;Türkontakt&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lampe mit Kippschalter(n) fernschalten - eindeutig oder als Wechselschaltung ===&lt;br /&gt;
Oft besteht der Wunsch, eine Lampe mit einem herkömmlichen Schalter (statt eines Tasters) fernzuschalten. So kann man einen herkömmlichen Schalter mit einer Schließerkontaktinterface wie dem [[HM-SCI-3-FM 3-Kanal-Funk-Schließerkontakt-Interface|HM-SCI-3-FM]] ergänzen (oder einem Kanal des [[HM-MOD-EM-8 8-Kanal-Sendemodul|8-Kanal-Sendemoduls]] in der Betriebsart &#039;&#039;sensor&#039;&#039;) und wiederum die Verknüpfung mit dem Lampen-Aktor setzen. Ganz ähnlich wie bei der vorgenannten Abstellraum-Aufgabe führt nun aber das Schließen des Schalters nicht zu einem Einschalten. Daher ist nun &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;Lampenaktor&amp;gt; regSet shCtOff ltLo &amp;lt;Sensorkontakt&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
das Mittel der Wahl, &#039;&#039;shCtOn&#039;&#039; muss dieses Mal auf &amp;quot;geLo&amp;quot; bleiben. Jetzt folgt der Aktor dem (sichtbaren) Schaltzustand des Schaltes - zumindest solange er nicht anderweitig ein- oder ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
Nun kann man auch mehrere Schalter so mit der Lampe koppeln. Das ergibt aber keine Wechselschaltung im herkömmlichen Sinn - um eine Lampe ein- oder auszuschalten, muss man den Schalter möglicherweise einmal zusätzlich auf die aktuelle Schaltposition kippen, ehe die nächste Betätigung den gewünschten Effekt bringt. Für Wechselschaltungen bietet sich daher das Kontaktinterface [[HM-SwI-3-FM]] (oder das erwähnte 8-Kanal-Sendemodul in der Betriebsart &#039;&#039;switch&#039;&#039;) an. Hier führt jede Zustands&#039;&#039;änderung&#039;&#039; zu einem Schaltvorgang.&lt;br /&gt;
&lt;br /&gt;
Hat man hingegen nur ein HM-SCI-3-FM zur Hand, lässt sich dieses Verhalten auch erreichen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;Lampenaktor&amp;gt; regSet shCtOn outside &amp;lt;Sensorkontakt&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;Lampenaktor&amp;gt; regSet shCtOff outside &amp;lt;Sensorkontakt&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gezieltes Schalten eines (unsichtbaren) Aktors mit nur einer Taste ===&lt;br /&gt;
Für so etwas braucht man gewöhnlich zwei Tasten. Koppelt man einen Schalt-Aktor mit nur einer Taste (&amp;quot;single&amp;quot; beim &#039;&#039;peerChan&#039;&#039;-Kommando), so führt sowohl ein kurzer als auch ein langer Tastendruck immer nur zu einem Umschalten des Zustandes. Das ist unschön, wenn man den aktuellen Zustand nicht einsehen kann. &lt;br /&gt;
&lt;br /&gt;
Üblicherweise sind die Schaltabfolgen für eine Eintasten-Verknüpfung sowohl für kurze als auch lange Betätigungen gleich (bei Dimmern wird auf langen Tastendruck hingegen abwechselnd auf- oder abgedimmt). &lt;br /&gt;
 shSwJtOff = dlyOn	# Ist Gerät aus, wird Einschaltverzögerung gewählt (die aber normal 0 ist)&lt;br /&gt;
 lgSwJtOff = dlyOn	# dito, für lang&lt;br /&gt;
 shSwJtOn = dlyOff	# Ist Gerät an, wird Ausschaltverzögerung gewählt (die aber normal 0 ist)&lt;br /&gt;
 lgSwJtOn = dlyOff	# dito, für lang&lt;br /&gt;
Hier kann man sich zunutze machen, dass man mit einem gezielten &amp;quot;no&amp;quot; oder &amp;quot;dlyOn&amp;quot; bzw. &amp;quot;dlyOff&amp;quot; im richtigen Register die Schaltfolge abbrechen oder umbiegen kann.&lt;br /&gt;
Möchte man das Gerät &amp;lt;aktor&amp;gt; mit einem kurzen Tastendruck auf &amp;lt;button&amp;gt; ein- und mit einem langen Tastendruck ausschalten, so ändere man:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;aktor&amp;gt; regSet shSwJtOn dlyOn &amp;lt;button&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;aktor&amp;gt; regSet lgSwJtOff dlyOff &amp;lt;button&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
So laufen die entsprechenden Aktionen quasi ins Leere, wenn der Aktor bereits den gewünschten Zustand hat.&lt;br /&gt;
&lt;br /&gt;
Den umgekehrten Effekt (lang schaltet ein, kurz aus) erreicht man entsprechend mit&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;aktor&amp;gt; regSet shSwJtOff dlyOff &amp;lt;button&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;aktor&amp;gt; regSet lgSwJtOn dlyOn &amp;lt;button&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Welche Bedienhaptik man nun bevorzugt, muss man selbst entscheiden. In der Regel sollte die normale (sichere) Aktion &amp;quot;kurz&amp;quot; und die gefährlichere &amp;quot;lang&amp;quot; sein - eine PC-Stromversorgung mit einem kurzen Tastendruck versehentlich einzuschalten ist bestimmt besser als auszuschalten (das dann eben nur über lang) - für ein potentiell gefährliches Arbeitsgerät wie einen Heizofen wird es sicher andersherum sein.&lt;br /&gt;
&lt;br /&gt;
Sinngemäß verwendet der Autor sozusagen eine Hälfte davon als &amp;quot;Sicherheitsaktion&amp;quot; für einen [[HM-LC-Sw2PB-FM Schaltaktor mit Tasteraufsatz 2fach]] - der gewöhnliche Tastendruck auf die zugehörige Wippenseite schaltet den Aktor abwechselnd ein und aus, ein langer Tastendruck immer aus, dafür reicht:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;aktor&amp;gt; regSet lgSwJtOff dlyOff &amp;lt;button&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Übrigens: Nichts anderes wird normalerweise auch automatisch beim Verknüpfen eines Aktors mit einem Tastenpaar an der entsprechenden Stelle gemacht - ist eine Taste nur zum Ausschalten gedacht, so wird in beiden Schaltzuständen entsprechend &amp;quot;dlyOff&amp;quot; eingetragen. Als &amp;quot;Sprungziel&amp;quot; müsste aber genauso gut auch &amp;quot;no&amp;quot; funkionieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== WARNUNG! - Selbsttätiges Blinken eines HM-Aktors ===&lt;br /&gt;
Statt einer separaten Warnleuchte kann es durchaus sinnvoll sein, eine vorhandene Lampe zu Warnzwecken periodisch ein- und auszuschalten. Leider beherrschen die HomeMatic-Aktoren keine direkt aus FHEM erreichbare Blinkfunktion (ähnlich dem on-for-timer für eine Zeitbegrenzung), und das rhythmische Ein- und Ausschalten aus FHEM erzeugt eine recht hohe Funklast.&lt;br /&gt;
&lt;br /&gt;
Wir wissen aber, dass die Aktoren für jeden Peer nicht nur eine Ein-, sondern auch eine Ausschaltzeit speichern. Definiert man nun für einen Peer entsprechend beide Zeiten, so wird der Aktor bei einem Telegramm von diesem Peer sich entsprechend selbsttätig fortlaufend ein- und ausschalten. Jeder andere Schaltbefehl eines anderen Peers oder aus FHEM beendet die Schleife umgehend. So ließe sich das Blinken auch mit einer aktoreigenen Taste stoppen - oder starten, wenn man es entsprechend programmiert. Einen Zwischenstecker-Schalter beispielsweise kann man also (wenn man zuvor seine &#039;&#039;confBtnTime&#039;&#039; entsprechend setzt und so die langen Tastendrücke auswertbar macht) durch das Programmieren von &#039;&#039;lgOnTime&#039;&#039; und &#039;&#039;lgOffTime&#039;&#039; für den Peer &amp;quot;self01&amp;quot; wie gewohnt mit einem kurzen Tastendruck ein- und ausschalten und mit einem langen in den Blinkmodus versetzen.&lt;br /&gt;
&lt;br /&gt;
Einen Haken hat die Sache aber (möglicherweise): Der Aktor meldet seinen Schaltzustand natürlich periodisch. Allerdings tut er das mit einer gewissen Verzögerung. Beim Blinken in einem 2-Sekunden-Rhythmus kommen jedenfalls noch keine regelmäßigen Statustelegramme, die die Funklast erhöhen würden.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit wäre, virtuelle Buttons (etwa einer VCCU) zum Ein- und Ausschalten der Blinkfunktion zu verwenden. &amp;quot;Opfert&amp;quot; man dafür zwei aufeinanderfolgende Kanäle, kann man die Aktoren mit &amp;quot;dual set&amp;quot; peeren und bekommt so einen Blink- und einen Deaktivierungsbutton ohne weitere Kopfstände. Anschließend passt man die short-Laufzeiten für den Einschaltkanal an: &lt;br /&gt;
&lt;br /&gt;
Ein Beispiel für einen Dimmer (als virtuelle Buttons dienen vccu_Btn8 und vccuBtn9):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;vccu_Btn8&amp;gt; peerChan 0 &amp;lt;dimmerkanal&amp;gt; dual set&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann man mit &amp;quot;set vccu_Btn9 press short&amp;quot; den Dimmer ein- und mit &amp;quot;set vccu_Btn8 press short&amp;quot; ausschalten. Das Blinken im Dimmer wird eingestellt mit &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;set dimmer regSet shOnTime 1 vccu_Btn9&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set dimmer regSet shOffTime 1 vccu_Btn9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird der Dimmer nun mit &amp;quot;set vccu_Btn9 press short&amp;quot; eingeschaltet, so blinkt er im 3-Sekunden-Takt: zu den jeweils 1 Sekunde Ein- und Auszeit gesellen sich noch 2x 0,5s Rampenzeit, sofern nichts anderes programmiert wurde.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man eine größere Anzahl von Aktoren mit den virtuellen Buttons peeren und so ein ganzes Feuerwerk zünden ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Einer nach dem Anderen! - Sequentielles Schalten mehrerer Aktoren ===&lt;br /&gt;
Eine großflächige Beleuchtung mit viel Leistung sollte man aus Lastgründen niemals zugleich einschalten. Auch LED-Lampen ziehen im Einschaltmoment, wennauch extrem kurz, beträchtliche Ströme, die die von gewöhnlichen Glühlampen deutlich übersteigen können. Schaltet man mehrere Aktoren gleichzeitig mit einer Taste, so hilft eine individuelle Verzögerung des Einschaltvorgangs in jedem Aktor, die Sicherung vor dem Herausfliegen zu bewahren. Oder man macht gezielt einen Effekt daraus. Der Phantasie sind wenig Grenzen gesetzt...&lt;br /&gt;
&lt;br /&gt;
Hat man drei Aktoren &amp;quot;Aussenlicht1...3&amp;quot; mit dem Taster &amp;quot;Aussenlicht_Ein&amp;quot; gepeert, so erreicht man auf folgende Weise, dass sie beim Einschalten mit einer Verzögerung von jeweils einer Sekunde nacheinander einschalten.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;set Aussenlicht2 regSet shOnDly 1 Aussenlicht_Ein&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set Aussenlicht3 regSet shOnDly 2 Aussenlicht_Ein&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components|toolsAndWork]]&lt;/div&gt;</summary>
		<author><name>Martinp876</name></author>
	</entry>
</feed>