<?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=TomLee</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=TomLee"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/TomLee"/>
	<updated>2026-04-11T02:17:51Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FTUI3_Chart&amp;diff=40909</id>
		<title>FTUI3 Chart</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FTUI3_Chart&amp;diff=40909"/>
		<updated>2026-04-03T12:33:48Z</updated>

		<summary type="html">&lt;p&gt;TomLee: unit Attribut ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit dem Chart-Widget können in FTUI3 komplexe Diagramme erstellt werden. Die Spezifikation erfolgt analog zur Spezifikation in FHEM. In einem Diagramm - definiert durch das Element &amp;lt;ftui-chart&amp;gt; - können beliebig viele Datensätze dargestellt werden. Für jeden Datensatz muss dabei ein Element &amp;lt;ftui-chart-data&amp;gt; angegeben werden. Beispiel:&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;ftui-chart y-label=&amp;quot;Energie W&amp;quot; y-unit=&amp;quot;kWh&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;ftui-chart-data label=&amp;quot;PV1&amp;quot; color=&amp;quot;red&amp;quot; log=&amp;quot;EnergieD&amp;quot; spec=&amp;quot;12:nt5000.reading&amp;quot; point-radius=&amp;quot;0&amp;quot; border-width=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;/ftui-chart-data&amp;gt;&lt;br /&gt;
            &amp;lt;ftui-chart-data label=&amp;quot;PV2&amp;quot; color=&amp;quot;pink&amp;quot; log=&amp;quot;EnergieD&amp;quot; spec=&amp;quot;5:PowerFlow.energy_summary_in&amp;quot; point-radius=&amp;quot;0&amp;quot; border-width=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;/ftui-chart-data&amp;gt;&lt;br /&gt;
            &amp;lt;ftui-chart-data label=&amp;quot;Speicher&amp;quot; color=&amp;quot;green&amp;quot; log=&amp;quot;EnergieD&amp;quot; spec=&amp;quot;4:PowerFlow.energy_summary_out&amp;quot; point-radius=&amp;quot;0&amp;quot; border-width=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;/ftui-chart-data&amp;gt;&lt;br /&gt;
            &amp;lt;ftui-chart-data color=&amp;quot;green&amp;quot; log=&amp;quot;EnergieD&amp;quot; spec=&amp;quot;4:PowerFlow.battery_SOC::$fld[3]*10.24/100&amp;quot; point-radius=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/ftui-chart-data&amp;gt;&lt;br /&gt;
            &amp;lt;!--ftui-chart-data color=&amp;quot;green&amp;quot; log=&amp;quot;EnergieD&amp;quot; spec=&amp;quot;4:PowerFlow.energy_summary_in::-$fld[3]&amp;quot; point-radius=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/ftui-chart-data--&amp;gt;&lt;br /&gt;
            &amp;lt;ftui-chart-data label=&amp;quot;Haus&amp;quot; color=&amp;quot;white&amp;quot; log=&amp;quot;EnergieD&amp;quot; spec=&amp;quot;6:PowerFlow.energy_summary_out&amp;quot; point-radius=&amp;quot;0&amp;quot; border-width=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;/ftui-chart-data&amp;gt;&lt;br /&gt;
            &amp;lt;ftui-chart-data label=&amp;quot;Wallbox&amp;quot; color=&amp;quot;yellow&amp;quot; log=&amp;quot;EnergieD&amp;quot; spec=&amp;quot;5:PowerFlow.energy_summary_out&amp;quot; point-radius=&amp;quot;0&amp;quot; border-width=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;/ftui-chart-data&amp;gt;&lt;br /&gt;
            &amp;lt;ftui-chart-data label=&amp;quot;Grid&amp;quot; color=&amp;quot;blue&amp;quot; log=&amp;quot;EnergieD&amp;quot; spec=&amp;quot;6:PowerFlow.energy_summary_in&amp;quot; point-radius=&amp;quot;0&amp;quot; border-width=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;/ftui-chart-data&amp;gt;&lt;br /&gt;
            &amp;lt;ftui-chart-data label=&amp;quot;Upload&amp;quot; color=&amp;quot;gray&amp;quot; log=&amp;quot;EnergieD&amp;quot; spec=&amp;quot;7:PowerFlow.energy_summary_in&amp;quot; point-radius=&amp;quot;0&amp;quot; border-width=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;/ftui-chart-data&amp;gt;&lt;br /&gt;
        &amp;lt;/ftui-chart&amp;gt;&lt;br /&gt;
[[File:Ftui3-chart-1.png |800px]] &lt;br /&gt;
&lt;br /&gt;
==Attribute von ftui-chart==&lt;br /&gt;
*y-label: Achsenbeschriftung für die erste vertikale Achse&lt;br /&gt;
*y-unit: Einheiten für die erste vertikale Achse&lt;br /&gt;
*y1-label: Achsenbeschriftung für die 2. vertikale Achse&lt;br /&gt;
*y1-unit: Einheiten für die 2. vertikale Achse&lt;br /&gt;
*unit: Zeitachse des Charts (Werte: hour, day, week, month, year, 24h, 30d)&lt;br /&gt;
&lt;br /&gt;
==Attribute von ftui-chart-data==&lt;br /&gt;
*label: Bezeichnung der Daten in der Legende. Fehlt dieses Attribut, erfolgt kein Eintrag in die Legende.&lt;br /&gt;
*color: Farbe der Daten. Achtung, hier können nur die benannten Farben von FTUI3 verwendet werden.&lt;br /&gt;
*point-radius: Radius der Punkte für die Daten. Ist dieser Wert 0, werden keine Punkte gezeichnet.&lt;br /&gt;
*border-width: Breite der Linien für die Daten. Default-Wert ist 1&lt;br /&gt;
&lt;br /&gt;
*log: Name des FHEM-Device für das Logging der Daten&lt;br /&gt;
*spec: Datenspezifikation wie im *.gplot-file von FHEM, also &amp;lt;Spalte&amp;gt;:&amp;lt;Regulärer Ausdruck&amp;gt;:&amp;lt;Default&amp;gt;:&amp;lt;Funktion&amp;gt;          &lt;br /&gt;
[[Kategorie:FHEM Tablet UI V3]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=40862</id>
		<title>MQTT2-Module - Praxisbeispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=40862"/>
		<updated>2026-03-27T13:08:12Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Einfache Payload */  Ersatzwert für unbekannte Werte ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung: MQTT bzw. MQTT2 in FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht&amp;lt;ref&amp;gt;Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden&amp;lt;/ref&amp;gt;. MQTT2_DEVICE unterstützt u.a. auch die &#039;&#039;setExtensions&#039;&#039; direkt, also z.B. &#039;&#039;on-for-timer&amp;lt;ref&amp;gt;Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die &#039;&#039;split&#039;&#039;-Varianten der attrTemplate-Einrichtung zu verwenden.&amp;lt;/ref&amp;gt;&#039;&#039; sowie &#039;&#039;[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]&#039;&#039;&amp;lt;ref&amp;gt;Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muss dies dort per Attribut eingeschaltet werden&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Einstellungen und Hinweise ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für [[autocreate]] in Verbindung mit MQTT2_SERVER &#039;&#039;&#039;zwingend&#039;&#039;&#039; jeder über MQTT kommunizierende Client eine ClientID angeben muss. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch &amp;quot;Wegwerf&amp;quot;-ClientID&#039;s. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit &#039;&#039;&#039;MQTT2_SERVER als Server (&amp;quot;Broker&amp;quot;)&#039;&#039;&#039;, für diesen sollte dabei &#039;&#039;autocreate&#039;&#039; &#039;&#039;&#039;nicht deaktiviert&#039;&#039;&#039; sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden&amp;lt;ref&amp;gt;Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) ebenfalls aktiv ist.&amp;lt;/ref&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Beispiel&amp;lt;ref&amp;gt;MQTT2_SERVER verwendet als default-Einstellung für &#039;&#039;autocreate&#039;&#039; &#039;&#039;simple&#039;&#039;, ohne dass ein entsprechendes Attribut gesetzt werden müsste. Die Einstellung &#039;&#039;complex&#039;&#039; empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 define MQTT2_FHEM_Server MQTT2_SERVER 1883 global&lt;br /&gt;
&lt;br /&gt;
Falls der MQTT Broker mit Hilfe von [[allowed]] abgesichert wurde, muss in den Geräten ebenfalls User bzw. Passwort eingetragen werden, damit eine MQTT Kommunikation möglich ist.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muss ggf. die &amp;quot;\&amp;quot; entfernen!}}&lt;br /&gt;
&lt;br /&gt;
=== MQTT-Einstellungen in den Geräten ===&lt;br /&gt;
Die Beispiele gehen davon aus, dass die einzubindenden Geräte &#039;&#039;&#039;&#039;&#039;mit den default-Einstellungen&#039;&#039;&#039;&#039;&#039; für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere &#039;&#039;&#039;keine Veränderungen der topic-Pfade&#039;&#039;&#039; vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen.  }}&lt;br /&gt;
&lt;br /&gt;
=== auto-Konfigurations-features ===&lt;br /&gt;
Viele firmwares und Dienste bieten Möglichkeiten an, einer Controller-Software (insbesondere homeassistant) Hilfsdaten zur automatisierten Konfiguration bereitzustellen. Da FHEM diese Daten nicht zu ihrem ursprünglichen Zweck verwenden kann, werden hierdurch lediglich zusätzliche Readings erzeugt, mit denen man als User in der Regel wenig anfangen kann. Es wird daher empfohlen, derartige features &#039;&#039;&#039;abzuschalten&#039;&#039;&#039;. Wo dies nicht möglich ist, sollte man eine passende [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp]] setzen bzw. diese passend erweitern!&lt;br /&gt;
&lt;br /&gt;
=== Schritt für Schritt ===&lt;br /&gt;
Hier werden in der Regel fertige Konfigurationen für häufige Anwendungsfälle (beispielhaft) dargestellt. In [[MQTT2_DEVICE - Schritt für Schritt]] ist etwas mehr über die Vorgehensweise bei der Zusammenstellung der verschiedenen Attribute und deren Zusammenwirken zu erfahren.&lt;br /&gt;
&lt;br /&gt;
== zigbee2mqtt ==&lt;br /&gt;
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]&lt;br /&gt;
[https://www.zigbee2mqtt.io zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.&lt;br /&gt;
&lt;br /&gt;
Einzelheiten zur Vorgehensweise sind auf der Detailseite [[Zigbee2mqtt|zigbee2mqtt]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Tasmota ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. &lt;br /&gt;
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter &#039;&#039;&amp;lt;nowiki&amp;gt;topic = %topic% (tasmota)&amp;lt;/nowiki&amp;gt;&#039;&#039; ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem  Eingabefeld für &#039;&#039;&amp;quot;client ...&amp;quot;&#039;&#039;, siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
=== MQTT2_DEVICE ===&lt;br /&gt;
Dieses sollte bei aktiviertem &#039;&#039;autocreate&#039;&#039; am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen - Schalter ===&lt;br /&gt;
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD IODev m2server&lt;br /&gt;
 attr MQTT2_DVES_9B01BD devStateIcon on:FS20.on:off off:FS20.off:on&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr MQTT2_DVES_9B01BD room MQTT2_DEVICE&lt;br /&gt;
 attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\&lt;br /&gt;
    off cmnd/DVES_9B01BD/POWER off\&lt;br /&gt;
    reboot cmnd/DVES_9B01BD/Restart 1&lt;br /&gt;
 attr MQTT2_DVES_9B01BD webCmd on:off:reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen - Dimmer ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Dieses Beispiel ist nur bedingt zur Nachahmung zu empfehlen: Prinzipiell kann man Readings und setter in MQTT2_DEVICE fast nach Belieben benennen. Wählt man allerdings &amp;lt;i&amp;gt;FHEM-typische&amp;lt;/i&amp;gt; Namen, kann dies sehr zur Vereinfachung beitragen. Z.B. wird eine Sprachssteuerung bei einem Dimmer üblicherweise automatisch korrekt eingestellt werden, wenn der für die Helligkeit zuständige setter z.B. &amp;lt;i&amp;gt;pct&amp;lt;/i&amp;gt; (oder &amp;lt;i&amp;gt;brightness&amp;lt;/i&amp;gt;) heißt, oder eine abzufragende Temperatur &amp;lt;i&amp;gt;temperature&amp;lt;/i&amp;gt;. Entsprechendes gilt im Rahmen von &amp;lt;i&amp;gt;devspec-Abfragen&amp;lt;/i&amp;gt;.}}Bei einem Dimmer sind einige zusätzliche Anpassungen vorzunehmen. Ein Dimmer wird über &#039;&#039;&#039;POWER&#039;&#039;&#039; geschaltet und über &#039;&#039;&#039;Dimmer&#039;&#039;&#039; gedimmt. Damit das funktioniert, müssen ein stateFormat und devStateIcon zusammenarbeiten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr MQTT2_DVES_2DF34D devStateIcon 10\d.*:dim100%@orange:off 1\d.*:dim12%@orange:off 2\d.*:dim18%@orange:off 3\d.*:dim31%@orange:off 4\d.*:dim43%@orange:off 5\d.*:dim50%@orange:off 6\d.*:dim62%@orange:off 7\d.*:dim68%@orange:off 8\d.*:dim81%@orange:off 9\d.*:dim93%@orange:off 0:FS20.off:on .*:FS20.off@orange:off&lt;br /&gt;
 attr MQTT2_DVES_2DF34D stateFormat {if(ReadingsVal($name,&amp;quot;POWER&amp;quot;,0)eq&amp;quot;off&amp;quot;){0}else{ReadingsVal($name,&amp;quot;Dimmer&amp;quot;,0)}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nun kann man über das Icon ein- und ausschalten und der Zustand des Dimmers wird korrekt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Es fehlt noch ein Slider, um auch dimmen zu können. Zusätzlich muss setList noch um Dimmer erweitert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 attr MQTT2_DVES_2DF34D setList on cmnd/dimmer/POWER on\&lt;br /&gt;
 off cmnd/dimmer/POWER off\&lt;br /&gt;
 Dimmer cmnd/dimmer/Dimmer&lt;br /&gt;
 attr MQTT2_DVES_2DF34D webCmd Dimmer&lt;br /&gt;
 attr MQTT2_DVES_2DF34D widgetOverride Dimmer:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
===== Allgemeines =====&lt;br /&gt;
Für gängige Tasmota-Geräte stehen &#039;&#039;templates&#039;&#039; bereit, mit denen sich diese schnell konfigurieren lassen. &lt;br /&gt;
Beachten Sie dazu den Abschnitt &#039;&#039;attrTemplate&#039;&#039; in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}&lt;br /&gt;
&lt;br /&gt;
===== Kein passendes attrTemplate vorhanden? =====&lt;br /&gt;
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das &amp;quot;&#039;&#039;tasmota_basic&#039;&#039;&amp;quot; anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults &amp;quot;ON&amp;quot; bzw. &amp;quot;OFF&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Allerdings stellt dieses das &#039;&#039;autocreate&#039;&#039; an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das &#039;&#039;autocreate&#039;&#039;-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im &#039;&#039;jsonMap&#039;&#039;-Attribut nur die Angabe &amp;quot;&#039;&#039;POWER1:state&#039;&#039;&amp;quot; zu belassen.&lt;br /&gt;
&lt;br /&gt;
=== on-for-timer ===&lt;br /&gt;
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen &#039;&#039;setter&#039;&#039; in der &#039;&#039;setList&#039;&#039; werden die &#039;&#039;&#039;SetExtensions&#039;&#039;&#039; verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:&lt;br /&gt;
&lt;br /&gt;
==== delay ==== &lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (Attributeingabe via FHEMWEB!):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1*10; &#039;cmnd/DVES_575127/Backlog POWER1 1; delay &#039;.$duration.&#039;; POWER1 0&#039;}&lt;br /&gt;
&lt;br /&gt;
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe [https://tasmota.github.io/docs/Commands/#delay Commands - Tasmota Delay]), also 6 Minuten.&lt;br /&gt;
&lt;br /&gt;
====pulseTime ====&lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (s.o.):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1 &amp;lt; 11.2 ? $EVTPART1*10 : $EVTPART1+100; &#039;CMNDTOPIC/Backlog pulseTime1 &#039;.$duration.&#039;; POWER1 1&#039;}&lt;br /&gt;
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit &#039;&#039;delay&#039;&#039;. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren &amp;quot;normalen&amp;quot; Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites &#039;&#039;save&#039;&#039; nur bis zum nächsten reboot des Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Da nach dem ersten pulseTime setzten, diese immer benutzt wird, kann man mit einem kleine Workaround das Device normal arbeiten lassen. Dafür wird bei jedem anderem Befehl, aus der PulseTime, der Timer deaktiviert.&lt;br /&gt;
Hierfür machen wir uns zu nutzen, dass man mehrere Befehle gleichzeitig an Tasmota senden kann (backlog). Ob diese Lösung auch mit anderen MQTT Firmwares funktioniert, kann ich nicht sagen. Es wurde lediglich mit Tasmota getestet.&lt;br /&gt;
Wir senden also, bevor wir den eigentlich Tasmota Befehl zum Ein- oder Ausschalten schicken, einen Befehl zum deaktivieren des Timers: &amp;quot;pulseTime 0&amp;quot;&lt;br /&gt;
Hier ein Beispiel: (das entsprechende device &amp;quot;DEV_611F3E&amp;quot; muss gegen das eigene ersetzt werden)&lt;br /&gt;
 off:noArg    cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 0&lt;br /&gt;
 on:noArg     cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 1 &lt;br /&gt;
 toggle:noArg cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 2&lt;br /&gt;
&lt;br /&gt;
=== zigbee2tasmota ===&lt;br /&gt;
[https://tasmota.github.io/docs/Zigbee/ zigbee2tasmota] ist eine Erweiterung der Tasmota-firmware für Microcontroller, insbesondere dem ESP8266 (und ESP32)(link), über die einige ZigBee-Chipsätze (insbesondere TI CC2530) als [[ZigBee#Koordinator_.28ZigBee_coordinator.2C_ZC.29|Coordinator]] eingebunden werden können, um ein ZigBee-Netzwerk aufzubauen.&lt;br /&gt;
{{Hinweis|Stand 08/2020 war die Einbindung anderer Chipsätze erst in einem Alpha-Stadium; die Zahl der über einen CC2530 einbindbaren ZigBee-Geräte ist daher derzeit relativ begrenzt (ca. 16)!}}&lt;br /&gt;
Auch für diese Lösung stehen einige &#039;&#039;attrTemplate&#039;&#039; zur Verfügung. Nähere Informationen hierzu sind dem Artikel [[Zigbee2Tasmota-MQTT]] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
== ESPurna ==&lt;br /&gt;
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool&#039;sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als &amp;quot;on&amp;quot; oder &amp;quot;off&amp;quot; oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.&lt;br /&gt;
&lt;br /&gt;
== Shelly ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.&lt;br /&gt;
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen weitere Geräte angelegt und konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Standardmäßig senden die Shelly-Geräte ihren kompletten Status alle 30 Sekunden. Dies kann man über den Parameter &#039;&#039;mqtt_update_period&#039;&#039; in den &#039;&#039;settings&#039;&#039; ändern, allerdings ist dieser nur über die HTTP-Schnittstelle des Shelly verfügbar. Um diese Statusupdates abzustellen, kann über den Browser folgender Befehl verwendet werden:&lt;br /&gt;
 http://&amp;lt;ip-des-shelly&amp;gt;/settings?mqtt_update_period=0, &lt;br /&gt;
Soweit bekannt, werden dann nur statische updates ausgeschaltet, z.B. für das Relay bzw. angeschlossene Taster oder Schalter; insbesondere Verbrauchswerte werden dennoch aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Shelly1 ===&lt;br /&gt;
&lt;br /&gt;
=== Shellybulb ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate  angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
 Internals:&lt;br /&gt;
   CFGFN     &lt;br /&gt;
   CID        shellybulb_3CC533&lt;br /&gt;
   DEF        shellybulb_3CC533&lt;br /&gt;
   DEVICETOPIC MQTT2_shellybulb_3CC533&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   NAME       MQTT2_shellybulb_3CC533&lt;br /&gt;
   NR         246&lt;br /&gt;
   STATE      ???&lt;br /&gt;
   TYPE       MQTT2_DEVICE&lt;br /&gt;
   READINGS:&lt;br /&gt;
     2018-12-12 19:28:08   status_blue     0&lt;br /&gt;
     2018-12-12 19:28:08   status_brightness 61&lt;br /&gt;
     2018-12-12 19:28:08   status_effect   0&lt;br /&gt;
     2018-12-12 19:28:08   status_gain     26&lt;br /&gt;
     2018-12-12 19:28:08   status_green    0&lt;br /&gt;
     2018-12-12 19:28:08   status_ison     true&lt;br /&gt;
     2018-12-12 19:28:08   status_mode     color&lt;br /&gt;
     2018-12-12 19:28:08   status_red      255&lt;br /&gt;
     2018-12-12 19:28:08   status_temp     3250&lt;br /&gt;
     2018-12-12 19:28:08   status_white    0&lt;br /&gt;
 Attributes:&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, &#039;status_&#039;) }&lt;br /&gt;
   room       MQTT2_DEVICE&lt;br /&gt;
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate &amp;quot;shellybulb&amp;quot; auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly Plug S ===&lt;br /&gt;
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb &amp;gt; 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:&lt;br /&gt;
  attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state =&amp;gt; $EVTPART0&amp;lt;100?&amp;quot;off&amp;quot;:&amp;quot;on&amp;quot; } }&lt;br /&gt;
Der Status des MQTT2 Devices zeigt dann bei &amp;lt;100W &amp;quot;off&amp;quot; und sonst &amp;quot;on&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
=== HTTP-Commands ===&lt;br /&gt;
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.&lt;br /&gt;
&lt;br /&gt;
== Shelly Gen2 ==&lt;br /&gt;
=== Vorbereitung ===&lt;br /&gt;
Shelly mit dem WLAN verbinden, entweder über die Shelly APP oder per Laptop auf den Offenen AP des Shelly verbinden und dann übers WebUI des Shelly mit dem Heimischen WLAN verbinden. Über die APP geht dies meist etwas einfach und schneller, besonders wenn man mehrere Shelly Geräte hinzufügen möchte. Durch die BT Unterstützung der Gen2 Geräte, klappt dies meist auch deutlich schneller und zuverlässiger als noch bei Gen 1 Geräten. &lt;br /&gt;
Nachdem der Shelly mit dem WLAN verbunden ist, sollte die Firmware überprüft und gegebenenfalls aktualisiert werden (Stand Anfang 2022 scheint die firmware noch nicht voll ausgereift gewesen zu sein, da dass insbesondere die MQTT-Schnittstelle immer wieder überarbeitet wurde). Bitte KEINE BETA Versionen installieren, wenn nicht dazu aufgefordert wurde.&lt;br /&gt;
Nach dem, durch das Update ausgelösten, Neustart kurz Prüfen ob die Uhrzeit passt, wenn trotz richtiger Zeitzone die Uhrzeit nicht stimmt hilft ein weiterer Neustart.&lt;br /&gt;
Nun auf Networks| Internet (leider in APP und WebUI unterschiedlich), hier auf MQTT und die Einstellungen für den verwendeten MQTT Server treffen. Diese Einstellungen werden auch wieder durch Neustart übernommen.&lt;br /&gt;
=== Shelly Plus 1 ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shelly erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod MQTT2_shellyplus1_441793a34044 MQTT2_DEVICE shellyplus1_441793a34044&lt;br /&gt;
attr MQTT2_shellyplus1_441793a34044 readingList shellyplus1_441793a34044:shellyplus1-441793a34044/online:.* online\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/status/mqtt:.* { json2nameValue($EVENT) }\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/events/rpc:.* { json2nameValue($EVENT) }\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/status/sys:.* { json2nameValue($EVENT) }\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/status/switch_0:.* { json2nameValue($EVENT) }&lt;br /&gt;
attr MQTT2_shellyplus1_441793a34044 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 IODev m2s&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 available_updates_beta_version 0.10.0-beta6&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 cfg_rev 7&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 connected true&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 dst shellyplus1-441793a34044/events&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_free 237568&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_size 458752&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 id 0&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 mac 441793A34044&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 method NotifyStatus&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 online true&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 output false&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_mqtt_connected true&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_id 0&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_output false&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_source WS_in&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tC 39.88&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tF 103.78&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 params_sys_available_updates_beta_version 0.10.0-beta6&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_ts 1646474952.66&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_rssi -57&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_ssid WLAN-Alex&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_sta_ip 192.168.177.167&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_status got ip&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_free 179764&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_size 249456&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 restart_required false&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 source WS_in&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 src shellyplus1-441793a34044&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tC 39.9&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tF 103.9&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 time 11:08&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 unixtime 1646474911&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 uptime 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über die set Anweisung unterhalb der Device Übersicht können wir ein attrTemplate wählen; shellyPlus_1&lt;br /&gt;
Es erscheint eine kurze Übersicht was im Template enthalten ist, dieses befindet sich noch im Aufbau und wird aktuell von der Community aufgebaut und weiterentwickelt. Mit einem Klick auf „set“ laden wir das Template und übernehmen die Einstellungen für den Shelly Plus 1.&lt;br /&gt;
Damit ist der Shelly bereit, im Status wird neben dem Namen auch der Onlinestatus des Shellys (grüner | roter Punkt) so wie eine Lampe mit Toggle (on | off) Funktion und die Temperatur des Shellys angezeigt. Darüber hinaus verschwindet die Lampe und wird durch einen klickbaren Hinweis ersetzt, wenn ein Neustart des Shellys nötig ist.&lt;br /&gt;
&lt;br /&gt;
=== Tipps ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=So nimmt man bei Verwendung eines normalen Schalters (eine Stellung EIN eine AUS) gerne den „Flip“ Mode – damit wird der Shelly IMMER umgeschaltet, egal in welche Stellung der Schalter sich bewegt („Kreuzschaltung“). Diese Einstellungen trifft man grundlegend im WebUI des Shelly (oder  APP) unter „Channel settings“.&lt;br /&gt;
Für den „Flip“ müssen wir die Grundeinstellung des „Power on default“ auch ändern (gleiche Seite) - persönlich wähle ich „Restore last“, also: nach Stromausfall wird der letzte Zustand wieder hergestellt; grundsätzlich gehen alle Modi außer „Match input“.&lt;br /&gt;
}}&lt;br /&gt;
Das aktuelle Template wurde um die Funktion erweitert, den Button Mode umzuschalten. In den meisten Fällen legt man sich auf eine Schaltmethode fest, welche zum Hardware Setup passt.&lt;br /&gt;
&lt;br /&gt;
Manchmal will man aber vielleicht den Hardware Schalter deaktivieren, nennen wir es „Kindersicherung“. Bei Shelly heißt das „detached“.&lt;br /&gt;
Diese Funktion wurde ins Template als „in_mode“ Übernommen. Mögliche set Befehle sind „flip“, „detached“ „toggle“. Bedingung zur Verwendung ist: „relay power on default“ darf NICHT „Match input“ sein. Sollte Follow statt Flip bevorzugt werden, müsste entsprechende Zeile in der setList von „flip“ auf „follow“ angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Der Befehlt lässt sich mit dem webCmd in_mode auch schnell zugänglich in die Übersicht vom Shelly setzen, so erhält man neben dem Status ein Dropdown mit flip detached  und toggle zum schnellen umschalten. Mit webCmdLabel kann man noch einen Namen für das Dropdown setzen.&lt;br /&gt;
&lt;br /&gt;
== OpenMQTTGateway ==&lt;br /&gt;
Um verschiedene Systeme wie BLE usw. auf MQTT zu bringen bietet sich [https://github.com/1technophile/OpenMQTTGateway OpenMQTTGateway] an, z.B. wird für das Auslesen vieler BLE-Seonsoren lediglich ein ESP32-Board ohne Zusatzhardware (ab ca. 5,- Euro in Fernost erhältlich) benötigt, auf das dann eine vorkompilierte firmware geflasht wird (hierfür wird ein USB-seriell-Wandler benötigt).&lt;br /&gt;
&lt;br /&gt;
Nähere Details sind im Artikel [[OpenMQTTGateway]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== 8-Port-Ethernet Board ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse&lt;br /&gt;
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
In diesem {{Link2Forum|Topic=107536|Message=1016379|LinkText=Forenbeitrag}} bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.&lt;br /&gt;
&lt;br /&gt;
== Milight-Bridge ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von &#039;&#039;openmili&#039;&#039; eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel. Allerdings lassen sich manche MiLight-Geräte nicht an die Bridge anlernen, und es werden auch nicht alle Fernbedienungs-Typen voll unterstützt.&lt;br /&gt;
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway&amp;lt;ref&amp;gt;Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist und die zu steuernden Leuchtmittel mit dem Hub bereits verbunden (gepairt) sind bzw. entsprechende Fernbedienungs-Signale empfangen werden können (bei vorhandenem pairing eines Leuchtmittels an die Fernbedienung).&lt;br /&gt;
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen am MiLight-Hub ===&lt;br /&gt;
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.&lt;br /&gt;
Die Einstellungen für &#039;&#039;MQTT topic pattern&#039;&#039; usw. können auf den default-Werten&amp;lt;ref&amp;gt;Diese sind: &amp;lt;br&amp;gt;&#039;&#039;milight/:device_id/:device_type/:group_id&#039;&#039; für &amp;quot;topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/updates/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;update topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/states/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;state topic pattern&amp;quot;. Der Autor hat derzeit folgende Infotypen zum Senden markiert: &amp;quot;status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color&amp;quot; (enthält eventuell zu viele Angaben. Bei einem Eventhandler muss man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).&amp;lt;/ref&amp;gt; belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (&#039;&#039;MQTT Client Status Topic&#039;&#039;), tragen Sie &#039;&#039;milight/LWT&#039;&#039; ein und aktivieren &#039;&#039;Detailed&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Devices ===&lt;br /&gt;
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]&lt;br /&gt;
==== Bridge ====&lt;br /&gt;
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:&lt;br /&gt;
 defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses Device wird nun das &#039;&#039;template&#039;&#039; &#039;&#039;&#039;esp_milight_hub_bridge&#039;&#039;&#039; angewandt.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Leuchtmittel ====&lt;br /&gt;
&lt;br /&gt;
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:&lt;br /&gt;
 defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Devices werden genauso erstellt. &lt;br /&gt;
&lt;br /&gt;
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template &#039;&#039;X_01a_esp_milight_hub_make_rgbw_group&#039;&#039; verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt &#039;&#039;&#039;eine Kopie&#039;&#039;&#039;, die dann modifiziert wird. Diese Kopie ist unter dem Namen &#039;&#039;milight_&amp;lt;RemoteID&amp;gt;_0&#039;&#039; im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele:&lt;br /&gt;
Beispiel für ein RGB-CCT-Device:&lt;br /&gt;
 defmod Licht_Wz_all MQTT2_DEVICE&lt;br /&gt;
 attr Licht_Wz_all IODev MQTT2_Broker&lt;br /&gt;
 attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/&lt;br /&gt;
 attr Licht_Wz_all group Licht&lt;br /&gt;
 attr Licht_Wz_all icon light_control&lt;br /&gt;
 attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 &lt;br /&gt;
 attr Licht_Wz_all room Wohnzimmer&lt;br /&gt;
 attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
 off milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
 level milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 next_mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_up milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 device_id milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 effect milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 commands milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr Licht_Wz_all sortby 1&lt;br /&gt;
 attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue&lt;br /&gt;
 attr Licht_Wz_all webCmdLabel command\ &lt;br /&gt;
 :brightness:saturation\&lt;br /&gt;
 :color_temp:hue&lt;br /&gt;
==== Ein Leuchtmittel, mehrere Fernbedienungen ====&lt;br /&gt;
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen &amp;quot;hört&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }&lt;br /&gt;
&lt;br /&gt;
==== Fernbedienung als Input-Device nutzen ====&lt;br /&gt;
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.&lt;br /&gt;
Um hier nur Differenz-Meldungen direkt an die betreffende myUtils-Funktion zu übergeben und doppelte Events zu verhindern, sollte hier die readingList so angepasst werden, dass nur Messages aus dem &amp;quot;updates&amp;quot;-Zweig ausgewertet werden: &lt;br /&gt;
 defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0&lt;br /&gt;
 attr MiLight_RC1_0 readingList milight/states/0xABCD/fut089/[0-8]:.* {}&lt;br /&gt;
 milight/updates/0xABCD/fut089/0:.* { FHEM::attrT_MiLight_Utils::MPDcontrol(&#039;myMPD&#039;,$EVENT, &#039;Yamaha_Main&#039;) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/1:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW(&#039;Licht_Stehlampe_links&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/2:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW(&#039;Licht_Stehlampe_rechts&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/3:.* { FHEM::attrT_MiLight_Utils::four_Lights_matrix($EVENT, &#039;Licht_WoZi_Vorn_Aussen&#039;, &#039;Licht_WoZi_Vorn_Mitte&#039;, &#039;Licht_WoZi_Hinten_Aussen&#039;, &#039;Licht_WoZi_Hinten_Mitte&#039;) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/4:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Jalousie_WZ&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/5:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Rollladen_WZ_SSO&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/6:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Rollladen_WZ_SSW&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/7:.* {}\&lt;br /&gt;
 milight/updates/0x5D47/fut089/8:.* {}&lt;br /&gt;
 attr MiLight_RC_WZ stateFormat CommandSet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== eBus ==&lt;br /&gt;
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition am eBus ===&lt;br /&gt;
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.&lt;br /&gt;
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. &#039;&#039;ebusd/%circuit/%name&#039;&#039;.&lt;br /&gt;
 --accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name&lt;br /&gt;
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic &#039;&#039;ebusd&#039;&#039; verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit &#039;&#039;ebus...&#039;&#039; zu beginnen!}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition  in FHEM ===&lt;br /&gt;
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem &#039;&#039;&#039;&#039;&#039;vor&#039;&#039;&#039;&#039;&#039; den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der &#039;&#039;readingList&#039;&#039; enthalten, die vom ebus stammen. Da wir die &#039;&#039;readingList&#039;&#039; anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche &#039;&#039;readingList&#039;&#039;-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-&amp;quot;Sammeldevices&amp;quot; genutzt werden, und dessen &#039;&#039;CID&#039;&#039; auf &#039;&#039;ebusd&#039;&#039; geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der &#039;&#039;readingList&#039;&#039; des &amp;quot;Sammeldevices&amp;quot; gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. &lt;br /&gt;
&lt;br /&gt;
Sind die Vorbereitungen abgeschlossen, aktivieren wir &#039;&#039;autocreate&#039;&#039; wieder, allerdings wählen wir als autocreate-Methode &#039;&#039;complex&#039;&#039; aus, da der eBus-Dämon teilweise&amp;lt;ref&amp;gt;Dies betrifft vorrangig die Statusmeldungen&amp;lt;/ref&amp;gt; eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt&amp;lt;ref&amp;gt;Bei Verwendung des MQTT2_CLIENT wird dann die &#039;&#039;readingList&#039;&#039; am bereits definierten MQTT2_DEVICE aus der Kopie des &amp;quot;Sammeldevice&amp;quot; automatisch wieder erstellt bzw. gefüllt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;ebus-Bridge&amp;quot; ====&lt;br /&gt;
Auf das von &#039;&#039;autocreate&#039;&#039; erstellte MQTT2_DEVICE wird nunmehr das template &#039;&#039;eBus_daemon_splitter&#039;&#039; angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. &lt;br /&gt;
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen &#039;&#039;uptime&#039;&#039;, alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;attrTemplate&#039;&#039; läd eine weitere &#039;&#039;attrTemplate&#039;&#039;-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. &lt;br /&gt;
==== &amp;quot;ebusd_bai&amp;quot; und weitere Geräte ====&lt;br /&gt;
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}&lt;br /&gt;
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens &#039;&#039;MQTT2_ebus_bai&#039;&#039; angelegt worden sein.&lt;br /&gt;
&lt;br /&gt;
== Sonos2Mqtt ==&lt;br /&gt;
Aus einem Versuch heraus ist ein {{Link2Forum|Topic=111711|LinkText=kleines Projekt}} geworden: Die Sonos Umgebung mit Hilfe von sonos2mqtt als generisches MQTT2_DEVICE komfortabel in FHEM einzubinden.&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von ein paar Templates ist die grundlegende Einbindung in FHEM nach einer kleinen Installation auf Systemebene schnell erledigt. Es läuft derzeit noch zahlreiche Entwicklung und Ideenfindung, die Fortschritte sind live im Thread oder [[Sonos2mqtt|konsolidiert im Wiki]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Setup im System ===&lt;br /&gt;
Für dies Funktion wird der nodejs Server [https://github.com/svrooij/sonos2mqtt sonos2mqtt] benötigt. Entweder installiert man den lokal, irgendwo im Netzwerk oder nutzt den [[MQTT2-Module - Praxisbeispiele#Verwendung des Docker Containers|Docker Container.]]&lt;br /&gt;
&lt;br /&gt;
Der nodejs Server sonos2mqtt kann aus Sicht von FHEM irgendwo im Netzwerk stehen - aber er muss im gleichen Netzwerk wie die Sonosplayer stehen. Das UPNP Sonosnetzwerk funktioniert nicht über Netzwerksegmente hinweg.&lt;br /&gt;
&lt;br /&gt;
Eine Beschreibung aller Startparameter für sonos2mqtt findet man [https://svrooij.github.io/sonos2mqtt in der offiziellen Doku].&lt;br /&gt;
&lt;br /&gt;
Erreicht der nodejs Server sonos2mqtt den MQTT Server nicht über - default: localhost, Port 1883, keine Anmeldung&amp;quot; - muss der Parameter --mqtt  gesetzt werden! &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800&amp;lt;/code&amp;gt;            # alles gesetzt&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://192.168.0.3:1800&amp;lt;/code&amp;gt;                                                                 # IP Adresse und Port gesetzt, keine Anmeldung am MQTT Server&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://192.168.0.3&amp;lt;/code&amp;gt;                                                                           # IP Adresse gesetzt, Port ist Standard 1883&lt;br /&gt;
&lt;br /&gt;
Erfolgt der Start mit pm2, werden die Parameter mit einem &#039;&#039;zusätzlichen&#039;&#039; doppelten Bindestrich (--) hinter dem nodejs Modul übergeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
pm2 start sonos2mqtt -- --mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lokales Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: nodejs und pm2 ist installiert und für alle Benutzer verfügbar. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo npm install -g sonos2mqtt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Je nach Entwicklungsstand sind auch Betaversionen verfügbar. Für aktuelle Betaversionen wird dieser Zusatz beim Setup verwendet. -&amp;gt; sonosmqtt@3.1.0-beta.1&lt;br /&gt;
&lt;br /&gt;
Wird der sonos2mqtt Server auf einer anderen Maschine eingerichtet, ist der Start entsprechend diesem Absatz [[MQTT2-Module - Praxisbeispiele#Autostart von sonos2mqtt im System mit pm2 .28Alternative.29|Autostart von Sonos2mqtt im System mit pm2]] einzurichten.&lt;br /&gt;
&lt;br /&gt;
=== Setup in FHEM ===&lt;br /&gt;
Man definiert lediglich ein Bridge Device, der Rest wird automatisch erledigt.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: &lt;br /&gt;
* autocreate im System ist aktiv. &lt;br /&gt;
* Der verwendete MQTT2_SERVER steht auf &#039;&#039;&#039;autocreate simple&#039;&#039;&#039; (default/Standard).&lt;br /&gt;
* Templates aktuell - FHEM uptodate oder bei Bedarf in der FHEM Kommandozeile aktualisieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ Svn_GetFile(&amp;quot;FHEM/lib/AttrTemplate/mqtt2.template&amp;quot;, &amp;quot;FHEM/lib/AttrTemplate/mqtt2.template&amp;quot;, sub(){ AttrTemplate_Initialize() }) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bei der Anwendung des Templates für die Bridge wird das Attribut devicetopic ausgelesen oder auf default sonos gesetzt! &lt;br /&gt;
&lt;br /&gt;
Wird ein anderer Devicetopic verwendet, muss der bei der Anlage der Bridge gesetzt werden!&lt;br /&gt;
&lt;br /&gt;
Diese Zeilen einzeln in der FHEM Kommandozeile oder als Block in der Raw Definition. &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define SonosBridge MQTT2_DEVICE&lt;br /&gt;
attr SonosBridge room MQTT2_DEVICE&lt;br /&gt;
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Template sonos2mqtt_bridge_comfort:&lt;br /&gt;
* setzt das Template sonos2mqtt_bridge auf das Device,&lt;br /&gt;
* lädt die Datei 99_sonos2mqttUtils.pm aus dem contrib Ordner nach,&lt;br /&gt;
* definiert ein notify, dies erledigt im weiteren Betrieb die automatische Konfiguration der automatisch erzeugten MQTT2_DEVICEs. &lt;br /&gt;
** mit dem Template sonos2mqtt_speaker (das Template kann auch manuell auf vorhandene Player angewendet werden, die automatische Erzeugung der Player wird aber empfohlen)&lt;br /&gt;
** Ermittelt Detailinformation des jeweiligen Players (vor allem IP Adresse und Modelnumber)&lt;br /&gt;
** Lädt die Sonosgeräte Icons von den UPNP Devices herunter&lt;br /&gt;
** erweitert das setList input Kommando um den TV Eingang (HDMI, spdif) bzw. Line_IN Eingang falls vorhanden (Modelnumber)&lt;br /&gt;
* Die Player werden automatisch einzeln erzeugt wenn sie mqtt Nachrichten senden (Play/Stop) oder (alle sofort) wenn der sonos2mqtt Server gestartet wird. &lt;br /&gt;
&lt;br /&gt;
==== Wozu dient die Bridge? ====&lt;br /&gt;
Sie stellt ein paar wesentliche Funktionen zu Verfügung&lt;br /&gt;
# Auffangen von nicht benötigten MQTT Nachrichten.&lt;br /&gt;
# Erzeugung/Weiterleitung von Nachrichten für die einzelnen Player - damit auch die Erzeugung von separaten Playern nach dem Schema MQTT2_RINCON12345678901234567.&lt;br /&gt;
# Statusanzeige sonos2mqtt als Reading connected (0 offline, 1 connected, 2 Player connected).&lt;br /&gt;
Sie kann zusätzlich als zentrales Device verwendet werden, um die Sonos Umgebung abzubilden, z.B. Readings für Favoriten  u.ä.&lt;br /&gt;
&lt;br /&gt;
==== Start sonos2mqtt lokal ====&lt;br /&gt;
Der Start / Stop des sonos2mqtt Servers innerhalb von FHEM ist nur lokal simpel möglich. Ist der Server irgendwo im Netzwerk oder im Docker Container, muss man andere Möglichkeiten finden. Der Neustart aus FHEM ist zwar praktisch, aber nicht erforderlich. &lt;br /&gt;
&lt;br /&gt;
Wird eine existierenden Sonos Landschaft inhaltlich verändert (Player dazu/weg), muss der Server neu gestartet werden. Werden Player temporär abgeschaltet, merkt das der Server nach einer Zeit selbst, oder man forciert dies mit einem CheckSubscription an der Bridge.&lt;br /&gt;
&lt;br /&gt;
Soll das Modul sonos2mqtt mit seinen default Einstellungen gestartet werden, genügt dieser kurze Befehl (in der FHEM Kommandozeile):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;pm2 start sonos2mqtt&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Tipp: Verwendet man anstatt &amp;quot;Befehl&amp;quot; den Syntax {qx(Befehl)} in der FHEM Kommandozeile, wirkt der Befehl zwar blockierend aber die Ausgabe erfolgt im Browser und nicht im Logfile. Mit dem Parameter -s erfolgt keine Ausgabe.&lt;br /&gt;
&lt;br /&gt;
==== Autostart von sonos2mqtt mit FHEM ====&lt;br /&gt;
Der Code startet sowohl das sonos2mqtt Modul sofort und implementiert ein notify für den zukünftigen automatischen Start beim Start von FHEM.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start &amp;quot;pm2 -s start sonos2mqtt&amp;quot;&lt;br /&gt;
trigger n_pm2_sonos start&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Autostart von sonos2mqtt im System mit pm2 (Alternative) ===&lt;br /&gt;
Der obige Code startet das sonos2mqtt nodejs Modul mit pm2 beim Start von FHEM. Sollte das nicht funktionieren oder nicht ins gesamte Konzept passen (weil z.B. mehrere nodejs Module geladen werden) kann der automatische Start direkt im System erfolgen. Zunächst dafür das oben eventuell schon definierte notify löschen!&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
delete n_pm2_sonos&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Start des Modul muss nicht mit erhöhten Rechten geschehen! Im Terminal folgendes eingeben (unter dem angemeldeten Benutzer wird sonos2mqtt später immer gestartet):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pm2 start sonos2mqtt&lt;br /&gt;
pm2 startup&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der letzte Befehl &amp;quot;redet&amp;quot;, d.h. es gibt eine Ausgabe in der Art:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[PM2] To setup the Startup Script, copy/paste the following command:&lt;br /&gt;
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man tut einfach genau das, was dasteht: die letzte Zeile kopieren und wieder einfügen und ausführen. Danach muss man die Konfiguration von pm2 noch sichern:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pm2 save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verwendung des Docker Containers ===&lt;br /&gt;
Ergänzend zur [https://svrooij.io/sonos2mqtt/getting-started.html#run-sonos2mqtt-in-docker Original Doku:]&lt;br /&gt;
&lt;br /&gt;
Beim Container findet die Konfiguration der Verbindung zum FHEM in den Environment Variablen statt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
environment:&lt;br /&gt;
  - SONOS2MQTT_DEVICE=192.168.56.207 # hier muss einer der Sonos Lautsprecher stehen&lt;br /&gt;
  - SONOS2MQTT_MQTT=mqtt://192.168.56.121:1883 # mqtt2_server FHEM, erweiterter Syntax siehe oben&lt;br /&gt;
  - SONOS_LISTENER_HOST=192.168.56.121 # Docker host IP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sonos2mqtt mit mehr Komfort ===&lt;br /&gt;
Im Wiki Artikel [[Sonos2mqtt]] geht es weiter.&lt;br /&gt;
&lt;br /&gt;
== Owntracks GPS Tracking in FHEM über MQTT - Cloud ==&lt;br /&gt;
Das hier gezeiget Beispiel verwendet eine MQTT Instanz im Internet, die mit einem MQTT2_CLIENT angebunden wird. Da wenig Traffic benötigt wird, genügt z.B. eine kostenfreie Instanz z.B. bei myqtthub (Stand. Dezember 2020)&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man einen MQTT2_SERVER auch direkt verfügbar machen, wenn man sich sicher ist was man da tut! Siehe {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}}. Das Bridge Device wird dabei genau so benötigt, nur der IODev ist dann der MQTT2_SERVER.&lt;br /&gt;
&lt;br /&gt;
=== owntracks auf dem Smartphone konfigurieren ===&lt;br /&gt;
Menü / Einstellung / Verbindung &lt;br /&gt;
&lt;br /&gt;
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):&lt;br /&gt;
* Modus -&amp;gt; MQTT&lt;br /&gt;
* Hostname  -&amp;gt; &lt;br /&gt;
** Hostnamen: host.cloud.com &lt;br /&gt;
** Port: 8883 &lt;br /&gt;
** ClientID: ID vom Provider &lt;br /&gt;
** WebSockets (nicht nutzen)&lt;br /&gt;
* Identifikation -&amp;gt; &lt;br /&gt;
** Benutzername: user-name &lt;br /&gt;
** Passwort: user-password &lt;br /&gt;
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)&lt;br /&gt;
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte)&lt;br /&gt;
* Sicherheit -&amp;gt; &lt;br /&gt;
** TLS aktivieren&lt;br /&gt;
=== Definition in FHEM ===&lt;br /&gt;
Der MQTT2_CLIENT wird so eingerichtet, man braucht eine andere ClientID als auf dem Smartphone! Stimmt alles sollte das Gerät sofort open anzeigen.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MQTT2_CLIENT einrichten, autocreate simpel&lt;br /&gt;
define mqtt2Cloud MQTT2_CLIENT host.cloud.com:8883&lt;br /&gt;
attr mqtt2Cloud SSL 1&lt;br /&gt;
attr mqtt2Cloud autocreate simple&lt;br /&gt;
attr mqtt2Cloud clientId fhem1&lt;br /&gt;
attr mqtt2Cloud room MQTT2_IO&lt;br /&gt;
attr mqtt2Cloud username user-name&lt;br /&gt;
set mqtt2Cloud password user-password&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die automatische Erzeugung der Trackergeräte in FHEM richtig man zuerst ein Bridge Device ein:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define MQTT2_Cloud_bridge MQTT2_DEVICE&lt;br /&gt;
attr MQTT2_Cloud_bridge IODev mqtt2Cloud&lt;br /&gt;
attr MQTT2_Cloud_bridge autocreate 1&lt;br /&gt;
attr MQTT2_Cloud_bridge room MQTT2_DEVICE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dies wird entweder mit dem Template allgemein  konfiguriert&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set MQTT2_Cloud_bridge attrTemplate MQTT2_CLIENT_general_bridge&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;oder manuell nur für owntracks eingerichtet&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr MQTT2_Cloud_bridge bridgeRegexp owntracks/[^/]+/([^/:]+).* &amp;quot;owntracks_$1&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;MQTT2 Geräte für owntracks werden jetzt automatisch mit dem Namen MQTT2_owntracks_&amp;lt;GeräteID&amp;gt; erzeugt. Diese werden einfach mit dem Template owntracks_device fertig konfiguriert. Bei einem IOS Gerät kann man danach noch das Template owntracks_device_IOS als Erweiterung anwenden.&lt;br /&gt;
&lt;br /&gt;
==== Anwesenheitserkennung ====&lt;br /&gt;
Die Anwesenheit kann im owntracks Device direkt für die selbst definierten Plätze abgelesen werden: entweder steht im reading place der jeweilige Ort oder away. Um hier noch eine gewisse Einheitlichkeit in der Verwendung zu bekommen kann man ein PRESENCE Device verwenden: &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define OT_Mi6 PRESENCE event MQTT2_owntracks_mi6:place:.away MQTT2_owntracks_mi6:place:.&amp;lt;Home&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Im Move Modus erfolgt die Erkennung sehr schnell und damit einige Sekunden eher als eine BT Erkennung im Haus - der Akkuverbrauch steigt enorm. Im Significant Modus kann es schon mal ein paar Minuten dauern - ein relevanter Akku Verbrauch ist nicht erkennbar.&lt;br /&gt;
&lt;br /&gt;
== Owntracks GPS Tracking in FHEM direkt an den eigenen Fhem-Server ==&lt;br /&gt;
Dieses Beispiel beschreibt den direkten MQTT2 Zugang wobei das IODev dann der MQTT2_SERVER ist. Hierzu bitte {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}} lesen.&lt;br /&gt;
&lt;br /&gt;
=== SSL - Zertifikate fuer fhem erstellen. ===&lt;br /&gt;
Zunächst erstellen wir fuer den MQTT - Server CA zertifizierte SSL Zertifikate. Diese sind identisch mit den SSL - Zertifikaten, welche man evtl. schon fuer den SSL - Zugang seines FHEMWEB - Device erstellt hat. &lt;br /&gt;
&lt;br /&gt;
Hat man den FHEMWEB schon mit eiem SSL Zertifikat (http&#039;&#039;&#039;&amp;lt;u&amp;gt;s&amp;lt;/u&amp;gt;&#039;&#039;&#039;://) abgesichert, muss man daraus nur noch den .p12 - Container erstellen. &lt;br /&gt;
&lt;br /&gt;
Hat man den FHEMWEB noch nicht abgesichert (http://), dann wir es höchste Zeit! &lt;br /&gt;
&lt;br /&gt;
Für die Erstellung dieser SSL Zertifikate folgt dem Wiki-Beitrag [[FHEM mit HTTPS SSL-Zertifikat und eine eigene Zertifizierungsstelle]]. &lt;br /&gt;
&lt;br /&gt;
Die darin beschriebenen Dateien, das cacert.pem sowie den server.p12 - Container müsst ihr nun an euer Mobiltelefon senden.&lt;br /&gt;
&lt;br /&gt;
=== Definition in FHEM ===&lt;br /&gt;
Der MQTT2_Server wird wie folgt eingerichtet.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define myMQTT2Server_extern MQTT2_SERVER IPV6:1884 global&lt;br /&gt;
attr MQTTBroker_extern SSL 1&lt;br /&gt;
attr MQTTBroker_extern autocreate complex&lt;br /&gt;
attr MQTTBroker_extern event-on-change-reading .*&lt;br /&gt;
attr MQTTBroker_extern group MQTT2&lt;br /&gt;
attr MQTTBroker_extern icon mqtt_broker&lt;br /&gt;
attr MQTTBroker_extern room MQTT2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der MQTT2_Server wird zusätzlich über &amp;quot;allowed&amp;quot; abgesichert:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define allowed_MQTT2Server_extern allowed&lt;br /&gt;
attr allowed_MQTT2Server_extern DbLogExclude .*&lt;br /&gt;
attr allowed_MQTT2Server_extern group MQTT2&lt;br /&gt;
attr allowed_MQTT2Server_extern room  MQTT2&lt;br /&gt;
attr allowed_MQTT2Server_extern validFor myMQTT2Server_extern&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Jetzt vergeben wir noch einen Usernamen und ein Passwort für dieses &amp;quot;allowed&amp;quot; - Device&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set allowed_MQTT2Server_extern basicAuth MyMQTT2Username MyMQTT2Password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Denkt bitte daran einen eigenen Usernamen und ein eigenes langes, kompliziertes Passwort zu verwenden. Vorsicht bei Sonderzeichen!&lt;br /&gt;
&lt;br /&gt;
=== Port-Freigaben im Router ===&lt;br /&gt;
An dieser Stelle müssen wir den Port 1884 in den Internet - Freigaben eures Routers freigeben.&lt;br /&gt;
&lt;br /&gt;
Bei der Fritz!Box wird dies beispielsweise unter Internet -&amp;gt; Freigaben -&amp;gt; Port-Freigaben gemacht. Die Details hierzu entnehmt bitte der Bedienungsanleitung eures Routers.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist dabei, das ihr das Protokol &amp;quot;TCP&amp;quot; verwendet und der Port 1884 extern nach Port 1884 intern an die IP - Adresse des jeweiligen fhem-Servers übermittelt wird.&lt;br /&gt;
&lt;br /&gt;
=== owntracks auf dem Smartphone konfigurieren ===&lt;br /&gt;
Menü / Einstellung / Verbindung &lt;br /&gt;
&lt;br /&gt;
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):&lt;br /&gt;
* Modus -&amp;gt; MQTT&lt;br /&gt;
* Hostname  -&amp;gt; &lt;br /&gt;
** Hostnamen: subdomain.dyndns.com &lt;br /&gt;
** Port: 1884 &lt;br /&gt;
** ClientID: Vorname_Nachname &lt;br /&gt;
** WebSockets (nicht nutzen)&lt;br /&gt;
* Identifikation -&amp;gt; &lt;br /&gt;
** Benutzername: MyMQTT2Username &lt;br /&gt;
** Passwort: MyMQTT2Password &lt;br /&gt;
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)&lt;br /&gt;
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte. Empfehlung: Die Initialien verwenden.)&lt;br /&gt;
* Sicherheit -&amp;gt; &lt;br /&gt;
** TLS aktivieren&lt;br /&gt;
** CA-Zertifikat: cacert.pem&lt;br /&gt;
** Client-Zertifikat: server.p12&lt;br /&gt;
** Passwort fuer Client-Zertifikat: Passwort für den server.p12 - Container&lt;br /&gt;
&lt;br /&gt;
Wenn alles richtig gemacht wurde, dann erstellt das myMQTT2Server_extern - Device automatisch ein neues Device für jede owntracks-App, die sich an dem myMQTT2Server_extern - Device meldet.&lt;br /&gt;
&lt;br /&gt;
Übrigens: Will man seine gesamte Familie ebenfalls über owntracks tracken, so muss man in den jeweiligen APPs nur die Werte für ClientID, GeräteID und TrackerID individuell gestalten. &lt;br /&gt;
&lt;br /&gt;
An den fhem- Einstellungen müssen keine weiteren Änderungen vorgenommen werden.&lt;br /&gt;
== Allgemeine Hinweise ==&lt;br /&gt;
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===&lt;br /&gt;
Nutzt man das rawEvents-Attribut am MQTT2-IO&amp;lt;ref&amp;gt;z.B. &amp;lt;code&amp;gt;attr MQTT2_FHEM_Server rawEvents .*&amp;lt;/code&amp;gt;, der regex-Filter kann wie üblich angepasst werden&amp;lt;/ref&amp;gt;, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.&lt;br /&gt;
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit &amp;lt;code&amp;gt;attr mqtt2_server verbose 5&amp;lt;/code&amp;gt; auch alles ins FHEM-Log schreiben lassen.&lt;br /&gt;
&lt;br /&gt;
=== autocreate funktioniert anscheinend nicht? ===&lt;br /&gt;
In der Regel wird bei neu eingehenden MQTT-Messages über &#039;&#039;autocreate&#039;&#039; ein neues Device erstellt, wenn Nachrichten von einem bisher unbekannten Gerät kommen. Geschieht dies nicht, sollten folgende Punkte geprüft werden:&lt;br /&gt;
# (nur bei MQTT2_SERVER:) Der Client muss eine ClientID angeben, diese darf nicht den defaults von &#039;&#039;mosquito_sub&#039;&#039; entsprechen.&lt;br /&gt;
# Ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) muss vorhanden und aktiv sein.&lt;br /&gt;
# &#039;&#039;autocreate&#039;&#039; am IO muss eingeschaltet sein, was für MQTT2_SERVER bedeutet, dass es nicht auf &amp;quot;0&amp;quot; stehen darf (hier ist dann &#039;&#039;simple&#039;&#039; die aktive Voreinstellung), für MQTT2_CLIENT sollte ebenfalls &#039;&#039;simple&#039;&#039; verwendet werden; dies muss hier allerdings explizit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Wird dann immer noch kein Device erstellt, gibt es in aller Regel ein Device, das bereits einen entsprechenden Eintrag in der readingList enthält, oder es sind keine Nachrichten eingegangen. Überprüfen Sie daher dann ggf. die Einstellungen am Client-Gerät (z.B. im Web-Interface des Shelly oder Tasmota-geflashten ESP8266).&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;autocreate&#039;&#039; am Device schließlich bestimmt, ob die &#039;&#039;readingsList&#039;&#039; erweitert werden darf, wenn Informationen über bisher nicht über die readingList abgedeckte Topics empfangen werden und vom MQTT2-IO als zu diesem Device/ClientID gehörend identifiziert wurden.&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Die per attrTemplate jeweils erzeugten Konfigurationen sind Einrichtungsbeispiele, die v.a. eine in sich konsistenze Zusammenstellung der verschiedenen Attribute enthalten. Es steht jedem User frei, diese Ausgangsbasis dann nach seinem Belieben zu ändern. Spätere Änderungen des verwendeten attrTemplate wirken sich nicht automatisch auf die durch frühere Versionen oder den User nachkonfigurierte Geräte aus! Da es vorkommen kann, dass sich die per MQTT übermittelten Daten und Topics ändern, wenn z.B. eine firmware aktualisiert wurden, kann dies Anpassungen am jeweiligen Template erforderlich machen. Grundsätzlich sollen die per attrTemplate für MQTT2_DEVICE verfügbaren attrTemplate jeweils für die aktuellste verfügbare stabile firmware-Version passen.}}&lt;br /&gt;
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; genutzt werden. &lt;br /&gt;
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate: Es werden nicht alle templates angezeigt ===&lt;br /&gt;
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate und Sprachsteuerung ===&lt;br /&gt;
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; dem betreffenden Hauptartikel zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
=== bridgeRegexp ===&lt;br /&gt;
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch &#039;&#039;&#039;&#039;&#039;einem&#039;&#039;&#039;&#039;&#039; &#039;&#039;MQTT2_DEVICE&#039;&#039; zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. In dem nebenstehenden Schaubild wären dies die Geräte &#039;&#039;A&#039;&#039; bis &#039;&#039;D&#039;&#039;. Das &#039;&#039;&#039;Attribut&#039;&#039;&#039; &#039;&#039;bridgeRegexp&#039;&#039; kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem &#039;&#039;&#039;anderen Device&#039;&#039;&#039; (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als &#039;&#039;newClientId&#039;&#039; hinterlegte Angabe verwendet. In nebenstehendem Schaubild ist dies exemplarisch für die Gerätegruppe &#039;&#039;D&#039;&#039; mit dem &#039;&#039;bridge&#039;&#039;-Device &#039;&#039;D&#039;&#039; und dessen &#039;&#039;Satelliten&#039;&#039; &#039;&#039;D1&#039;&#039; bis &#039;&#039;D4&#039;&#039; dargestellt.&lt;br /&gt;
Dementsprechend sind in den hier aufgeführten Beispielen &#039;&#039;bridgeRegexp&#039;&#039;-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren, wie z.B. für über hier dargestellten &#039;&#039;zigbee2mqtt&#039;&#039; oder &#039;&#039;zigbee2tasmota&#039;&#039;. Ein Sonderfall hierbei ist das template &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem &#039;&#039;mosquitto&#039;&#039;-Server und würden sonst alle ein und demselben MQTT2_DEVICE zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Ständig neue Devices? ===&lt;br /&gt;
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:&lt;br /&gt;
==== Vergabe einer ClientID ====&lt;br /&gt;
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). &lt;br /&gt;
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID&#039;s. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.&lt;br /&gt;
&lt;br /&gt;
==== Löschen der ClientID aus der readingList usw. ====&lt;br /&gt;
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den &#039;&#039;default&#039;&#039; &amp;quot;sonoff&amp;quot; zu ändern).&lt;br /&gt;
Beispielsweise wäre &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt; zu ändern in &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt;&lt;br /&gt;
Die über &#039;&#039;attrTemplate&#039;&#039; verfügbaren Konfigurationen verwenden in der Regel keine ClientID&#039;s bzw. entfernen diese.&lt;br /&gt;
&lt;br /&gt;
=== Wildcards in readingList und setList ===&lt;br /&gt;
Auch in readingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;readingList&#039;&#039; werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise durch einen &amp;quot;/&amp;quot;) kann man so schreiben: &amp;quot;[^/]+&amp;quot; (entspricht: &amp;quot;Mindestens ein Zeichen, das kein Schrägstrich ist&amp;quot;). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;setList&#039;&#039; gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht &amp;quot;+&amp;quot; für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es &amp;quot;Gruppen-Topics&amp;quot;, auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.&lt;br /&gt;
&lt;br /&gt;
=== Die JSON-Daten sollen ausnahmsweise nicht ausgepackt werden ===&lt;br /&gt;
In manchen Fällen ist das automatische Auspacken der JSON-Payload nicht erwünscht. In diesen Fällen kann man einfach den gewünschten Reading-Namen in die readingList eintragen, statt der Anweisung, den JSON an json2NameValue() zu übergeben. Aus&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* { json2nameValue($EVENT) }\&lt;br /&gt;
owntracks/clouduser/mi6/waypoints:.* { json2nameValue($EVENT) }\&lt;br /&gt;
owntracks/clouduser/mi6/event:.* { json2nameValue($EVENT) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
wird dann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* json_mi6\&lt;br /&gt;
owntracks/clouduser/mi6/waypoints:.* json_waypoints\&lt;br /&gt;
owntracks/clouduser/mi6/event:.* json_event&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erforderlichenfalls kann man die Einträge auch doppelt erstellen, um sowohl den JSON wie auch die ausgepackten Readings zu erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Die JSON-Daten vor dem auspacken manipulieren ===&lt;br /&gt;
Aus diversen Gründen kann es zweckmäßig sein, einen bestimmten Wert der JSON-Payload zu ignorieren.&lt;br /&gt;
Z.B. sendet ein Client statt eines Messwertes die Info &amp;quot;bad&amp;quot;. Dieser Fehlerwert soll aus der JSON-Payload &amp;quot;ausgefiltert&amp;quot; werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr DEVICE readingList &amp;lt;your topic&amp;gt;:.* { my $rets = json2nameValue($EVENT,&#039;&#039;,$JSONMAP);; my %cleaned = map { $_,$rets-&amp;gt;{$_} } grep { &#039;bad&#039; ne $rets-&amp;gt;{$_} } keys %{$rets};; return \%cleaned }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Numerische Werte zuvor runden :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr DEVICE readingList &amp;lt;your topic&amp;gt;:.* { my $h=json2nameValue($EVENT,&#039;XXX&#039;);; map { $h-&amp;gt;{$_}=round($h-&amp;gt;{$_}) if(looks_like_number($h-&amp;gt;{$_})) } keys %{$h};; $h }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Einfache Payload ====&lt;br /&gt;
Einen Wert mappen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr DEVICE readingList &amp;lt;your topic&amp;gt;:.* {my %map=(0=&amp;gt;&#039;SofortLaden&#039;,1=&amp;gt;&#039;MinPV&#039;,2=&amp;gt;&#039;NurPV&#039;,3=&amp;gt;&#039;Stop&#039;,4=&amp;gt;&#039;Standby&#039;);; return {ChargeMode=&amp;gt;$h{$EVENT}||$EVENT}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unnötige Konfigurationsinformationen verwerfen ===&lt;br /&gt;
Siehe Einleitung und den [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp-Abschnitt zu MQTT2_CLIENT]].&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Themen ===&lt;br /&gt;
==== Verbinden mehrerer FHEM-Instanzen über MQTT ====&lt;br /&gt;
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeugen kann. So kann man z.B. Messdaten eines Systems über ein &#039;&#039;notify&#039;&#039; iVm. einer einfachen &#039;&#039;publish&#039;&#039;-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.&lt;br /&gt;
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten &#039;&#039;bridgeRegexp&#039;&#039; automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:&lt;br /&gt;
 attr MQTT2_myMqttServer bridgeRegexp \&lt;br /&gt;
   SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* &amp;quot;mgb2_$1&amp;quot;&lt;br /&gt;
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema &#039;&#039;SmartHome/MqttGenericBridge2/&amp;lt;Device-Name&amp;gt;/&amp;lt;Reading-Name&amp;gt;&#039;&#039; versendet.&lt;br /&gt;
&lt;br /&gt;
==== Umstellung von MQTT_DEVICE (und Derivaten wie XiaomiMQTTDevice) zu MQTT2_DEVICE ====&lt;br /&gt;
Wer beabsichtigt, von der Implementierung MQTT+MQTT_DEVICE zu MQTT2-IO und MQTT2_DEVICE zu wechseln, sollte einige Punkte beachten. Viele diesbezügliche Fragen sind vor allem in  {{Link2Forum|Topic=103762|LinkText=diesem Foren-Thread}}&lt;br /&gt;
&lt;br /&gt;
näher erläutert.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}&lt;br /&gt;
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}&lt;br /&gt;
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}&lt;br /&gt;
* {{Link2Forum|Topic=116162|LinkText=Der MQTT-Workshop für MQTT2-Module}}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Trick_der_Woche&amp;diff=40324</id>
		<title>Trick der Woche</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Trick_der_Woche&amp;diff=40324"/>
		<updated>2025-08-18T11:13:03Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* FTUI(3) Dateien direkt in FHEMWEB bearbeiten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite enthält Tipps und Tricks, die zu unbedeutend sind, einen eigenen Artikel zu rechtfertigen, alternative Schreibweisen/Lösungen für eine Problem darstellen, Ungenauigkeiten oder unklare Formulierungen in den offiziellen Dokumenten ergänzen und ähnliches. Jeder Eintrag ist typischerweise sehr kurz (wenige Zeilen lang) und beleuchtet vielleicht nur einen Aspekt von FHEM, er kann allgemeiner Natur sein, oder sich auf ein spezielles Gerät oder einen speziellen Anwendungsfall beziehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== August 2025==&lt;br /&gt;
=== FTUI(3) Dateien direkt in FHEMWEB bearbeiten ===&lt;br /&gt;
Im Attribut editFileList der [https://fhem.de/commandref_modular.html#FHEMWEB FHEMWEB]-Definition &#039;&#039;&#039;zusätzlich zu den Default-Werten&#039;&#039;&#039; eintragen:&lt;br /&gt;
 FTUI (www/tablet):$FW_dir.&#039;/tablet&#039;:^.*html$&lt;br /&gt;
 FTUI3 (www/ftui)&amp;lt;code&amp;gt;:$FW_dir.&#039;/tablet&#039;:^.*\.(html|htm|js|css)$&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== August 2022==&lt;br /&gt;
=== Update ===&lt;br /&gt;
Wenn der Befehl &amp;quot;Update&amp;quot; nicht funktioniert und insbesondere die Fehlermeldung &#039;&#039;Bad hostname &#039;fhem.de:80&#039;&#039;&#039; zurück gibt, kann es sinnvoll sein, den Parameter  -noSSL zu versuchen. Details dazu im Artikel [[Update]]&lt;br /&gt;
&lt;br /&gt;
== Januar 2022==&lt;br /&gt;
=== günstiger Luftfeuchtesensor ===&lt;br /&gt;
Der [[HM-CC-TC Funk-Wandthermostat]] ist schon lange abgekündigt. Er wird derzeit oft recht günstig im Netz angeboten und eignet sich daher als billiger &amp;quot;StandAlone&amp;quot; Temperatur- und Luftfeuchtesensor, auch wenn er keinen Ventielantrieb steuern soll.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2020 ==&lt;br /&gt;
=== Performance von Notifys ===&lt;br /&gt;
Im Tipp vom Dezember 2013 [[Trick der Woche#notify durch mehrere Ereignisse auslösen lassen|notify durch mehrere Ereignisse auslösen lassen]] heisst es:&lt;br /&gt;
:&#039;&#039;[…] Wenn man aber möchte, dass z.B. &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; auslöst (um etwa Dim-Befehle auszuschliessen), kann dies wie folgt erreicht werden:&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:(on|off) …&amp;lt;/code&amp;gt;&lt;br /&gt;
Performanter ist allerdings:&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:o[nf]+  …&amp;lt;/code&amp;gt;&lt;br /&gt;
wobei &#039;&#039;&#039;o[nf]+&#039;&#039;&#039; eine &amp;quot;Regexp&amp;quot; für beliebige Zeichenketten ist, die mit &#039;&#039;&#039;o&#039;&#039;&#039; anfangen und &#039;&#039;&#039;n&#039;&#039;&#039; und/oder &#039;&#039;&#039;f&#039;&#039;&#039; enthalten, also (auch) on und off.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch:&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on|MeinSchalter:off … &amp;lt;/code&amp;gt;&lt;br /&gt;
verwendet werden.&lt;br /&gt;
Die letzten beiden Varianten sparen Ausführungszeit. Ganz allgemein ist es besser, im notify das Suchmuster mit einem [[Regulärer Ausdruck|regulären Ausdruck]] (Regexp) eng zu definieren.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on ... &amp;lt;/code&amp;gt;&lt;br /&gt;
ist performanter als&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter { if ($EVENT eq &amp;quot;on&amp;quot; ... &amp;lt;/code&amp;gt;&lt;br /&gt;
auch wenn das Ergebnis gleich ist.&lt;br /&gt;
&lt;br /&gt;
Allerdings ist &lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on ... &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas1 notify MeinSchalter:off ... &amp;lt;/code&amp;gt;&lt;br /&gt;
langsamer als&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchaltero[nf]+ { if ($EVENT eq &amp;quot;on&amp;quot;  ) { fhem( ) } else { fhem(&amp;quot;... &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die oben erwähnten &amp;quot;if&amp;quot; sind &amp;quot;perl if&amp;quot;s. Die Verwendung des FHEM Modul DOIF ist deutlich langsamer.  Die Betrachtung betrifft sowieso nur langsame Host-Systeme mit gleichzeitig vielen defines. Bei Verwendung z.b. einen Raspberry Pi 4 oder schnellerem Host dürften die Unterschiede vernachlässigbar sein.&lt;br /&gt;
&lt;br /&gt;
== Oktober 2020 ==&lt;br /&gt;
=== Entprellen ===&lt;br /&gt;
Will man ein notify innerhalb eines bestimmten Zeitraumes nur einmal auslösen lassen, auch wenn er in diesem Zeitraum mehrfach getriggered werden sollte, so bietet sich das [[Attribut]] &#039;&#039;&#039;disabledAfterTrigger&#039;&#039;&#039; an:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;notify_device&amp;gt; disabledAfterTrigger &amp;lt;Anzahl Sekunden&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Oktober 2019 ==&lt;br /&gt;
=== Funkstörungen durch leere Batterien ===&lt;br /&gt;
Unerklärliche Funkstörungen besonders im SlowRF Bereich (z.b. FS20) mit stark verminderter Reichweite von CULs, gestörter [[RFR CUL]] Kommunikation etc. gestörtem Empfang von Funktelegrammen aller Art können ihre Ursache darin haben, dass einige Geräte mit (fast) leeren Batterien unkontrolliert senden und dadurch den Kanal mit Störsignalen verschmutzen. Anfällig sind insbesondere ältere FHT Fenstersensoren wie der [[FHT80TF]], die mit fast leeren Batterien eine Art Rauschen aussenden und damit die &#039;&#039;&#039;komplette&#039;&#039;&#039; FS20 Kommunikation lahmlegen können, Störungen beeinflussen auch andere Funkprotokolle im selben Frequenzbereich, wie z.b. HM.&lt;br /&gt;
Also im Falle unerklärlicher und weitreicher Funkstörungen die Batterien aller Geräte überprüfen.&lt;br /&gt;
&lt;br /&gt;
== Februar 2019 ==&lt;br /&gt;
=== Unterräume anlegen ===&lt;br /&gt;
[[Datei:Unterraeume.png|350px|thumb|right|Beispiel für einen gegliederten Raum &amp;quot;Steuerung&amp;quot;]]&lt;br /&gt;
In [[FHEMWEB]] besteht neben der Möglichkeit, Geräte dadurch übersichtlich anzuordnen, indem diese Gruppen und einfachen Räumen zugeordnet werden, auch die Möglichkeit, Räume weiter zu gliedern und Unterräume zu verwenden. Dazu wird nach der Angabe des Hauptraums der Unterraum, getrennt durch ein &amp;quot;-&amp;gt;&amp;quot; angegeben. Beispiele:&lt;br /&gt;
 attr &amp;lt;DEVICENAME&amp;gt; room Steuerung-&amp;gt;Logik&lt;br /&gt;
 attr &amp;lt;DEVICENAME&amp;gt; room Steuerung-&amp;gt;Heizung&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Legt man zusätzlich einen Raum &#039;&#039;Steuerung&#039;&#039; an, erscheint dieser als zusätzlicher Eintrag in der Raumliste.&lt;br /&gt;
&lt;br /&gt;
== Januar 2019 ==&lt;br /&gt;
=== HomeMatic IP ===&lt;br /&gt;
Das [[HomeMatic IP]]-Protokoll unterscheidet sich deutlich vom bisherigen HomeMatic Protokoll, im Grunde ist es ein anderes System, das nur dem Namen nach dem älteren HomeMatic gleicht. HM-IP Geräte können aktuell (Anfang 2019) nur über eine systemeigene Zentrale CCU2 (als physisch vorhandenes Interface) und die HomeMatic-Module in FHEM integriert werden, sind in FHEM jedoch &#039;&#039;&#039;nicht&#039;&#039;&#039; unmittelbar als Homematic-Geräte ansprechbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dezember 2018 ==&lt;br /&gt;
===HomeMatic Heizungsregler Uhrzeit einstellen===&lt;br /&gt;
HomeMatic Thermostate / Heizungsregler  wie der HM-CC-TC der der HM-TC-IT-WM-W-EU etc. synchronisieren ihre Uhrzeit täglich etwa gegen Mitternacht mit der Zentrale. Man kann dieses Update aber jederzeit erzingen durch den Befehl  &lt;br /&gt;
 set &amp;lt;DEVICENAME&amp;gt; sysTime&lt;br /&gt;
&lt;br /&gt;
== November 2018 ==&lt;br /&gt;
===HomeMatic Heizunggeräte gebraucht gekauft===&lt;br /&gt;
HomeMatic Heizunggeräte gebraucht gekauft und jetzt lassen sie sich nicht richtig peeren oder pairen?&lt;br /&gt;
Das Problem ist meistens, dass die Geräte noch mit der Zentrale des Verkäufers gepairt oder mit anderen Geräten gepeert sind. &lt;br /&gt;
Mit Thermostaten wie der [[HM-CC-TC Funk-Wandthermostat]] oder der Nachfolger [[HM-TC-IT-WM-W-EU Funk-Wandthermostat AP]] können mit Ventilantrieben wie dem [[HM-CC-VD Funk-Stellantrieb]] nur gepeert werden, wenn &lt;br /&gt;
* die Thermostaten nicht selbst schon mit einer Zentrale (im FHEM Umfeld also z.b. einer [[Virtueller Controller VCCU]] oder [[HM-[[HM-CFG-LAN LAN Konfigurations-Adapter]] oder ähnliches) gepairt wurden&lt;br /&gt;
* die Ventilantriebe nicht selbst mit einer Zentrale gepairt oder mit einem Thermostaten gepeert wurden.&lt;br /&gt;
&lt;br /&gt;
Es ist daher sinnvoll zuerst alle Geräte zurückzusetzen, da viele Verkäufer dies vergessen. Wie das geht steht in der Anleitung.&lt;br /&gt;
Beispiele:&lt;br /&gt;
* HM-CC-TC -&amp;gt; MENU lange drücken, dann Sonderfunktion &amp;quot;RES&amp;quot; anwählen, mit OK-Taste bestätigen&lt;br /&gt;
* HM-CC-VD -&amp;gt; Anlernknopf 10 Sekunden lang drücken. Der Antrieb geht in Zustand A2, nachdem er das Ventil 1x auf- und zugefahren hat geht er in A3, Knopf nochmals drücken.&lt;br /&gt;
* HM-TC-IT-WM-W-EU -&amp;gt; Batterien entfernen, alle 3 Tasten gedrückt halten, Batterien einlegen, warten bis &amp;quot;rES&amp;quot; im Display erscheint, Tasten loslassen&lt;br /&gt;
&lt;br /&gt;
== Januar 2018 ==&lt;br /&gt;
=== at absolutem Datum ===&lt;br /&gt;
Vielen ist nicht klar, dass man mit dem &amp;quot;define … at&amp;quot; auch einfach ein absolutes Datum definieren kann (obwohl es in der Commandref steht). Anstatt umfangreicher DOIF Konstrukte oder &amp;quot;define … at&amp;quot; die täglich ablaufen und testen ob der gewünschte Tag schon erreicht ist, geht auch ein einfaches:&lt;br /&gt;
&lt;br /&gt;
 define Licht_Neujahr_2019 at 2019-01-03T06:01:01 set Licht1 on&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Allgemein: &lt;br /&gt;
 define &amp;lt;name&amp;gt; at [&amp;lt;datespec&amp;gt;] &amp;lt;command&amp;gt; &lt;br /&gt;
wobei &amp;lt;datespec&amp;gt; =  (YYYY-MM-DDTHH:MM:SS) (also in ISO8601 Schreibweise).&lt;br /&gt;
Wichtig ist die Angabe mit Sekunden, die nicht weggelassen werden können.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2017 ==&lt;br /&gt;
=== perl Version ===&lt;br /&gt;
Gelegentlich taucht die Frage auf, welche perl Version zum Betrieb von FHEM minimal erforderlich ist. Bedauerlicherweise lässt sich das aber aktuell nicht definitiv bestimmen.&lt;br /&gt;
Rudolf König testet zur Zeit (Ende 2017) mit v5.16 (5 Jahre alt) und v5.24 (ca. 1 Jahr alt). &lt;br /&gt;
Sollte sich herausstellen, dass eines seiner Module (vor allem fhem.pl selbst) nicht mit der jeweils &#039;&#039;aktuellen&#039;&#039; perl Version funktioniert, so wird das Modul entsprechend kompatibel gemacht.&lt;br /&gt;
Andererseits verwendet Rudolf König nach eigener Aussage (bewusst) keine Features, die eine höhere Version als perl 5.8.3 (immerhin älter als 13 Jahre) voraussetzen. Tatsächlich zeigen aktuelle Installation auf relativ alten BuffaloLinkstation Systemen, dass FEHM mit perl 5.8.3 prinzipiell lauffähig ist.&lt;br /&gt;
&lt;br /&gt;
Rudolf König prüft als Maintainer von fhem.pl aber nicht, welche Mindestversionen andere Entwickler in Ihren Modulen benötigen. Es ist daher möglich oder sogar wahrscheinlich, das einzelne Module höhere Versionen als 5.8.3 benötigen.&lt;br /&gt;
&lt;br /&gt;
Es gibt aktuell keinen Weg, die Mindestanforderungen z.b. automatisiert zu ermitteln.&lt;br /&gt;
&lt;br /&gt;
== November 2017 ==&lt;br /&gt;
=== Grundlastmodul ===&lt;br /&gt;
Mit einem Grundlastmodul ist es möglich, LED Leuchtmittel an einem Schaltaktor / Dimmer zu betreiben. Dies ist bei manchen nicht möglich, da einige LEDs nachglimmen oder flackern. Das Grundlastmodul, welches parallel zum Verbraucher angeschlossen wird, kann diesen Effekt aufheben, da ein Verbraucher mit ohmscher Last simuliert wird.&lt;br /&gt;
Das Modul ermöglicht eventuell auch den Betrieb eines [[RSL 2-Draht Einbauschalter]]s, der bei LED Leuchtmitteln ansonsten nicht eingesetzt werden kann, da zum Betrieb eine Restspannung über den Verbraucher benötigt wird, der bei LED Lampen mit Vorschaltgerät nicht vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
In Frage kommt z.b. ein Eltako ELTA Grundlastelement GLE / PTC, das ca. 5-8 Euro kostet.&lt;br /&gt;
Technisch handelt sich dabei um einen PTC, also einen Widerstand mit positivem Temperaturkoeffizient, d.h. der Widerstand sinkt deutlich, wenn das Element kälter wird. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das genannte Grundlastelement hat folgende Daten: &lt;br /&gt;
 Kaltwiderstand: 3500 Ω&lt;br /&gt;
 Einschaltstrom bei 230 V: 65 mA (ca. 15 W)&lt;br /&gt;
 Verlustleistung nach 60 Sekunden: 0,65 W &lt;br /&gt;
&lt;br /&gt;
Im kalten Zustand lässt der PTC bei 230 Volt einen Strom von ca. 0,065 Ampere zu.  &lt;br /&gt;
Das reicht, um von Schaltaktoren, Freischaltern, Dimmern etc. als die erforderliche Grundlast erkannt zu werden.&lt;br /&gt;
Wird der Stromkreis eingeschaltet, fliesst auch tatsächlich Strom durch den PTC, der sich dadurch schnell erwärmt (das Element wird tatsächlich sogar relativ heiss). Dadurch steigt steigt der Widerstand auf ca 50000-60000 Ohm an und die Verlustleistung sinkt auf unter 1 Watt. Der PTC regelt sich jetzt selber auf eine bestimmte Temperatur und Widerstand ein.&lt;br /&gt;
&lt;br /&gt;
Wird ausgeschaltet, so fliest über den PTC immer noch ein kleiner Reststrom von ca 0,005 Ampere, der als Grundlast reicht, um z.b. Spannungen abzubauen, die LEDs nachflackern lassen, dieser steigt mit Erkalten rasch an, dadurch werden auch Schalter wie die [[RSL 2-Draht Einbauschalter]] mit genug Strom versorgt.&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann also auch ein PTC mit diesen Werten und einer Leistung von ca. 20 Watt selbst gebaut werden, der Preis der Einzelteile liegt bei unter 2 Euro. Das Eltako Element ist bereits mit Isolierung und Anschlussleitungen versehen, mit eigner Arbeitszeit ist der Preisvorteil beim Selberbau also gering.&lt;br /&gt;
&lt;br /&gt;
== Februar 2017 ==&lt;br /&gt;
=== at Zeiten ===&lt;br /&gt;
 at 03:00      -&amp;gt;  1x um 3 Uhr (wann immer das nächste mal 3 Uhr ist, ggf. erst morgen)&lt;br /&gt;
 at *03:00     -&amp;gt;  jeden Tag um 3 Uhr&lt;br /&gt;
 at +03:00     -&amp;gt;  in 3 Stunden&lt;br /&gt;
 at +*03:00    -&amp;gt;  in 3 Stunden und dann alle 3 Stunden erneut&lt;br /&gt;
 at +*{4}03:00 -&amp;gt;  in 3 Stunden und dann alle 3 Stunden erneut, aber nur 4x ausführen.&lt;br /&gt;
&lt;br /&gt;
== Oktober 2016 ==&lt;br /&gt;
=== Grundlagen der Heizungssteuerung ===&lt;br /&gt;
Der Artikel [[Grundlagen der Heizungssteuerung]] soll einen zentralen Einstiegspunkt und eine Übersicht der Möglichkeiten insb. für Neulinge in FHEM bieten.&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung für Geräte ohne Batteriestatus ===&lt;br /&gt;
Es gibt Möglichkeiten um auch bei Geräten ohne Batteriestatus-Reading eine schwache Batterie erkennen zu können: [[Batterie%C3%BCberwachung#Ger.C3.A4te_ohne_Batteriestatus|Geräte ohne Batteriestatus]].&lt;br /&gt;
&lt;br /&gt;
== Mai 2016 ==&lt;br /&gt;
=== DbLog reparieren ===&lt;br /&gt;
Sollte ein fhem mit DbLog Probleme machen, oder auf der SQL-Konsole Fehler werfen, so ist eine Reparatur der DB fällig. Das ist auf der Kommandozeile verhältnismäßig einfach möglich und wird im Kapitel [[DbLog#Datenbank reparieren]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== DbLog bearbeiten ===&lt;br /&gt;
Unerwünschte Einträge in den Loggings treten immer wieder mal auf. Wie man dies in einer Datenbank korrigiert, dazu gibt das Kapitel [[DbLog#Bearbeitung von Datenbank-Einträgen]] eine erste Einführung.&lt;br /&gt;
&lt;br /&gt;
=== Pollenflug ===&lt;br /&gt;
In dieser schönen Jahreszeit werden manche durch Heuschnupfen geplagt. Auf der Seite [[Pollenflug]] wird beschrieben, wie man eine Pollenvorhersage in fhem einbinden kann - hilft zwar nicht gegen das Niesen, ist aber trotzdem ganz informativ... ;-)&lt;br /&gt;
&lt;br /&gt;
== April 2016 ==&lt;br /&gt;
=== HomeMatic und VCCU ===&lt;br /&gt;
HomeMatic Nutzer sollten unbedingt eine [[Virtueller Controller VCCU|VCCU]] einrichten und nutzen.&lt;br /&gt;
Die Einrichtung ist unaufwändig und schafft jede Menge Vorteile, auch beim Einsetzen nur einer Schnittstelle wie z.B. einem [[HM-CFG-LAN LAN Konfigurations-Adapter]]. Auch die nachträglich Einrichtung ist problemlos, sofern vorher nur ein I/O Gerät (&amp;quot;Funkschnittstelle&amp;quot;) verwendet wurde.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2015 ==&lt;br /&gt;
===defmod===&lt;br /&gt;
In vielen Fällen will man mit einer Aktion gleichzeitig eine andere Aktion bereits für später festlegen, z.b. nach Einschalten  einer Heizung durch einen Bewegungsmelder diese eine Stunde später wieder ausschalten.&lt;br /&gt;
&lt;br /&gt;
Dies kann z.B. durch ein Konstrukt dieser Art erledigt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Heizung_an notify Bewegung set HZG_WZ desired-temp 22 ;; define reset_Heizung at +01:00:00 set HZG_WZ desired-temp 16&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nachteilig ist, dass bei einer weiteren Auslösung des Bewegungsmelders die Heizzeit nicht verlängert wird, da eine Neudefinition von &#039;&#039;&#039;reset_Heizung&#039;&#039;&#039; mit der Fehlermeldung &#039;&#039;&#039;reset_Heizung already exists, delete it first&#039;&#039;&#039; quittiert wird. Die Lösung bisher war, das alte &#039;&#039;&#039;reset_Heizung&#039;&#039;&#039; zunächst zu löschen und dann erneut mit neuem Zeitstempel anzulegen:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Heizung_an notify Bewegung set HZG_WZ desired-temp 22 ;; delete reset_Heizung ;; define reset_Heizung at +01:00:00 set HZG_WZ desired-temp 16&amp;lt;/code&amp;gt;&lt;br /&gt;
Aber auch dieses umständliche Konstrukt hat noch einen Nachteil: Es erzeugt bei einer ersten Auslösung eine Fehlermeldung, weil &#039;&#039;&#039;reset_Heizung&#039;&#039;&#039; noch nicht exisitert und daher nicht gelöscht werden kann.  Dies liesse sich abfangen, was die Konstruktion weiter verkomplizieren würde.&lt;br /&gt;
&lt;br /&gt;
Daher hat Rudolf König mit FHEM 5.6 den neuen Befehel &amp;quot;defmod&amp;quot; eingeführt, der ein noch nicht existieredendes define neu anlegt (wie &amp;quot;define&amp;quot;), eine bereits vorhandenes aber direkt ändert (wie &amp;quot;delete&amp;quot; und danach &amp;quot;define&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Dadurch lässt sich verkürzt schreiben:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Heizung_an notify Bewegung set HZG_WZ desired-temp 22 ;; defmod reset_Heizung at +01:00:00 set HZG_WZ desired-temp 16&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== April 2015 ==&lt;br /&gt;
===FS20 Timer===&lt;br /&gt;
FS20 Aktoren beherrschen zwei verschiedene Timer-Methoden.&lt;br /&gt;
&lt;br /&gt;
Angenommen ein FS20 Device heisse &amp;quot;Lampe&amp;quot; und sei z.B. ein [[FS20_SU_Unterputz-Funk-Schalter|FS20 SU]] (Unterputzschalter), dann kann man mit FHEM sowohl &lt;br /&gt;
:&amp;lt;code&amp;gt; set Lampe on-for-timer 30&amp;lt;/code&amp;gt;&lt;br /&gt;
verwenden um die Lampe 30 Sekunden einzuschalten, aber auch zunächst in den FS20 SU die maximale Einschaltdauer einprogrammieren:&lt;br /&gt;
:&amp;lt;code&amp;gt; set Lampe timer 30&amp;lt;/code&amp;gt;&lt;br /&gt;
Dannach wird jedes normale&lt;br /&gt;
:&amp;lt;code&amp;gt; set Lampe on&amp;lt;/code&amp;gt;&lt;br /&gt;
die Lampe für nur 30 Sekunden einschalten.&lt;br /&gt;
&lt;br /&gt;
Als Timerwerte kommen in beiden Fällen die bekannten [[Trick_der_Woche#FS20_Timerzeiten|128 Sekundenwerte]] von 0,25 Sekunden bis Etwa 4,5 Stunden in Frage.&lt;br /&gt;
&lt;br /&gt;
Es ist offenbar nicht bei allen Aktoren möglich einen einmal eingestellten Timer zu löschen, neue Werte eingeben aber sehr wohl.&lt;br /&gt;
&lt;br /&gt;
Mehr hier: [[FS20_Allgemein#Gerätetimer setzen / löschen|FS20 timer]].&lt;br /&gt;
&lt;br /&gt;
== Februar 2015 ==&lt;br /&gt;
=== 1-wire am GPIO4-Port des RaspberryPi funktioniert nicht mehr nach Systemupdate ===&lt;br /&gt;
Es kann passieren, dass nach einem Systemupdate (apt-get update oder apt-get dist-upgrade) die 1-wire-Geräte am GPIO4-Port plötzlich nicht mehr funktionieren. Eine Problemlösung dazu ist im Artikel &amp;quot;[[Raspberry Pi und 1-Wire#1-wire am GPIO4-Port funktioniert nicht mehr nach Systemupdate]]&amp;quot; beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Backup der Konfiguration (fhem.cfg und fhem.state) bei jedem &amp;quot;save&amp;quot; ===&lt;br /&gt;
Der nachfolgende Codeschnipsel erstellt bei jedem &amp;quot;save&amp;quot; eine Kopie der aktuellen [[Konfiguration]] (fhem.cfg und fhem.state) in ein Verzeichnis &amp;quot;backup_cfg-state&amp;quot; welches unter /opt/fhem/ zu finden ist. Somit kann bei einem Fehler jederzeit auf den letzten Stand zurückgegangen werden.&lt;br /&gt;
Zuerst ins FHEM Befehlsfeld den folgenden Befehl eingeben:&lt;br /&gt;
:&amp;lt;code&amp;gt;{ `mkdir backup_cfg-state` } &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach folgendes [[notify]] anlegen:&lt;br /&gt;
 define backupCfg notify global:SAVE {\&lt;br /&gt;
 my $now = TimeNow();; $now =~ s/ /_/g;; \&lt;br /&gt;
 `cp $attr{global}{configfile} ./backup_cfg-state/fhem.cfg.$now`;;\&lt;br /&gt;
 `cp $attr{global}{statefile} ./backup_cfg-state/fhem.state.$now`;;\&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
Quelle: {{Link2Forum|Topic=30873|Message=234412|LinkText=FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
== Januar 2015 ==&lt;br /&gt;
=== CUL &amp;amp; CO über Serial ID-einbinden ===&lt;br /&gt;
Bei mehreren USB-Geräten kann es vorkommen, dass sie vertauscht werden z.B. &#039;&#039;/dev/ttyUSB0&#039;&#039; zu&#039;&#039; /dev/ttyUSB1&#039;&#039; oder &#039;&#039;/dev/ttyACM0&#039;&#039; zu &#039;&#039;/dev/ttyACM1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um dies zu umgehen, kann man sie über ihre Serial-ID in FHEM einbinden.&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl zeigt die Serial-ID:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;ls -l /dev/serial/by-id&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier die Beispielausgabe eines CUL868, JeeLink, RFXtrx und eines CUL433&lt;br /&gt;
&lt;br /&gt;
 user@xxxx:~# ls -l /dev/serial/by-id&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 23:34 usb-busware.de_CUL868-if00 -&amp;gt; ../../ttyACM0&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 13:26 usb-FTDI_FT232R_USB_UART_A901RQ9F-if00-port0-&amp;gt; ../../ttyUSB0&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 13:26 usb-RFXCOM_RFXtrx433_A1WZWL5Y-if00-port0-&amp;gt; ../../ttyUSB1&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 21:29 usb-busware.de_CUL433-if00 -&amp;gt; ../../ttyACM1 &lt;br /&gt;
&lt;br /&gt;
Damit lässt sich folgende Definition erstellen:&lt;br /&gt;
&lt;br /&gt;
z.B. für einen CUL868&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define CUL868 CUL /dev/serial/by-id/usb-busware.de_CUL868-if00@9600 1134&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder einen JeeLink&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define Jeelink JeeLink /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A901RQ9F-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einschränkung:&#039;&#039;&#039; Bei CULs von Busware lassen sich nur CUL433 und CUL868 unterscheiden. Zwei CUL868 haben z.B. immer die gleiche Serial-ID.&lt;br /&gt;
&lt;br /&gt;
=== HM LAN Konfig-Adapter Antenne verbessern===&lt;br /&gt;
Die Antenne des [[HM-CFG-LAN LAN Konfigurations-Adapter]] kann man mit etwas Bastelgeschick verlängern um den Empfang zu verbessern. &lt;br /&gt;
&lt;br /&gt;
Sinnvoll ist die Verlängerung auf 1/2 Lambda  (868MHz = 17,27 cm) oder gar 1 Lambda.&lt;br /&gt;
1 Lambda Antennen haben starke Richtwirkung in Form eines gedachten Zylinders, dessen Mittelachse die Antenne ist.&lt;br /&gt;
D.h., Alles was sich in Richtung des Anfangs und des Endes des Antennedrahtes befindet, hat schlechteren Empfang als mit einer kurzen Antenne. Daher muss man die Antenne ggf. genauer ausrichten.&lt;br /&gt;
&lt;br /&gt;
Anleitungen dazu werden an verschiedenen Stellen veröffentlicht, z.B. in &lt;br /&gt;
[http://www.ip-symcon.de/forum/threads/18411-Umbau-HM-LAN-Adapter-auf-Lambda-1-2-Dipol-Antenne diesem Beitrag] im IP-Symcon Forum (anders als der Namen der Anleitung vermuten lässt, liegt hier kein Dipol vor, sondern eine &amp;quot;normale&amp;quot; 1 Lambda Antenne.)&lt;br /&gt;
&lt;br /&gt;
Prinzipiell so dünnen Draht wie möglich verwenden.&lt;br /&gt;
&lt;br /&gt;
Wer noch mehr rausholen will, kann auch zusätzlichen Aufwand betreiben und die Antenne etwas von der Elektronik entfernen, die nämlich Störstrahlung in die Antenne einkoppelt. Oder eine Groundplane bauen.&lt;br /&gt;
Ein Anleitung für die CCU (analog auch für den HM LAN Konfig-Adapter einsetzbar) gibt es [http://www.techwriter.de/beispiel/funkeige.htm hier].&lt;br /&gt;
&lt;br /&gt;
== Dezember 2014 ==&lt;br /&gt;
=== FHT80TF als &amp;quot;Prüfsender&amp;quot; einsetzen  ===&lt;br /&gt;
Da der [[FHT80TF-2]] günstig ist und seinen Zustand ca. alle zwei Minuten sendet, kann er gut zum Ermitteln der Funklage von [[SlowRF]] Komponenten genutzt werden, auch wenn diese nicht senden. Den RSSI einer FS20 Schaltsteckdose kann man z.B. nicht wissen, da die Dose nur ein Empfänger ist. Wenn eine Dose nicht gut funktioniert und man den Verdacht hat, dass sie funktechnisch ungünstig liegt, kann man einen [[FHT80TF-2]] neben die Steckdose legen und man bekommt nach zwei Minuten einen Wert, der (trotz umgekehrter Funkrichtung) gut genug ist, um einem Hinweise zu geben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== November 2014 ==&lt;br /&gt;
=== FS20 Adressschema und die Rolle des Hauscodes  ===&lt;br /&gt;
[[FS20_Allgemein#FS20_Adressierungsschema_.28Vorschlag.29]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Oktober 2014 ==&lt;br /&gt;
=== Aktor für Wanddosen ohne Nulleiter  ===&lt;br /&gt;
Es gibt viele Aktoren die man in Einbaudosen hinter Schaltern einbauen kann. Oft scheitert deren Nutzung aber daran, dass in vielen Elektroinstalltionen in der Einbaudose eines (Licht)schalters kein Neutralleiter (Nulleiter) verlegt ist, den die meisten Aktoren zur eigenen Stromversorgung brauchen. Hier kann der [[RSL 2-Draht Einbauschalter]] helfen, der auch ohne Neutraleiter funktioniert und kompatibel zu InterTechno ist. Er lässt sich z.B. mit einem CUL(433) schalten. Problematisch ist damit allerdings das Schalten von LED Lampen.&lt;br /&gt;
&lt;br /&gt;
== August 2014 ==&lt;br /&gt;
=== Perl-Skripte Online testen  ===&lt;br /&gt;
Im Internet existieren Webseiten auf denen man Perl-Code online testen kann. Beispielsweise auf [http://www.tutorialspoint.com/execute_perl_online.php codingground] kann man Code zum Testen eingeben und die Auswirkungen betrachten. Dies eignet sich zur schnellen Fehleranalyse oder um Perl zu lernen. Natürlich lassen sich keine FHEM-Besonderheiten nutzen.&lt;br /&gt;
&lt;br /&gt;
== Juli 2014 ==&lt;br /&gt;
=== Funklast reduzieren===&lt;br /&gt;
Bewegungsmelder erzeugen in der Regel eine recht hohe Funklast, wenn sie oft ausgelöst werden, also z.B. Licht in einem Zimmer schalten sollen.&lt;br /&gt;
&lt;br /&gt;
Konstruktionen der Art:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* set Licht_Flur on-for-timer 256&amp;lt;/code&amp;gt;&lt;br /&gt;
haben daher den Nachteil bei viel Bewegung im Flur und je nach Einstellung des Sendeabstandes des Bewegungsmelders mindestens alle 120 Sekunde oder öfter ein &lt;br /&gt;
:&amp;lt;code&amp;gt;on-for-timer 256&amp;lt;/code&amp;gt;&lt;br /&gt;
zu senden. Das erzeugt eine hohe Funklast, speziell wenn der Aktor ein SlowRF Gerät ist (z.B. FS20 Unterputzschalter).&lt;br /&gt;
In solchen Fällen kann es helfen, nur dann einen Befehl zu senden, wenn das Licht nicht schon an ist:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* { if (Value(&amp;quot;Licht_Flur&amp;quot;) eq &amp;quot;off&amp;quot;) { fhem (&amp;quot;set Licht_Flur1 on-for-timer 256&amp;quot;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
Nachteilig ist aber, dass eine Auslösung innerhalb 256 Sekunden die Einschaltzeit nicht verlängert. Dies kann man umgehen, indem man nicht on-for-timer verwendet, sondern den Aktor selber verzögert auschaltet und bei weiteren Auslösungen nur die Verzögerung erneut anlegt:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* { if (Value(&amp;quot;Licht_Flur1&amp;quot;) eq &amp;quot;off&amp;quot;) { fhem (&amp;quot;set Licht_Flur on ;; define FlurLicht_aus at +00:04:16 set Licht_Flur off&amp;quot;) } else { fhem (&amp;quot;delete FlurLicht_aus ;; define FlurLicht_aus at +00:04:16 set Licht_Flur off&amp;quot;) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
Durch den relativ neuen Befehl &amp;quot;defmod&amp;quot; kann ausserdem das Löschen und neu Anlegen zusammengefasst werden, sieh Tipp Dezember 2015&lt;br /&gt;
&lt;br /&gt;
== Juni 2014 ==&lt;br /&gt;
=== Batteriestatus bei HomeMatic Devices aktivieren===&lt;br /&gt;
Zumindest einige (wenn nicht alle) batteriegespeisten HM-Geräte können Batteriemeldungen senden, tun dies in der normalen Konfiguration aber nicht.&lt;br /&gt;
Dazu muss das Register cyclicInfoMsg auf on gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
Wie man das macht steht z.B. hier&lt;br /&gt;
[[HM-SEC-SC_Tür-Fensterkontakt#Batteriestatus_aktivieren]]&lt;br /&gt;
und hier&lt;br /&gt;
[[HomeMatic_Type_ThreeState]]&lt;br /&gt;
&lt;br /&gt;
== Mai 2014 ==&lt;br /&gt;
=== Dummywert mit aktueller Uhrzeit versehen in anderen Dummy kopieren===&lt;br /&gt;
Der Inhalt von Dummy1 soll erweitert um  Uhrzeit und Datum in Dummy2 kopiert werden (z.B. um die Urzeit der letzten Auslösung einer Alarmanlage anzuzeigen)&lt;br /&gt;
:&amp;lt;code&amp;gt;{ fhem(&amp;quot;set dummy2 &amp;quot; . (Value(&amp;quot;Dummy1&amp;quot;).&amp;quot; &amp;quot;.TimeNow()) )  } &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zwei Dummywerte in einen anderen Dummy kopieren ===&lt;br /&gt;
Der String in Dummy1 soll um den String in Dummy2 erweitert und nach Dummy3 kopiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;{ fhem(&amp;quot;set Dummy3 &amp;quot;.(Value(&amp;quot;Dummy1&amp;quot;)+Value(&amp;quot;Dummy2&amp;quot;))) } &amp;lt;/code&amp;gt;&lt;br /&gt;
(Achtung: &amp;quot;+&amp;quot;  ist Zahlen addieren, &amp;quot;.&amp;quot; ist String konkatenieren / verketten)&lt;br /&gt;
&lt;br /&gt;
== April 2014==&lt;br /&gt;
=== Code sparen ===&lt;br /&gt;
Wer Definitionen wie die aus dem März zum [[Trick der Woche#Zuverlässigkeit von FS20 Schaltungen erhöhen|Abfangen von Fehlbedienungen]] verwendet, kann durch eine ELSE Erweiterung auch gleich das Auschalten erledigen.&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TV { if (&amp;quot;$EVENT&amp;quot; eq &amp;quot;on&amp;quot; || &amp;quot;$EVENT&amp;quot; eq &amp;quot;dimup&amp;quot;) { fhem(&amp;quot;set TV on&amp;quot;) } else { fhem(&amp;quot;set TV off&amp;quot;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierdurch schaltet ON oder versehentlich zu langes Drücken (also DIMUP) den Fernseher ein, jeder &#039;&#039;andere&#039;&#039; Tastendruck (also insbesondere die OFF Taste oder zu langes Drücken der OFF Taste -&amp;gt; DIMDOWN) den Fernseher aus.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist, dass die Fernbedienung standardkonfiguriert ist, siehe auch nächster Tip.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration eines FS20 Senders prüfen ===&lt;br /&gt;
Gelegentlich reagieren bestimmte notifys nicht, die von Sendern (Fernbedienungen, Sensoren oder Schaltern) ausgelöst werden sollen. Speziell bei FS20 aber auch bei HomeMatic kann das daran liegen, dass der Sender nicht sendet was man denkt. So gut wie alle FS20 Sender kennen nämlich nicht nur ON und OFF, sondern über ein Dutzend Schaltzustände. Dimmen ist einem noch hinreichend bewusst, es gibt aber auch exotische Dinge wie  Ein-für-Zeitdauer, Ein-auf-alte-Helligkeit, Aus-für-Zeitdauer (nur FS20), Ein-für-Zeitdauer-dannach-alter-Zustand und vieles mehr.&lt;br /&gt;
&lt;br /&gt;
Was also ein Infrarot-Bewegungsmelder bei Auslösung sendet und auch was eine Fernbedienungstaste sendet ist einstellbar. Wenn jetzt zum Beispiel an einer Fernbedienung auf Tastendruck nicht ON sondern Ein-für-Zeitdauer (ON-FOR-TIMER) gesendet wird, wird&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB:on set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
seltsamerweise nicht auslösen, obwohl die richtige Taste (und diese auch nicht zu lang) gedrückt wurde.&lt;br /&gt;
&lt;br /&gt;
Auch wenn man sich sicher ist, das Richtige in die Fernbedienung/Sensoren einprogramiert zu haben, ist ein einfacher Test immer, dies mit&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV notify TVFB set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
zu prüfen. Dieses notify löst immer aus, wenn &amp;quot;TVFB&amp;quot;  &#039;&#039;irgendetwas&#039;&#039; sendet, egal was. (Beachte: Man kann dann den Fernseher aber nicht mehr ausschalten, da auch die Austaste das notify auslöst und zum TV-Aktor nur &amp;quot;on&amp;quot; sendet). &lt;br /&gt;
&lt;br /&gt;
Geht die Schaltung jetzt (kann man den Fernseher also jetzt EINschalten), liegt der Verdacht nahe, dass die Konfiguration des Senders / Sensors anders ist, als man denkt. Das Logfile, der EventMonitor oder ein Beobachtung von FHEM per Telnet mittels &amp;quot;inform&amp;quot; gibt Aufschluss, welcher Befehl tatsächlich empfangen wurde.&lt;br /&gt;
&lt;br /&gt;
== März 2014==&lt;br /&gt;
=== Zuverlässigkeit von FS20 Schaltungen erhöhen ===&lt;br /&gt;
FS20 Fernbedienungen senden bei Tastendrücken von mehr als 0,4 Sekunden anstatt ON bzw. OFF DIMUP bzw DIMDOWN.(Auch einige FBs anderer Systeme verhalten sich ähnlich)&lt;br /&gt;
&lt;br /&gt;
Das führt gelegentlich zu allgemein schlechter Bedienbarkeit (und schlechtem WAF), da 0,4 Sekunden relativ kurz ist und gerne aus versehen länger gedrückt wird. Das ist vor allem problematisch, wenn etwas geschaltet werden soll, was keinen Dimmer hat oder Dimmen nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Eine Konfiguration wie &lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB:on set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
hat also dann den Nachteil, dass bei versehentlich zu langem Tastendruck auf die Fernbedienung das TV nicht angeht. Da die meisten Nutzer unbewusst dazu neigen, bei Misserfolg die selbe Taste erneut aber länger zu drücken (was erneut keinen Erfolg zeigt) ist Frustration zu erwarten.&lt;br /&gt;
&lt;br /&gt;
Es kann daher speziell bei nicht dimmbaren Aktoren von Vorteil sein, auch dimmen abzufangen, z.B. durch eine zweite zusätzliche Definition:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_dimup notify TVFB:dimup set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist in der Regel einfacher, einige dieser zusätzlichen Definitionen einzufügen, als allen Bedienern des Systems zu erklären, dass man keinesfalls länger als 0,4 Sekunden drücken darf.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch beide Befehle in einer Definition durch Perlbefehle {} abfangen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB { if (&amp;quot;$EVENT&amp;quot; eq &amp;quot;on&amp;quot; || &amp;quot;$EVENT&amp;quot; eq &amp;quot;dimup&amp;quot;) { fhem(&amp;quot;set TV on&amp;quot;) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allerdings hat dies den Nachteil, dass jedes Event dieses define durchläuft und erst später geprüft wird, ob das Event überhaupt irgendetwas auslöst. &lt;br /&gt;
Z.B. wird&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB ...&amp;lt;/code&amp;gt; &lt;br /&gt;
auch durch TVFB off ausgelöst (oder unter bestimmten Bedungen sogar duch alle Events), nur um dann nach dem Perl Test festzustellen, dass doch nichts getan werden soll.&lt;br /&gt;
&lt;br /&gt;
Ressourcenschonender ist daher:&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB:on|TVFB:dimup set TV on &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Andere Möglichkeiten vergleiche: [[Trick der Woche#notify durch mehrere Ereignisse auslösen lassen|Notify durch mehrere Ereignisse auslösen lassen]] und [[Trick der Woche#Performance_von_Notifys|Performance von Notifys]]&lt;br /&gt;
&lt;br /&gt;
== Februar 2014==&lt;br /&gt;
=== Sequence nutzen ===&lt;br /&gt;
Man kann Aktionen statt mit einem Tastedruck auch mit einer Sequenz von Tastendücken auslösen. Das Format des Befehle ist:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; sequence &amp;lt;re1&amp;gt; &amp;lt;timeout1&amp;gt; &amp;lt;re2&amp;gt; [&amp;lt;timeout2&amp;gt; &amp;lt;re3&amp;gt; ...] &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei &amp;lt;re1&amp;gt; ...&amp;lt;re_n&amp;gt; die Aktionen sind und &amp;lt;timeout_n&amp;gt; der maximale Abstand der Tastendrücke in Sekunden.&lt;br /&gt;
&lt;br /&gt;
Angenommen, man wolle z.B. eine Lampe dann anschalten, wenn man zuerst Taste1 EIN, dann Taste2 AUS und dann wieder Taste1 EIN einer Fernbedienung drückt, könnte das konkret so aussehen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define MeineLampenSequenz1 sequence Btn1:on 0.5 Btn2:off 0.5 Btn1:on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zwischen jedem der Tastendrücke darf eine halbe Sekunde Abstand sein. Diese Definition selbst löst die Lampe nicht aus, sondern definiert nur wie die Sequenz aussehen soll. Um die Lampe bei erfolgreicher Betätigung der Sequenz auch einzuschalten, bedarf es zusätzlich etwas wie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define MeineLampe notify MeineLampenSequenz1:trigger set Lampe on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sequence kann man gut nutzen, um mit einer Fernbedienung mehr Funktionen zu schalten als Tasten zur Verfügung stehen. Ebenso könnte man damit simple Codeschlösser für Alarmanlagen bauen, z.B. um eine Anlage auszuschalten, wenn eine bestimmte Abfolge von Tasten gedrückt wird.&lt;br /&gt;
&lt;br /&gt;
Je nach Funksystem nimmt die Zuverlässigkeit aber rasch ab. Angenommen im Bereich FS20 (das System ist etwas unzuverlässiger ist als z.B. HomeMatic) seien 95% aller Funktsignale ungestört übertragbar, dann würden in der Praxis von 100 Tastendrücken an einer Fernbedienung 95x Erfolg zeigen und 5x fehlschlagen; das ist sicher tolerabel. &lt;br /&gt;
&lt;br /&gt;
Bei einer Sequenzlänge von nur 4 Tasten würde die kombinierte Erfolgsquote der Sequenz jedoch nur noch ca. 80% sein, zum Ausschalten einer Alarmanlage vermutlich bereits unpraktisch.&lt;br /&gt;
&lt;br /&gt;
== Januar 2014==&lt;br /&gt;
===isday===&lt;br /&gt;
Bekanntlich kann man  mit &amp;quot;isday&amp;quot; leicht testen ob es draussen hell ist oder nicht. isday ist eine Funktion des (automatisch geladenen) Moduls [[SUNRISE_EL]], das auch sunset und sunrise enthält.&lt;br /&gt;
&lt;br /&gt;
Problematisch bei isday ist die fehlende Möglichkeit, Sonnenaufgang und Untergang einzustellen (zumindest wenn man nicht 99_SUNRISE_EL.pm verändern will): isday ist wahr, wenn die Sonne im gegebenen Breitengrad theoretisch sichtbar ist. Wenn örtliche Gegebenheiten (Bebauung, Bäume, Tal etc.) eine Anpassung erfordern, kann man sich auch ein eigenes isday basteln, in dem man sunrise und sunset verwendet und dieses mit getrennten offsets versieht.&lt;br /&gt;
&lt;br /&gt;
Zuerst definiert man sich eine Variable (&amp;quot;dummy&amp;quot;) der anstelle isday eingesetzt werden soll, z.B.:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define Tageslicht dummy &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann wird diese mit sunset und sunrise befüllt:&lt;br /&gt;
&lt;br /&gt;
 define SetDummy1 at *{sunset(-3600)} set Tageslicht hell &lt;br /&gt;
 define SetDummy2 at *{sunrise(+1800)} set Tageslicht dunkel &lt;br /&gt;
&lt;br /&gt;
Jetzt kann für jeden Wechsel ein eigener Offset gewählt werden, im Beispiel 3600 Sekunden vor Sonnenuntergang und 1800 Sekunden nach Sonnenaufgang. Anstatt das Dummy &amp;quot;Tageslicht&amp;quot; mit den Werten &amp;quot;hell/dunkel&amp;quot; zu befüllen, kann natürlich auch 1/0 oder &amp;quot;Tag/Nacht&amp;quot; etc. verwendet werden, je nachdem was bei der Anwendung besser passt.&lt;br /&gt;
&lt;br /&gt;
Für höhere Ansprüche könnte hingegen das [[Twilight]]-Modul verwendet werden, das Dämmerungsstufen kennt.&lt;br /&gt;
&lt;br /&gt;
===Struktur von &amp;quot;else if&amp;quot; Verzweigungen===&lt;br /&gt;
 define ... notify ... {\&lt;br /&gt;
  if ... {\&lt;br /&gt;
   fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  else {\&lt;br /&gt;
   if ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Achtung: es muss tatsächlich &amp;quot;elsif&amp;quot; heissen und nicht &amp;quot;elseif&amp;quot; oder &amp;quot;else if&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Gilt für Perl Aufrufe. &lt;br /&gt;
Wer aktuell in FHEM neu einsteigt, kann auch den seit 2014 zur Verfügung stehenden FHEM Befehl [[DOIF]] verwenden, der komfortabler ist und zusätzliche Features aufweist.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2013==&lt;br /&gt;
===notify durch mehrere Ereignisse auslösen lassen===&lt;br /&gt;
Bekanntermassen löst&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
aus, wenn irgendein Ereignis vom Sender &amp;quot;MeinSchalter&amp;quot; eintrifft.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wird das notify jedoch nur ausgelöst, wenn dieses Ereignis eine &amp;quot;on&amp;quot; ist.&lt;br /&gt;
Wenn man aber möchte, das z.B. &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; auslöst (um etwa Dim-Befehle auszuschliessen) kann dies wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:(on|off) …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klammern sind wichtig, vergleiche eine Lösung, bei der zwei Sender alternativ das notify auslösen können:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on|MeinAndererSchalter:on …&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Selbstverständlich geht z.B. auch folgendes:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on|MeinAndererSchalter …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird ausgelöst wenn &amp;quot;MeinSchalter&amp;quot; das Ereignis &amp;quot;on&amp;quot; liefert oder &amp;quot;MeinAndererSchalter&amp;quot; irgendein Ereignis. Beachte hierzu jedoch den Tipp vom Dezember 2020 &amp;quot;Performance von Notifys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Aktoren über mehrere Funkschnittstellen ansprechen ===&lt;br /&gt;
Falls man mehrere Funkschnittstellen zur Reichweitenverlängerung hat (CUL / CUNO etc), und ein Aktor von beiden Funkschnittstellen in etwa gleich (schlecht) erreichbar ist, mag der Wunsch aufkommen, einen Funkbefehl über beide Schnittstellen auszusenden. Dies ist bei Funkprotokollen möglich, die kein echtes Pairing der Aktoren an die Funkschnittstelle erfordern, also z.B. FS20 oder Intertechno, nicht jedoch ohne weiteres bei HomeMatic.&lt;br /&gt;
&lt;br /&gt;
Problematisch ist aber, dass die Funkschnittstelle über IODev eindeutige je Aktor festgelegt werden muss, eine Zuordnung mehrerer IODevs ist nicht vorgesehen.&lt;br /&gt;
(wenn man IODev nicht setzt, wird per default die LETZTE definiert passende Schnittstelle verwendet)&lt;br /&gt;
&lt;br /&gt;
Dieses Problem kann mit einem Trick aber umgangen werden. Und zwar legt man den Aktor 2x mit gleicher Adresse aber abweichenden Namen und IOdevs an, z.B. so:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 define brenner_CUL1 FS20 11114244 11&lt;br /&gt;
 attr brenner_CUL1 IODev CUL1&lt;br /&gt;
 attr brenner_CUL1 room Keller&lt;br /&gt;
&lt;br /&gt;
 define brenner_CUL2 FS20 11114244 11&lt;br /&gt;
 attr brenner_CUL2 IODev CUL2&lt;br /&gt;
 attr brenner_CUL2 room Keller&lt;br /&gt;
&lt;br /&gt;
Ein Befehl der Art:&lt;br /&gt;
&lt;br /&gt;
 set brenner_CUL1,brenner_CUL2 on&lt;br /&gt;
&lt;br /&gt;
sendet den ON Befehl für den FS20 Aktor 11114244 11  jetzt tatsächlich über beide CULs aus!&lt;br /&gt;
&lt;br /&gt;
Achtung: Wenn die Schnittstellen gleichschnell angebunden sind, sollte vermutlich der [[Sendpool]] verwendet werden, da die Aussendungen sonst tatsächlich gleichzeitig erfolgen könnten und sich dann gegenseitig stören würden. Dieser Trick funktioniert ausserdem nur bei Befehlen, bei denen es im Zweifel egal ist, wenn sie beim Aktor 2x eintreffen. &lt;br /&gt;
&lt;br /&gt;
Bei HomeMatic lässt sich ein ähnlicher Effekt durch einrichten einer [[Virtueller Controller VCCU|virtuellen CCU]] erreichen.&lt;br /&gt;
&lt;br /&gt;
=== Retrycount bei FHTs ist überflüssig===&lt;br /&gt;
Das von der Funktion &#039;&#039;autocreate&#039;&#039; älterer FHEM Versionen beim Anlegen von FHT80 Heizungsreglern voreingetragene attribute &amp;quot;retrycount&amp;quot; hat in den allermeisten Fällen keine Wirkung, da es NUR greift, wenn man als Funkschnittstelle eine FHZ1X00PC verwendet und dann den Softbuffer einschaltet. Selbst wenn man diese Konfiguration nutzt, will gut überlegt werden, ob die Wirkung postiv ist: Bei ungenügender Empfangslage vergrössert es Kommunikationsprobleme eventuell sogar.&lt;br /&gt;
&lt;br /&gt;
Es kann also in der Regel entfernt oder auf den Wert &amp;quot;1&amp;quot; gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
 define Heizung_Bad FHT 060d&lt;br /&gt;
 attr Heizung_Bad retrycount 3       &amp;lt;=== Diese Zeile entfernen&lt;br /&gt;
&lt;br /&gt;
Siehe auch:[[Kommunikationsprobleme mit FHT]]&lt;br /&gt;
&lt;br /&gt;
== November 2013 ==&lt;br /&gt;
=== FS20 Funksteckdose sicherer schalten===&lt;br /&gt;
Seltsamerweise kommt es vor, das FS20 Aktoren - insbesondere die FS20 Funksteckdose - an der Grenze der Funkreichweite bestimmte Befehle eines Typs empfängt, andere aber nicht. Z.B. lässt sich die FS20 Steckdose zwar immer einschalten, aber oft nicht mehr aus (oder umgekehrt).&lt;br /&gt;
&lt;br /&gt;
Gelegentlich kann man die Zuverlässigkeit erhöhen, indem man statt dem nicht funktionierenden Befehl das Gegenteil mit &amp;quot;for-timer 1&amp;quot; verwendet.&lt;br /&gt;
&lt;br /&gt;
Im Fall, dass eine FS20 Steckdose sich also einwandfrei EINschalten lässt:&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
aber oft ein AUSschalten mittels&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA off&amp;lt;/code&amp;gt;&lt;br /&gt;
nicht funktioniert, kann man versuchen die Dose anstelle mit &amp;quot;off&amp;quot; mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA on-for-timer 1&amp;lt;/code&amp;gt;&lt;br /&gt;
auszuschalten.&lt;br /&gt;
&lt;br /&gt;
Analog kann man mit off-for-timer arbeiten, wenn sich Aktoren nicht einschalten lassen, ausschalten aber geht.&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Trick funtioniert ausdrücklich nur, wenn der &amp;quot;on/off-for-timer&amp;quot; Befehl im Aktor selber abgebildet wird. Daher ist der Trick vermutlich nicht auf andere Funksysteme übertragbar. z.B. unterstützt HM nur on-for-timer und Intertechno kennt keinen Timer.&lt;br /&gt;
&lt;br /&gt;
=== Mehrere Geräte zugleich schalten===&lt;br /&gt;
Ein Ereignis soll mehrere Geräte schalten:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1 on;;set Lampe2 on;;set FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aus Übersichtlichkeitsgründen können vor und nach den Semikolons auch Leerzeichen eingefügt werden (obwohl in einigen Dokumentation behauptet wird, dies dürfe man nicht machen):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1 on ;; set Lampe2 on ;; set FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn der Schaltbefehl bei allen Geräten gleich ist, kann man wie folgt zusammenfassen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1,Lampe2,FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Komma wird nicht [[Escapen in Perlbefehlen|escaped]] (verdoppelt), hier darf tatsächlich KEIN Leerzeichen vor oder nach dem Komma eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== Logfileinträge unterdrücken===&lt;br /&gt;
Das Attribute &amp;quot;verbose 0&amp;quot; verhindert, dass das Gerät Logfileinträge erzeugt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 define Funksteckdose FS20 22224222 01&lt;br /&gt;
 attr Funksteckdose verbose 0&lt;br /&gt;
&lt;br /&gt;
===FHT Lazy Mode benutzen===&lt;br /&gt;
Es gibt wenig Gründe, den FHT &amp;quot;Lazy Mode&amp;quot; nicht zu verwenden&lt;br /&gt;
 define Heizung_Bad FHT 060d&lt;br /&gt;
 attr Heizung_Bad lazy&lt;br /&gt;
&lt;br /&gt;
Dieser sorgt dafür, dass Temperaturänderungen (genau genommen alle Änderungen, auch z.B. date) nur übertragen werden, wenn sie nicht sowieso schon am FHT eingestellt sind und veringern die Funklast dadurch deutlich. &lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[Kommunikationsprobleme mit FHT]]&lt;br /&gt;
&lt;br /&gt;
== Oktober 2013 ==&lt;br /&gt;
=== Zuverlässigkeit von Wiedereinschalten erhöhen ===&lt;br /&gt;
Speziell bei FS20 Aktoren ist wegen des fehlenden Rückkanals nicht leicht erkennbar, ob ein Einschaltbefehl Wirkung gezeigt hat. Das bringt einen ganz schlechten WAF, wenn man z.B. mit einem FS20 Aktor eine Heizung ausschaltet und das Wiedereinschalten nach z.B. einer Stunde nicht klappt.&lt;br /&gt;
&lt;br /&gt;
Hier empfiehlt es sich, das Ausschalten mittels &lt;br /&gt;
:&amp;lt;code&amp;gt;set Heizungs_schalter off-for-timer 3584&amp;lt;/code&amp;gt;   (= fast eine Stunde)&lt;br /&gt;
zu erledigen. Da bei FS20 der off-for-timer Befehl im Aktor abgewickelt wird (und nicht durch FHEM), schaltet sich der Aktor auch dann garantiert wieder ein, wenn FHEM abstürzt, eine Funkstörung vorliegt oder ähnliches.  Bei Bedarf kann der Befehl off-for-timer zur  Verlängerung der Ausschaltzeit wiederholt werden. Dies kann z.B. nötig sein, wenn die Ausschaltung länger als 4,5 Stunden (15360 Sekunden, der Maximalwert des Timers) dauern soll.&lt;br /&gt;
&lt;br /&gt;
Achtung: dieser Trick funktioniert nur, wenn der Aktor &amp;quot;off-for-timer&amp;quot; selbst beherrscht. FS20 Geräte können das, HomeMatic können aber nur &amp;quot;on-for-timer&amp;quot;. Man kann off-for-timer mit HomeMatic trotzdem verwenden, aber in diesem Fall sendet FHEM den Einschaltbefehl nach der Timerzeit. InterTechno, RSL etc, können gar keinen Timer, hier sendet FHEM immer 2 Befehle im passenden Abstand.&lt;br /&gt;
&lt;br /&gt;
=== FS20 Timerzeiten ===&lt;br /&gt;
FS20 Timer werden in Sekunden angegeben. Es sind jedoch nicht alle Werte einstellbar. Da der Timer Wert in 7 Bit übertragen werden muss, sind nur 128 Werte möglich. Um mit diesen Werten im unteren Bereich möglichst fein aufzulösen, andererseits aber auch lange Zeiten zu ermöglichen, ist die Verteilung nicht linear. Einstellbar sind folgende Zeiten in Sekunden;&lt;br /&gt;
&lt;br /&gt;
0,25  0,5  0,75  1  1,25  1,5  1,75  2  2,25  2,5  2,75  3  3,25  3,5  3,75   &lt;br /&gt;
4  4,5  5  5,5  6  6,5  7  7,5  8  9  10  11  12  13  14  15  16  18  20  22   &lt;br /&gt;
24  26  28  30  32  36  40  44  48  52  56  60  64  72  80  88  96  104  112   &lt;br /&gt;
120  128  144  160  176  192  208  224  240  256  288  320  352  384  416   &lt;br /&gt;
448  480  512  576  640  704  768  832  896  960  1024  1152  1280  1408   &lt;br /&gt;
1536  1664  1792  1920  2048  2304  2560  2816  3072  3328  3584  3840  4096   &lt;br /&gt;
4608  5120  5632  6144  6656  7168  7680  8192  9216  10240  11264  12288   &lt;br /&gt;
13312  14336  15360 &lt;br /&gt;
(etwas übersichtlicher formatiert auch [[FS20 Allgemein#ON/OFF Befehle mit Time Parameter|hier]]).&lt;br /&gt;
 &lt;br /&gt;
Andere Zeiten werden von FHEM gerundet. Ein neues Setzen des Timer für FS20 löscht den alten Wert.&lt;br /&gt;
&lt;br /&gt;
Auch HomeMatic Aktoren beherrschen Time Parameter, im Gegensatz zu FS20 allerdings kein &amp;quot;off-for-timer&amp;quot;. Details dazu im Artikel [[HomeMatic Timerwerte]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Trick_der_Woche&amp;diff=40323</id>
		<title>Trick der Woche</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Trick_der_Woche&amp;diff=40323"/>
		<updated>2025-08-18T10:14:36Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite enthält Tipps und Tricks, die zu unbedeutend sind, einen eigenen Artikel zu rechtfertigen, alternative Schreibweisen/Lösungen für eine Problem darstellen, Ungenauigkeiten oder unklare Formulierungen in den offiziellen Dokumenten ergänzen und ähnliches. Jeder Eintrag ist typischerweise sehr kurz (wenige Zeilen lang) und beleuchtet vielleicht nur einen Aspekt von FHEM, er kann allgemeiner Natur sein, oder sich auf ein spezielles Gerät oder einen speziellen Anwendungsfall beziehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== August 2025==&lt;br /&gt;
=== FTUI(3) Dateien direkt in FHEMWEB bearbeiten ===&lt;br /&gt;
Im Attribut editFileList der [https://fhem.de/commandref_modular.html#FHEMWEB FHEMWEB]-Definition &#039;&#039;&#039;zusätzlich zu den Default-Werten&#039;&#039;&#039; eintragen:&lt;br /&gt;
 FTUI (www/tablet):$FW_dir.&#039;/tablet&#039;:^.*html$&lt;br /&gt;
 FTUI3 (www/ftui):$FW_dir.&#039;/ftui&#039;:^.*html$&lt;br /&gt;
&lt;br /&gt;
== August 2022==&lt;br /&gt;
=== Update ===&lt;br /&gt;
Wenn der Befehl &amp;quot;Update&amp;quot; nicht funktioniert und insbesondere die Fehlermeldung &#039;&#039;Bad hostname &#039;fhem.de:80&#039;&#039;&#039; zurück gibt, kann es sinnvoll sein, den Parameter  -noSSL zu versuchen. Details dazu im Artikel [[Update]]&lt;br /&gt;
&lt;br /&gt;
== Januar 2022==&lt;br /&gt;
=== günstiger Luftfeuchtesensor ===&lt;br /&gt;
Der [[HM-CC-TC Funk-Wandthermostat]] ist schon lange abgekündigt. Er wird derzeit oft recht günstig im Netz angeboten und eignet sich daher als billiger &amp;quot;StandAlone&amp;quot; Temperatur- und Luftfeuchtesensor, auch wenn er keinen Ventielantrieb steuern soll.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2020 ==&lt;br /&gt;
=== Performance von Notifys ===&lt;br /&gt;
Im Tipp vom Dezember 2013 [[Trick der Woche#notify durch mehrere Ereignisse auslösen lassen|notify durch mehrere Ereignisse auslösen lassen]] heisst es:&lt;br /&gt;
:&#039;&#039;[…] Wenn man aber möchte, dass z.B. &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; auslöst (um etwa Dim-Befehle auszuschliessen), kann dies wie folgt erreicht werden:&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:(on|off) …&amp;lt;/code&amp;gt;&lt;br /&gt;
Performanter ist allerdings:&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:o[nf]+  …&amp;lt;/code&amp;gt;&lt;br /&gt;
wobei &#039;&#039;&#039;o[nf]+&#039;&#039;&#039; eine &amp;quot;Regexp&amp;quot; für beliebige Zeichenketten ist, die mit &#039;&#039;&#039;o&#039;&#039;&#039; anfangen und &#039;&#039;&#039;n&#039;&#039;&#039; und/oder &#039;&#039;&#039;f&#039;&#039;&#039; enthalten, also (auch) on und off.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch:&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on|MeinSchalter:off … &amp;lt;/code&amp;gt;&lt;br /&gt;
verwendet werden.&lt;br /&gt;
Die letzten beiden Varianten sparen Ausführungszeit. Ganz allgemein ist es besser, im notify das Suchmuster mit einem [[Regulärer Ausdruck|regulären Ausdruck]] (Regexp) eng zu definieren.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on ... &amp;lt;/code&amp;gt;&lt;br /&gt;
ist performanter als&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter { if ($EVENT eq &amp;quot;on&amp;quot; ... &amp;lt;/code&amp;gt;&lt;br /&gt;
auch wenn das Ergebnis gleich ist.&lt;br /&gt;
&lt;br /&gt;
Allerdings ist &lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on ... &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas1 notify MeinSchalter:off ... &amp;lt;/code&amp;gt;&lt;br /&gt;
langsamer als&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchaltero[nf]+ { if ($EVENT eq &amp;quot;on&amp;quot;  ) { fhem( ) } else { fhem(&amp;quot;... &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die oben erwähnten &amp;quot;if&amp;quot; sind &amp;quot;perl if&amp;quot;s. Die Verwendung des FHEM Modul DOIF ist deutlich langsamer.  Die Betrachtung betrifft sowieso nur langsame Host-Systeme mit gleichzeitig vielen defines. Bei Verwendung z.b. einen Raspberry Pi 4 oder schnellerem Host dürften die Unterschiede vernachlässigbar sein.&lt;br /&gt;
&lt;br /&gt;
== Oktober 2020 ==&lt;br /&gt;
=== Entprellen ===&lt;br /&gt;
Will man ein notify innerhalb eines bestimmten Zeitraumes nur einmal auslösen lassen, auch wenn er in diesem Zeitraum mehrfach getriggered werden sollte, so bietet sich das [[Attribut]] &#039;&#039;&#039;disabledAfterTrigger&#039;&#039;&#039; an:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;notify_device&amp;gt; disabledAfterTrigger &amp;lt;Anzahl Sekunden&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Oktober 2019 ==&lt;br /&gt;
=== Funkstörungen durch leere Batterien ===&lt;br /&gt;
Unerklärliche Funkstörungen besonders im SlowRF Bereich (z.b. FS20) mit stark verminderter Reichweite von CULs, gestörter [[RFR CUL]] Kommunikation etc. gestörtem Empfang von Funktelegrammen aller Art können ihre Ursache darin haben, dass einige Geräte mit (fast) leeren Batterien unkontrolliert senden und dadurch den Kanal mit Störsignalen verschmutzen. Anfällig sind insbesondere ältere FHT Fenstersensoren wie der [[FHT80TF]], die mit fast leeren Batterien eine Art Rauschen aussenden und damit die &#039;&#039;&#039;komplette&#039;&#039;&#039; FS20 Kommunikation lahmlegen können, Störungen beeinflussen auch andere Funkprotokolle im selben Frequenzbereich, wie z.b. HM.&lt;br /&gt;
Also im Falle unerklärlicher und weitreicher Funkstörungen die Batterien aller Geräte überprüfen.&lt;br /&gt;
&lt;br /&gt;
== Februar 2019 ==&lt;br /&gt;
=== Unterräume anlegen ===&lt;br /&gt;
[[Datei:Unterraeume.png|350px|thumb|right|Beispiel für einen gegliederten Raum &amp;quot;Steuerung&amp;quot;]]&lt;br /&gt;
In [[FHEMWEB]] besteht neben der Möglichkeit, Geräte dadurch übersichtlich anzuordnen, indem diese Gruppen und einfachen Räumen zugeordnet werden, auch die Möglichkeit, Räume weiter zu gliedern und Unterräume zu verwenden. Dazu wird nach der Angabe des Hauptraums der Unterraum, getrennt durch ein &amp;quot;-&amp;gt;&amp;quot; angegeben. Beispiele:&lt;br /&gt;
 attr &amp;lt;DEVICENAME&amp;gt; room Steuerung-&amp;gt;Logik&lt;br /&gt;
 attr &amp;lt;DEVICENAME&amp;gt; room Steuerung-&amp;gt;Heizung&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Legt man zusätzlich einen Raum &#039;&#039;Steuerung&#039;&#039; an, erscheint dieser als zusätzlicher Eintrag in der Raumliste.&lt;br /&gt;
&lt;br /&gt;
== Januar 2019 ==&lt;br /&gt;
=== HomeMatic IP ===&lt;br /&gt;
Das [[HomeMatic IP]]-Protokoll unterscheidet sich deutlich vom bisherigen HomeMatic Protokoll, im Grunde ist es ein anderes System, das nur dem Namen nach dem älteren HomeMatic gleicht. HM-IP Geräte können aktuell (Anfang 2019) nur über eine systemeigene Zentrale CCU2 (als physisch vorhandenes Interface) und die HomeMatic-Module in FHEM integriert werden, sind in FHEM jedoch &#039;&#039;&#039;nicht&#039;&#039;&#039; unmittelbar als Homematic-Geräte ansprechbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dezember 2018 ==&lt;br /&gt;
===HomeMatic Heizungsregler Uhrzeit einstellen===&lt;br /&gt;
HomeMatic Thermostate / Heizungsregler  wie der HM-CC-TC der der HM-TC-IT-WM-W-EU etc. synchronisieren ihre Uhrzeit täglich etwa gegen Mitternacht mit der Zentrale. Man kann dieses Update aber jederzeit erzingen durch den Befehl  &lt;br /&gt;
 set &amp;lt;DEVICENAME&amp;gt; sysTime&lt;br /&gt;
&lt;br /&gt;
== November 2018 ==&lt;br /&gt;
===HomeMatic Heizunggeräte gebraucht gekauft===&lt;br /&gt;
HomeMatic Heizunggeräte gebraucht gekauft und jetzt lassen sie sich nicht richtig peeren oder pairen?&lt;br /&gt;
Das Problem ist meistens, dass die Geräte noch mit der Zentrale des Verkäufers gepairt oder mit anderen Geräten gepeert sind. &lt;br /&gt;
Mit Thermostaten wie der [[HM-CC-TC Funk-Wandthermostat]] oder der Nachfolger [[HM-TC-IT-WM-W-EU Funk-Wandthermostat AP]] können mit Ventilantrieben wie dem [[HM-CC-VD Funk-Stellantrieb]] nur gepeert werden, wenn &lt;br /&gt;
* die Thermostaten nicht selbst schon mit einer Zentrale (im FHEM Umfeld also z.b. einer [[Virtueller Controller VCCU]] oder [[HM-[[HM-CFG-LAN LAN Konfigurations-Adapter]] oder ähnliches) gepairt wurden&lt;br /&gt;
* die Ventilantriebe nicht selbst mit einer Zentrale gepairt oder mit einem Thermostaten gepeert wurden.&lt;br /&gt;
&lt;br /&gt;
Es ist daher sinnvoll zuerst alle Geräte zurückzusetzen, da viele Verkäufer dies vergessen. Wie das geht steht in der Anleitung.&lt;br /&gt;
Beispiele:&lt;br /&gt;
* HM-CC-TC -&amp;gt; MENU lange drücken, dann Sonderfunktion &amp;quot;RES&amp;quot; anwählen, mit OK-Taste bestätigen&lt;br /&gt;
* HM-CC-VD -&amp;gt; Anlernknopf 10 Sekunden lang drücken. Der Antrieb geht in Zustand A2, nachdem er das Ventil 1x auf- und zugefahren hat geht er in A3, Knopf nochmals drücken.&lt;br /&gt;
* HM-TC-IT-WM-W-EU -&amp;gt; Batterien entfernen, alle 3 Tasten gedrückt halten, Batterien einlegen, warten bis &amp;quot;rES&amp;quot; im Display erscheint, Tasten loslassen&lt;br /&gt;
&lt;br /&gt;
== Januar 2018 ==&lt;br /&gt;
=== at absolutem Datum ===&lt;br /&gt;
Vielen ist nicht klar, dass man mit dem &amp;quot;define … at&amp;quot; auch einfach ein absolutes Datum definieren kann (obwohl es in der Commandref steht). Anstatt umfangreicher DOIF Konstrukte oder &amp;quot;define … at&amp;quot; die täglich ablaufen und testen ob der gewünschte Tag schon erreicht ist, geht auch ein einfaches:&lt;br /&gt;
&lt;br /&gt;
 define Licht_Neujahr_2019 at 2019-01-03T06:01:01 set Licht1 on&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Allgemein: &lt;br /&gt;
 define &amp;lt;name&amp;gt; at [&amp;lt;datespec&amp;gt;] &amp;lt;command&amp;gt; &lt;br /&gt;
wobei &amp;lt;datespec&amp;gt; =  (YYYY-MM-DDTHH:MM:SS) (also in ISO8601 Schreibweise).&lt;br /&gt;
Wichtig ist die Angabe mit Sekunden, die nicht weggelassen werden können.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2017 ==&lt;br /&gt;
=== perl Version ===&lt;br /&gt;
Gelegentlich taucht die Frage auf, welche perl Version zum Betrieb von FHEM minimal erforderlich ist. Bedauerlicherweise lässt sich das aber aktuell nicht definitiv bestimmen.&lt;br /&gt;
Rudolf König testet zur Zeit (Ende 2017) mit v5.16 (5 Jahre alt) und v5.24 (ca. 1 Jahr alt). &lt;br /&gt;
Sollte sich herausstellen, dass eines seiner Module (vor allem fhem.pl selbst) nicht mit der jeweils &#039;&#039;aktuellen&#039;&#039; perl Version funktioniert, so wird das Modul entsprechend kompatibel gemacht.&lt;br /&gt;
Andererseits verwendet Rudolf König nach eigener Aussage (bewusst) keine Features, die eine höhere Version als perl 5.8.3 (immerhin älter als 13 Jahre) voraussetzen. Tatsächlich zeigen aktuelle Installation auf relativ alten BuffaloLinkstation Systemen, dass FEHM mit perl 5.8.3 prinzipiell lauffähig ist.&lt;br /&gt;
&lt;br /&gt;
Rudolf König prüft als Maintainer von fhem.pl aber nicht, welche Mindestversionen andere Entwickler in Ihren Modulen benötigen. Es ist daher möglich oder sogar wahrscheinlich, das einzelne Module höhere Versionen als 5.8.3 benötigen.&lt;br /&gt;
&lt;br /&gt;
Es gibt aktuell keinen Weg, die Mindestanforderungen z.b. automatisiert zu ermitteln.&lt;br /&gt;
&lt;br /&gt;
== November 2017 ==&lt;br /&gt;
=== Grundlastmodul ===&lt;br /&gt;
Mit einem Grundlastmodul ist es möglich, LED Leuchtmittel an einem Schaltaktor / Dimmer zu betreiben. Dies ist bei manchen nicht möglich, da einige LEDs nachglimmen oder flackern. Das Grundlastmodul, welches parallel zum Verbraucher angeschlossen wird, kann diesen Effekt aufheben, da ein Verbraucher mit ohmscher Last simuliert wird.&lt;br /&gt;
Das Modul ermöglicht eventuell auch den Betrieb eines [[RSL 2-Draht Einbauschalter]]s, der bei LED Leuchtmitteln ansonsten nicht eingesetzt werden kann, da zum Betrieb eine Restspannung über den Verbraucher benötigt wird, der bei LED Lampen mit Vorschaltgerät nicht vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
In Frage kommt z.b. ein Eltako ELTA Grundlastelement GLE / PTC, das ca. 5-8 Euro kostet.&lt;br /&gt;
Technisch handelt sich dabei um einen PTC, also einen Widerstand mit positivem Temperaturkoeffizient, d.h. der Widerstand sinkt deutlich, wenn das Element kälter wird. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das genannte Grundlastelement hat folgende Daten: &lt;br /&gt;
 Kaltwiderstand: 3500 Ω&lt;br /&gt;
 Einschaltstrom bei 230 V: 65 mA (ca. 15 W)&lt;br /&gt;
 Verlustleistung nach 60 Sekunden: 0,65 W &lt;br /&gt;
&lt;br /&gt;
Im kalten Zustand lässt der PTC bei 230 Volt einen Strom von ca. 0,065 Ampere zu.  &lt;br /&gt;
Das reicht, um von Schaltaktoren, Freischaltern, Dimmern etc. als die erforderliche Grundlast erkannt zu werden.&lt;br /&gt;
Wird der Stromkreis eingeschaltet, fliesst auch tatsächlich Strom durch den PTC, der sich dadurch schnell erwärmt (das Element wird tatsächlich sogar relativ heiss). Dadurch steigt steigt der Widerstand auf ca 50000-60000 Ohm an und die Verlustleistung sinkt auf unter 1 Watt. Der PTC regelt sich jetzt selber auf eine bestimmte Temperatur und Widerstand ein.&lt;br /&gt;
&lt;br /&gt;
Wird ausgeschaltet, so fliest über den PTC immer noch ein kleiner Reststrom von ca 0,005 Ampere, der als Grundlast reicht, um z.b. Spannungen abzubauen, die LEDs nachflackern lassen, dieser steigt mit Erkalten rasch an, dadurch werden auch Schalter wie die [[RSL 2-Draht Einbauschalter]] mit genug Strom versorgt.&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann also auch ein PTC mit diesen Werten und einer Leistung von ca. 20 Watt selbst gebaut werden, der Preis der Einzelteile liegt bei unter 2 Euro. Das Eltako Element ist bereits mit Isolierung und Anschlussleitungen versehen, mit eigner Arbeitszeit ist der Preisvorteil beim Selberbau also gering.&lt;br /&gt;
&lt;br /&gt;
== Februar 2017 ==&lt;br /&gt;
=== at Zeiten ===&lt;br /&gt;
 at 03:00      -&amp;gt;  1x um 3 Uhr (wann immer das nächste mal 3 Uhr ist, ggf. erst morgen)&lt;br /&gt;
 at *03:00     -&amp;gt;  jeden Tag um 3 Uhr&lt;br /&gt;
 at +03:00     -&amp;gt;  in 3 Stunden&lt;br /&gt;
 at +*03:00    -&amp;gt;  in 3 Stunden und dann alle 3 Stunden erneut&lt;br /&gt;
 at +*{4}03:00 -&amp;gt;  in 3 Stunden und dann alle 3 Stunden erneut, aber nur 4x ausführen.&lt;br /&gt;
&lt;br /&gt;
== Oktober 2016 ==&lt;br /&gt;
=== Grundlagen der Heizungssteuerung ===&lt;br /&gt;
Der Artikel [[Grundlagen der Heizungssteuerung]] soll einen zentralen Einstiegspunkt und eine Übersicht der Möglichkeiten insb. für Neulinge in FHEM bieten.&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung für Geräte ohne Batteriestatus ===&lt;br /&gt;
Es gibt Möglichkeiten um auch bei Geräten ohne Batteriestatus-Reading eine schwache Batterie erkennen zu können: [[Batterie%C3%BCberwachung#Ger.C3.A4te_ohne_Batteriestatus|Geräte ohne Batteriestatus]].&lt;br /&gt;
&lt;br /&gt;
== Mai 2016 ==&lt;br /&gt;
=== DbLog reparieren ===&lt;br /&gt;
Sollte ein fhem mit DbLog Probleme machen, oder auf der SQL-Konsole Fehler werfen, so ist eine Reparatur der DB fällig. Das ist auf der Kommandozeile verhältnismäßig einfach möglich und wird im Kapitel [[DbLog#Datenbank reparieren]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== DbLog bearbeiten ===&lt;br /&gt;
Unerwünschte Einträge in den Loggings treten immer wieder mal auf. Wie man dies in einer Datenbank korrigiert, dazu gibt das Kapitel [[DbLog#Bearbeitung von Datenbank-Einträgen]] eine erste Einführung.&lt;br /&gt;
&lt;br /&gt;
=== Pollenflug ===&lt;br /&gt;
In dieser schönen Jahreszeit werden manche durch Heuschnupfen geplagt. Auf der Seite [[Pollenflug]] wird beschrieben, wie man eine Pollenvorhersage in fhem einbinden kann - hilft zwar nicht gegen das Niesen, ist aber trotzdem ganz informativ... ;-)&lt;br /&gt;
&lt;br /&gt;
== April 2016 ==&lt;br /&gt;
=== HomeMatic und VCCU ===&lt;br /&gt;
HomeMatic Nutzer sollten unbedingt eine [[Virtueller Controller VCCU|VCCU]] einrichten und nutzen.&lt;br /&gt;
Die Einrichtung ist unaufwändig und schafft jede Menge Vorteile, auch beim Einsetzen nur einer Schnittstelle wie z.B. einem [[HM-CFG-LAN LAN Konfigurations-Adapter]]. Auch die nachträglich Einrichtung ist problemlos, sofern vorher nur ein I/O Gerät (&amp;quot;Funkschnittstelle&amp;quot;) verwendet wurde.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2015 ==&lt;br /&gt;
===defmod===&lt;br /&gt;
In vielen Fällen will man mit einer Aktion gleichzeitig eine andere Aktion bereits für später festlegen, z.b. nach Einschalten  einer Heizung durch einen Bewegungsmelder diese eine Stunde später wieder ausschalten.&lt;br /&gt;
&lt;br /&gt;
Dies kann z.B. durch ein Konstrukt dieser Art erledigt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Heizung_an notify Bewegung set HZG_WZ desired-temp 22 ;; define reset_Heizung at +01:00:00 set HZG_WZ desired-temp 16&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nachteilig ist, dass bei einer weiteren Auslösung des Bewegungsmelders die Heizzeit nicht verlängert wird, da eine Neudefinition von &#039;&#039;&#039;reset_Heizung&#039;&#039;&#039; mit der Fehlermeldung &#039;&#039;&#039;reset_Heizung already exists, delete it first&#039;&#039;&#039; quittiert wird. Die Lösung bisher war, das alte &#039;&#039;&#039;reset_Heizung&#039;&#039;&#039; zunächst zu löschen und dann erneut mit neuem Zeitstempel anzulegen:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Heizung_an notify Bewegung set HZG_WZ desired-temp 22 ;; delete reset_Heizung ;; define reset_Heizung at +01:00:00 set HZG_WZ desired-temp 16&amp;lt;/code&amp;gt;&lt;br /&gt;
Aber auch dieses umständliche Konstrukt hat noch einen Nachteil: Es erzeugt bei einer ersten Auslösung eine Fehlermeldung, weil &#039;&#039;&#039;reset_Heizung&#039;&#039;&#039; noch nicht exisitert und daher nicht gelöscht werden kann.  Dies liesse sich abfangen, was die Konstruktion weiter verkomplizieren würde.&lt;br /&gt;
&lt;br /&gt;
Daher hat Rudolf König mit FHEM 5.6 den neuen Befehel &amp;quot;defmod&amp;quot; eingeführt, der ein noch nicht existieredendes define neu anlegt (wie &amp;quot;define&amp;quot;), eine bereits vorhandenes aber direkt ändert (wie &amp;quot;delete&amp;quot; und danach &amp;quot;define&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Dadurch lässt sich verkürzt schreiben:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Heizung_an notify Bewegung set HZG_WZ desired-temp 22 ;; defmod reset_Heizung at +01:00:00 set HZG_WZ desired-temp 16&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== April 2015 ==&lt;br /&gt;
===FS20 Timer===&lt;br /&gt;
FS20 Aktoren beherrschen zwei verschiedene Timer-Methoden.&lt;br /&gt;
&lt;br /&gt;
Angenommen ein FS20 Device heisse &amp;quot;Lampe&amp;quot; und sei z.B. ein [[FS20_SU_Unterputz-Funk-Schalter|FS20 SU]] (Unterputzschalter), dann kann man mit FHEM sowohl &lt;br /&gt;
:&amp;lt;code&amp;gt; set Lampe on-for-timer 30&amp;lt;/code&amp;gt;&lt;br /&gt;
verwenden um die Lampe 30 Sekunden einzuschalten, aber auch zunächst in den FS20 SU die maximale Einschaltdauer einprogrammieren:&lt;br /&gt;
:&amp;lt;code&amp;gt; set Lampe timer 30&amp;lt;/code&amp;gt;&lt;br /&gt;
Dannach wird jedes normale&lt;br /&gt;
:&amp;lt;code&amp;gt; set Lampe on&amp;lt;/code&amp;gt;&lt;br /&gt;
die Lampe für nur 30 Sekunden einschalten.&lt;br /&gt;
&lt;br /&gt;
Als Timerwerte kommen in beiden Fällen die bekannten [[Trick_der_Woche#FS20_Timerzeiten|128 Sekundenwerte]] von 0,25 Sekunden bis Etwa 4,5 Stunden in Frage.&lt;br /&gt;
&lt;br /&gt;
Es ist offenbar nicht bei allen Aktoren möglich einen einmal eingestellten Timer zu löschen, neue Werte eingeben aber sehr wohl.&lt;br /&gt;
&lt;br /&gt;
Mehr hier: [[FS20_Allgemein#Gerätetimer setzen / löschen|FS20 timer]].&lt;br /&gt;
&lt;br /&gt;
== Februar 2015 ==&lt;br /&gt;
=== 1-wire am GPIO4-Port des RaspberryPi funktioniert nicht mehr nach Systemupdate ===&lt;br /&gt;
Es kann passieren, dass nach einem Systemupdate (apt-get update oder apt-get dist-upgrade) die 1-wire-Geräte am GPIO4-Port plötzlich nicht mehr funktionieren. Eine Problemlösung dazu ist im Artikel &amp;quot;[[Raspberry Pi und 1-Wire#1-wire am GPIO4-Port funktioniert nicht mehr nach Systemupdate]]&amp;quot; beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Backup der Konfiguration (fhem.cfg und fhem.state) bei jedem &amp;quot;save&amp;quot; ===&lt;br /&gt;
Der nachfolgende Codeschnipsel erstellt bei jedem &amp;quot;save&amp;quot; eine Kopie der aktuellen [[Konfiguration]] (fhem.cfg und fhem.state) in ein Verzeichnis &amp;quot;backup_cfg-state&amp;quot; welches unter /opt/fhem/ zu finden ist. Somit kann bei einem Fehler jederzeit auf den letzten Stand zurückgegangen werden.&lt;br /&gt;
Zuerst ins FHEM Befehlsfeld den folgenden Befehl eingeben:&lt;br /&gt;
:&amp;lt;code&amp;gt;{ `mkdir backup_cfg-state` } &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach folgendes [[notify]] anlegen:&lt;br /&gt;
 define backupCfg notify global:SAVE {\&lt;br /&gt;
 my $now = TimeNow();; $now =~ s/ /_/g;; \&lt;br /&gt;
 `cp $attr{global}{configfile} ./backup_cfg-state/fhem.cfg.$now`;;\&lt;br /&gt;
 `cp $attr{global}{statefile} ./backup_cfg-state/fhem.state.$now`;;\&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
Quelle: {{Link2Forum|Topic=30873|Message=234412|LinkText=FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
== Januar 2015 ==&lt;br /&gt;
=== CUL &amp;amp; CO über Serial ID-einbinden ===&lt;br /&gt;
Bei mehreren USB-Geräten kann es vorkommen, dass sie vertauscht werden z.B. &#039;&#039;/dev/ttyUSB0&#039;&#039; zu&#039;&#039; /dev/ttyUSB1&#039;&#039; oder &#039;&#039;/dev/ttyACM0&#039;&#039; zu &#039;&#039;/dev/ttyACM1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um dies zu umgehen, kann man sie über ihre Serial-ID in FHEM einbinden.&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl zeigt die Serial-ID:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;ls -l /dev/serial/by-id&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier die Beispielausgabe eines CUL868, JeeLink, RFXtrx und eines CUL433&lt;br /&gt;
&lt;br /&gt;
 user@xxxx:~# ls -l /dev/serial/by-id&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 23:34 usb-busware.de_CUL868-if00 -&amp;gt; ../../ttyACM0&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 13:26 usb-FTDI_FT232R_USB_UART_A901RQ9F-if00-port0-&amp;gt; ../../ttyUSB0&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 13:26 usb-RFXCOM_RFXtrx433_A1WZWL5Y-if00-port0-&amp;gt; ../../ttyUSB1&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 21:29 usb-busware.de_CUL433-if00 -&amp;gt; ../../ttyACM1 &lt;br /&gt;
&lt;br /&gt;
Damit lässt sich folgende Definition erstellen:&lt;br /&gt;
&lt;br /&gt;
z.B. für einen CUL868&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define CUL868 CUL /dev/serial/by-id/usb-busware.de_CUL868-if00@9600 1134&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder einen JeeLink&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define Jeelink JeeLink /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A901RQ9F-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einschränkung:&#039;&#039;&#039; Bei CULs von Busware lassen sich nur CUL433 und CUL868 unterscheiden. Zwei CUL868 haben z.B. immer die gleiche Serial-ID.&lt;br /&gt;
&lt;br /&gt;
=== HM LAN Konfig-Adapter Antenne verbessern===&lt;br /&gt;
Die Antenne des [[HM-CFG-LAN LAN Konfigurations-Adapter]] kann man mit etwas Bastelgeschick verlängern um den Empfang zu verbessern. &lt;br /&gt;
&lt;br /&gt;
Sinnvoll ist die Verlängerung auf 1/2 Lambda  (868MHz = 17,27 cm) oder gar 1 Lambda.&lt;br /&gt;
1 Lambda Antennen haben starke Richtwirkung in Form eines gedachten Zylinders, dessen Mittelachse die Antenne ist.&lt;br /&gt;
D.h., Alles was sich in Richtung des Anfangs und des Endes des Antennedrahtes befindet, hat schlechteren Empfang als mit einer kurzen Antenne. Daher muss man die Antenne ggf. genauer ausrichten.&lt;br /&gt;
&lt;br /&gt;
Anleitungen dazu werden an verschiedenen Stellen veröffentlicht, z.B. in &lt;br /&gt;
[http://www.ip-symcon.de/forum/threads/18411-Umbau-HM-LAN-Adapter-auf-Lambda-1-2-Dipol-Antenne diesem Beitrag] im IP-Symcon Forum (anders als der Namen der Anleitung vermuten lässt, liegt hier kein Dipol vor, sondern eine &amp;quot;normale&amp;quot; 1 Lambda Antenne.)&lt;br /&gt;
&lt;br /&gt;
Prinzipiell so dünnen Draht wie möglich verwenden.&lt;br /&gt;
&lt;br /&gt;
Wer noch mehr rausholen will, kann auch zusätzlichen Aufwand betreiben und die Antenne etwas von der Elektronik entfernen, die nämlich Störstrahlung in die Antenne einkoppelt. Oder eine Groundplane bauen.&lt;br /&gt;
Ein Anleitung für die CCU (analog auch für den HM LAN Konfig-Adapter einsetzbar) gibt es [http://www.techwriter.de/beispiel/funkeige.htm hier].&lt;br /&gt;
&lt;br /&gt;
== Dezember 2014 ==&lt;br /&gt;
=== FHT80TF als &amp;quot;Prüfsender&amp;quot; einsetzen  ===&lt;br /&gt;
Da der [[FHT80TF-2]] günstig ist und seinen Zustand ca. alle zwei Minuten sendet, kann er gut zum Ermitteln der Funklage von [[SlowRF]] Komponenten genutzt werden, auch wenn diese nicht senden. Den RSSI einer FS20 Schaltsteckdose kann man z.B. nicht wissen, da die Dose nur ein Empfänger ist. Wenn eine Dose nicht gut funktioniert und man den Verdacht hat, dass sie funktechnisch ungünstig liegt, kann man einen [[FHT80TF-2]] neben die Steckdose legen und man bekommt nach zwei Minuten einen Wert, der (trotz umgekehrter Funkrichtung) gut genug ist, um einem Hinweise zu geben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== November 2014 ==&lt;br /&gt;
=== FS20 Adressschema und die Rolle des Hauscodes  ===&lt;br /&gt;
[[FS20_Allgemein#FS20_Adressierungsschema_.28Vorschlag.29]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Oktober 2014 ==&lt;br /&gt;
=== Aktor für Wanddosen ohne Nulleiter  ===&lt;br /&gt;
Es gibt viele Aktoren die man in Einbaudosen hinter Schaltern einbauen kann. Oft scheitert deren Nutzung aber daran, dass in vielen Elektroinstalltionen in der Einbaudose eines (Licht)schalters kein Neutralleiter (Nulleiter) verlegt ist, den die meisten Aktoren zur eigenen Stromversorgung brauchen. Hier kann der [[RSL 2-Draht Einbauschalter]] helfen, der auch ohne Neutraleiter funktioniert und kompatibel zu InterTechno ist. Er lässt sich z.B. mit einem CUL(433) schalten. Problematisch ist damit allerdings das Schalten von LED Lampen.&lt;br /&gt;
&lt;br /&gt;
== August 2014 ==&lt;br /&gt;
=== Perl-Skripte Online testen  ===&lt;br /&gt;
Im Internet existieren Webseiten auf denen man Perl-Code online testen kann. Beispielsweise auf [http://www.tutorialspoint.com/execute_perl_online.php codingground] kann man Code zum Testen eingeben und die Auswirkungen betrachten. Dies eignet sich zur schnellen Fehleranalyse oder um Perl zu lernen. Natürlich lassen sich keine FHEM-Besonderheiten nutzen.&lt;br /&gt;
&lt;br /&gt;
== Juli 2014 ==&lt;br /&gt;
=== Funklast reduzieren===&lt;br /&gt;
Bewegungsmelder erzeugen in der Regel eine recht hohe Funklast, wenn sie oft ausgelöst werden, also z.B. Licht in einem Zimmer schalten sollen.&lt;br /&gt;
&lt;br /&gt;
Konstruktionen der Art:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* set Licht_Flur on-for-timer 256&amp;lt;/code&amp;gt;&lt;br /&gt;
haben daher den Nachteil bei viel Bewegung im Flur und je nach Einstellung des Sendeabstandes des Bewegungsmelders mindestens alle 120 Sekunde oder öfter ein &lt;br /&gt;
:&amp;lt;code&amp;gt;on-for-timer 256&amp;lt;/code&amp;gt;&lt;br /&gt;
zu senden. Das erzeugt eine hohe Funklast, speziell wenn der Aktor ein SlowRF Gerät ist (z.B. FS20 Unterputzschalter).&lt;br /&gt;
In solchen Fällen kann es helfen, nur dann einen Befehl zu senden, wenn das Licht nicht schon an ist:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* { if (Value(&amp;quot;Licht_Flur&amp;quot;) eq &amp;quot;off&amp;quot;) { fhem (&amp;quot;set Licht_Flur1 on-for-timer 256&amp;quot;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
Nachteilig ist aber, dass eine Auslösung innerhalb 256 Sekunden die Einschaltzeit nicht verlängert. Dies kann man umgehen, indem man nicht on-for-timer verwendet, sondern den Aktor selber verzögert auschaltet und bei weiteren Auslösungen nur die Verzögerung erneut anlegt:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* { if (Value(&amp;quot;Licht_Flur1&amp;quot;) eq &amp;quot;off&amp;quot;) { fhem (&amp;quot;set Licht_Flur on ;; define FlurLicht_aus at +00:04:16 set Licht_Flur off&amp;quot;) } else { fhem (&amp;quot;delete FlurLicht_aus ;; define FlurLicht_aus at +00:04:16 set Licht_Flur off&amp;quot;) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
Durch den relativ neuen Befehl &amp;quot;defmod&amp;quot; kann ausserdem das Löschen und neu Anlegen zusammengefasst werden, sieh Tipp Dezember 2015&lt;br /&gt;
&lt;br /&gt;
== Juni 2014 ==&lt;br /&gt;
=== Batteriestatus bei HomeMatic Devices aktivieren===&lt;br /&gt;
Zumindest einige (wenn nicht alle) batteriegespeisten HM-Geräte können Batteriemeldungen senden, tun dies in der normalen Konfiguration aber nicht.&lt;br /&gt;
Dazu muss das Register cyclicInfoMsg auf on gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
Wie man das macht steht z.B. hier&lt;br /&gt;
[[HM-SEC-SC_Tür-Fensterkontakt#Batteriestatus_aktivieren]]&lt;br /&gt;
und hier&lt;br /&gt;
[[HomeMatic_Type_ThreeState]]&lt;br /&gt;
&lt;br /&gt;
== Mai 2014 ==&lt;br /&gt;
=== Dummywert mit aktueller Uhrzeit versehen in anderen Dummy kopieren===&lt;br /&gt;
Der Inhalt von Dummy1 soll erweitert um  Uhrzeit und Datum in Dummy2 kopiert werden (z.B. um die Urzeit der letzten Auslösung einer Alarmanlage anzuzeigen)&lt;br /&gt;
:&amp;lt;code&amp;gt;{ fhem(&amp;quot;set dummy2 &amp;quot; . (Value(&amp;quot;Dummy1&amp;quot;).&amp;quot; &amp;quot;.TimeNow()) )  } &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zwei Dummywerte in einen anderen Dummy kopieren ===&lt;br /&gt;
Der String in Dummy1 soll um den String in Dummy2 erweitert und nach Dummy3 kopiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;{ fhem(&amp;quot;set Dummy3 &amp;quot;.(Value(&amp;quot;Dummy1&amp;quot;)+Value(&amp;quot;Dummy2&amp;quot;))) } &amp;lt;/code&amp;gt;&lt;br /&gt;
(Achtung: &amp;quot;+&amp;quot;  ist Zahlen addieren, &amp;quot;.&amp;quot; ist String konkatenieren / verketten)&lt;br /&gt;
&lt;br /&gt;
== April 2014==&lt;br /&gt;
=== Code sparen ===&lt;br /&gt;
Wer Definitionen wie die aus dem März zum [[Trick der Woche#Zuverlässigkeit von FS20 Schaltungen erhöhen|Abfangen von Fehlbedienungen]] verwendet, kann durch eine ELSE Erweiterung auch gleich das Auschalten erledigen.&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TV { if (&amp;quot;$EVENT&amp;quot; eq &amp;quot;on&amp;quot; || &amp;quot;$EVENT&amp;quot; eq &amp;quot;dimup&amp;quot;) { fhem(&amp;quot;set TV on&amp;quot;) } else { fhem(&amp;quot;set TV off&amp;quot;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierdurch schaltet ON oder versehentlich zu langes Drücken (also DIMUP) den Fernseher ein, jeder &#039;&#039;andere&#039;&#039; Tastendruck (also insbesondere die OFF Taste oder zu langes Drücken der OFF Taste -&amp;gt; DIMDOWN) den Fernseher aus.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist, dass die Fernbedienung standardkonfiguriert ist, siehe auch nächster Tip.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration eines FS20 Senders prüfen ===&lt;br /&gt;
Gelegentlich reagieren bestimmte notifys nicht, die von Sendern (Fernbedienungen, Sensoren oder Schaltern) ausgelöst werden sollen. Speziell bei FS20 aber auch bei HomeMatic kann das daran liegen, dass der Sender nicht sendet was man denkt. So gut wie alle FS20 Sender kennen nämlich nicht nur ON und OFF, sondern über ein Dutzend Schaltzustände. Dimmen ist einem noch hinreichend bewusst, es gibt aber auch exotische Dinge wie  Ein-für-Zeitdauer, Ein-auf-alte-Helligkeit, Aus-für-Zeitdauer (nur FS20), Ein-für-Zeitdauer-dannach-alter-Zustand und vieles mehr.&lt;br /&gt;
&lt;br /&gt;
Was also ein Infrarot-Bewegungsmelder bei Auslösung sendet und auch was eine Fernbedienungstaste sendet ist einstellbar. Wenn jetzt zum Beispiel an einer Fernbedienung auf Tastendruck nicht ON sondern Ein-für-Zeitdauer (ON-FOR-TIMER) gesendet wird, wird&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB:on set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
seltsamerweise nicht auslösen, obwohl die richtige Taste (und diese auch nicht zu lang) gedrückt wurde.&lt;br /&gt;
&lt;br /&gt;
Auch wenn man sich sicher ist, das Richtige in die Fernbedienung/Sensoren einprogramiert zu haben, ist ein einfacher Test immer, dies mit&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV notify TVFB set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
zu prüfen. Dieses notify löst immer aus, wenn &amp;quot;TVFB&amp;quot;  &#039;&#039;irgendetwas&#039;&#039; sendet, egal was. (Beachte: Man kann dann den Fernseher aber nicht mehr ausschalten, da auch die Austaste das notify auslöst und zum TV-Aktor nur &amp;quot;on&amp;quot; sendet). &lt;br /&gt;
&lt;br /&gt;
Geht die Schaltung jetzt (kann man den Fernseher also jetzt EINschalten), liegt der Verdacht nahe, dass die Konfiguration des Senders / Sensors anders ist, als man denkt. Das Logfile, der EventMonitor oder ein Beobachtung von FHEM per Telnet mittels &amp;quot;inform&amp;quot; gibt Aufschluss, welcher Befehl tatsächlich empfangen wurde.&lt;br /&gt;
&lt;br /&gt;
== März 2014==&lt;br /&gt;
=== Zuverlässigkeit von FS20 Schaltungen erhöhen ===&lt;br /&gt;
FS20 Fernbedienungen senden bei Tastendrücken von mehr als 0,4 Sekunden anstatt ON bzw. OFF DIMUP bzw DIMDOWN.(Auch einige FBs anderer Systeme verhalten sich ähnlich)&lt;br /&gt;
&lt;br /&gt;
Das führt gelegentlich zu allgemein schlechter Bedienbarkeit (und schlechtem WAF), da 0,4 Sekunden relativ kurz ist und gerne aus versehen länger gedrückt wird. Das ist vor allem problematisch, wenn etwas geschaltet werden soll, was keinen Dimmer hat oder Dimmen nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Eine Konfiguration wie &lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB:on set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
hat also dann den Nachteil, dass bei versehentlich zu langem Tastendruck auf die Fernbedienung das TV nicht angeht. Da die meisten Nutzer unbewusst dazu neigen, bei Misserfolg die selbe Taste erneut aber länger zu drücken (was erneut keinen Erfolg zeigt) ist Frustration zu erwarten.&lt;br /&gt;
&lt;br /&gt;
Es kann daher speziell bei nicht dimmbaren Aktoren von Vorteil sein, auch dimmen abzufangen, z.B. durch eine zweite zusätzliche Definition:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_dimup notify TVFB:dimup set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist in der Regel einfacher, einige dieser zusätzlichen Definitionen einzufügen, als allen Bedienern des Systems zu erklären, dass man keinesfalls länger als 0,4 Sekunden drücken darf.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch beide Befehle in einer Definition durch Perlbefehle {} abfangen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB { if (&amp;quot;$EVENT&amp;quot; eq &amp;quot;on&amp;quot; || &amp;quot;$EVENT&amp;quot; eq &amp;quot;dimup&amp;quot;) { fhem(&amp;quot;set TV on&amp;quot;) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allerdings hat dies den Nachteil, dass jedes Event dieses define durchläuft und erst später geprüft wird, ob das Event überhaupt irgendetwas auslöst. &lt;br /&gt;
Z.B. wird&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB ...&amp;lt;/code&amp;gt; &lt;br /&gt;
auch durch TVFB off ausgelöst (oder unter bestimmten Bedungen sogar duch alle Events), nur um dann nach dem Perl Test festzustellen, dass doch nichts getan werden soll.&lt;br /&gt;
&lt;br /&gt;
Ressourcenschonender ist daher:&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB:on|TVFB:dimup set TV on &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Andere Möglichkeiten vergleiche: [[Trick der Woche#notify durch mehrere Ereignisse auslösen lassen|Notify durch mehrere Ereignisse auslösen lassen]] und [[Trick der Woche#Performance_von_Notifys|Performance von Notifys]]&lt;br /&gt;
&lt;br /&gt;
== Februar 2014==&lt;br /&gt;
=== Sequence nutzen ===&lt;br /&gt;
Man kann Aktionen statt mit einem Tastedruck auch mit einer Sequenz von Tastendücken auslösen. Das Format des Befehle ist:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; sequence &amp;lt;re1&amp;gt; &amp;lt;timeout1&amp;gt; &amp;lt;re2&amp;gt; [&amp;lt;timeout2&amp;gt; &amp;lt;re3&amp;gt; ...] &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei &amp;lt;re1&amp;gt; ...&amp;lt;re_n&amp;gt; die Aktionen sind und &amp;lt;timeout_n&amp;gt; der maximale Abstand der Tastendrücke in Sekunden.&lt;br /&gt;
&lt;br /&gt;
Angenommen, man wolle z.B. eine Lampe dann anschalten, wenn man zuerst Taste1 EIN, dann Taste2 AUS und dann wieder Taste1 EIN einer Fernbedienung drückt, könnte das konkret so aussehen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define MeineLampenSequenz1 sequence Btn1:on 0.5 Btn2:off 0.5 Btn1:on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zwischen jedem der Tastendrücke darf eine halbe Sekunde Abstand sein. Diese Definition selbst löst die Lampe nicht aus, sondern definiert nur wie die Sequenz aussehen soll. Um die Lampe bei erfolgreicher Betätigung der Sequenz auch einzuschalten, bedarf es zusätzlich etwas wie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define MeineLampe notify MeineLampenSequenz1:trigger set Lampe on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sequence kann man gut nutzen, um mit einer Fernbedienung mehr Funktionen zu schalten als Tasten zur Verfügung stehen. Ebenso könnte man damit simple Codeschlösser für Alarmanlagen bauen, z.B. um eine Anlage auszuschalten, wenn eine bestimmte Abfolge von Tasten gedrückt wird.&lt;br /&gt;
&lt;br /&gt;
Je nach Funksystem nimmt die Zuverlässigkeit aber rasch ab. Angenommen im Bereich FS20 (das System ist etwas unzuverlässiger ist als z.B. HomeMatic) seien 95% aller Funktsignale ungestört übertragbar, dann würden in der Praxis von 100 Tastendrücken an einer Fernbedienung 95x Erfolg zeigen und 5x fehlschlagen; das ist sicher tolerabel. &lt;br /&gt;
&lt;br /&gt;
Bei einer Sequenzlänge von nur 4 Tasten würde die kombinierte Erfolgsquote der Sequenz jedoch nur noch ca. 80% sein, zum Ausschalten einer Alarmanlage vermutlich bereits unpraktisch.&lt;br /&gt;
&lt;br /&gt;
== Januar 2014==&lt;br /&gt;
===isday===&lt;br /&gt;
Bekanntlich kann man  mit &amp;quot;isday&amp;quot; leicht testen ob es draussen hell ist oder nicht. isday ist eine Funktion des (automatisch geladenen) Moduls [[SUNRISE_EL]], das auch sunset und sunrise enthält.&lt;br /&gt;
&lt;br /&gt;
Problematisch bei isday ist die fehlende Möglichkeit, Sonnenaufgang und Untergang einzustellen (zumindest wenn man nicht 99_SUNRISE_EL.pm verändern will): isday ist wahr, wenn die Sonne im gegebenen Breitengrad theoretisch sichtbar ist. Wenn örtliche Gegebenheiten (Bebauung, Bäume, Tal etc.) eine Anpassung erfordern, kann man sich auch ein eigenes isday basteln, in dem man sunrise und sunset verwendet und dieses mit getrennten offsets versieht.&lt;br /&gt;
&lt;br /&gt;
Zuerst definiert man sich eine Variable (&amp;quot;dummy&amp;quot;) der anstelle isday eingesetzt werden soll, z.B.:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define Tageslicht dummy &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann wird diese mit sunset und sunrise befüllt:&lt;br /&gt;
&lt;br /&gt;
 define SetDummy1 at *{sunset(-3600)} set Tageslicht hell &lt;br /&gt;
 define SetDummy2 at *{sunrise(+1800)} set Tageslicht dunkel &lt;br /&gt;
&lt;br /&gt;
Jetzt kann für jeden Wechsel ein eigener Offset gewählt werden, im Beispiel 3600 Sekunden vor Sonnenuntergang und 1800 Sekunden nach Sonnenaufgang. Anstatt das Dummy &amp;quot;Tageslicht&amp;quot; mit den Werten &amp;quot;hell/dunkel&amp;quot; zu befüllen, kann natürlich auch 1/0 oder &amp;quot;Tag/Nacht&amp;quot; etc. verwendet werden, je nachdem was bei der Anwendung besser passt.&lt;br /&gt;
&lt;br /&gt;
Für höhere Ansprüche könnte hingegen das [[Twilight]]-Modul verwendet werden, das Dämmerungsstufen kennt.&lt;br /&gt;
&lt;br /&gt;
===Struktur von &amp;quot;else if&amp;quot; Verzweigungen===&lt;br /&gt;
 define ... notify ... {\&lt;br /&gt;
  if ... {\&lt;br /&gt;
   fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  else {\&lt;br /&gt;
   if ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Achtung: es muss tatsächlich &amp;quot;elsif&amp;quot; heissen und nicht &amp;quot;elseif&amp;quot; oder &amp;quot;else if&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Gilt für Perl Aufrufe. &lt;br /&gt;
Wer aktuell in FHEM neu einsteigt, kann auch den seit 2014 zur Verfügung stehenden FHEM Befehl [[DOIF]] verwenden, der komfortabler ist und zusätzliche Features aufweist.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2013==&lt;br /&gt;
===notify durch mehrere Ereignisse auslösen lassen===&lt;br /&gt;
Bekanntermassen löst&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
aus, wenn irgendein Ereignis vom Sender &amp;quot;MeinSchalter&amp;quot; eintrifft.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wird das notify jedoch nur ausgelöst, wenn dieses Ereignis eine &amp;quot;on&amp;quot; ist.&lt;br /&gt;
Wenn man aber möchte, das z.B. &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; auslöst (um etwa Dim-Befehle auszuschliessen) kann dies wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:(on|off) …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klammern sind wichtig, vergleiche eine Lösung, bei der zwei Sender alternativ das notify auslösen können:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on|MeinAndererSchalter:on …&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Selbstverständlich geht z.B. auch folgendes:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on|MeinAndererSchalter …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird ausgelöst wenn &amp;quot;MeinSchalter&amp;quot; das Ereignis &amp;quot;on&amp;quot; liefert oder &amp;quot;MeinAndererSchalter&amp;quot; irgendein Ereignis. Beachte hierzu jedoch den Tipp vom Dezember 2020 &amp;quot;Performance von Notifys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Aktoren über mehrere Funkschnittstellen ansprechen ===&lt;br /&gt;
Falls man mehrere Funkschnittstellen zur Reichweitenverlängerung hat (CUL / CUNO etc), und ein Aktor von beiden Funkschnittstellen in etwa gleich (schlecht) erreichbar ist, mag der Wunsch aufkommen, einen Funkbefehl über beide Schnittstellen auszusenden. Dies ist bei Funkprotokollen möglich, die kein echtes Pairing der Aktoren an die Funkschnittstelle erfordern, also z.B. FS20 oder Intertechno, nicht jedoch ohne weiteres bei HomeMatic.&lt;br /&gt;
&lt;br /&gt;
Problematisch ist aber, dass die Funkschnittstelle über IODev eindeutige je Aktor festgelegt werden muss, eine Zuordnung mehrerer IODevs ist nicht vorgesehen.&lt;br /&gt;
(wenn man IODev nicht setzt, wird per default die LETZTE definiert passende Schnittstelle verwendet)&lt;br /&gt;
&lt;br /&gt;
Dieses Problem kann mit einem Trick aber umgangen werden. Und zwar legt man den Aktor 2x mit gleicher Adresse aber abweichenden Namen und IOdevs an, z.B. so:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 define brenner_CUL1 FS20 11114244 11&lt;br /&gt;
 attr brenner_CUL1 IODev CUL1&lt;br /&gt;
 attr brenner_CUL1 room Keller&lt;br /&gt;
&lt;br /&gt;
 define brenner_CUL2 FS20 11114244 11&lt;br /&gt;
 attr brenner_CUL2 IODev CUL2&lt;br /&gt;
 attr brenner_CUL2 room Keller&lt;br /&gt;
&lt;br /&gt;
Ein Befehl der Art:&lt;br /&gt;
&lt;br /&gt;
 set brenner_CUL1,brenner_CUL2 on&lt;br /&gt;
&lt;br /&gt;
sendet den ON Befehl für den FS20 Aktor 11114244 11  jetzt tatsächlich über beide CULs aus!&lt;br /&gt;
&lt;br /&gt;
Achtung: Wenn die Schnittstellen gleichschnell angebunden sind, sollte vermutlich der [[Sendpool]] verwendet werden, da die Aussendungen sonst tatsächlich gleichzeitig erfolgen könnten und sich dann gegenseitig stören würden. Dieser Trick funktioniert ausserdem nur bei Befehlen, bei denen es im Zweifel egal ist, wenn sie beim Aktor 2x eintreffen. &lt;br /&gt;
&lt;br /&gt;
Bei HomeMatic lässt sich ein ähnlicher Effekt durch einrichten einer [[Virtueller Controller VCCU|virtuellen CCU]] erreichen.&lt;br /&gt;
&lt;br /&gt;
=== Retrycount bei FHTs ist überflüssig===&lt;br /&gt;
Das von der Funktion &#039;&#039;autocreate&#039;&#039; älterer FHEM Versionen beim Anlegen von FHT80 Heizungsreglern voreingetragene attribute &amp;quot;retrycount&amp;quot; hat in den allermeisten Fällen keine Wirkung, da es NUR greift, wenn man als Funkschnittstelle eine FHZ1X00PC verwendet und dann den Softbuffer einschaltet. Selbst wenn man diese Konfiguration nutzt, will gut überlegt werden, ob die Wirkung postiv ist: Bei ungenügender Empfangslage vergrössert es Kommunikationsprobleme eventuell sogar.&lt;br /&gt;
&lt;br /&gt;
Es kann also in der Regel entfernt oder auf den Wert &amp;quot;1&amp;quot; gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
 define Heizung_Bad FHT 060d&lt;br /&gt;
 attr Heizung_Bad retrycount 3       &amp;lt;=== Diese Zeile entfernen&lt;br /&gt;
&lt;br /&gt;
Siehe auch:[[Kommunikationsprobleme mit FHT]]&lt;br /&gt;
&lt;br /&gt;
== November 2013 ==&lt;br /&gt;
=== FS20 Funksteckdose sicherer schalten===&lt;br /&gt;
Seltsamerweise kommt es vor, das FS20 Aktoren - insbesondere die FS20 Funksteckdose - an der Grenze der Funkreichweite bestimmte Befehle eines Typs empfängt, andere aber nicht. Z.B. lässt sich die FS20 Steckdose zwar immer einschalten, aber oft nicht mehr aus (oder umgekehrt).&lt;br /&gt;
&lt;br /&gt;
Gelegentlich kann man die Zuverlässigkeit erhöhen, indem man statt dem nicht funktionierenden Befehl das Gegenteil mit &amp;quot;for-timer 1&amp;quot; verwendet.&lt;br /&gt;
&lt;br /&gt;
Im Fall, dass eine FS20 Steckdose sich also einwandfrei EINschalten lässt:&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
aber oft ein AUSschalten mittels&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA off&amp;lt;/code&amp;gt;&lt;br /&gt;
nicht funktioniert, kann man versuchen die Dose anstelle mit &amp;quot;off&amp;quot; mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA on-for-timer 1&amp;lt;/code&amp;gt;&lt;br /&gt;
auszuschalten.&lt;br /&gt;
&lt;br /&gt;
Analog kann man mit off-for-timer arbeiten, wenn sich Aktoren nicht einschalten lassen, ausschalten aber geht.&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Trick funtioniert ausdrücklich nur, wenn der &amp;quot;on/off-for-timer&amp;quot; Befehl im Aktor selber abgebildet wird. Daher ist der Trick vermutlich nicht auf andere Funksysteme übertragbar. z.B. unterstützt HM nur on-for-timer und Intertechno kennt keinen Timer.&lt;br /&gt;
&lt;br /&gt;
=== Mehrere Geräte zugleich schalten===&lt;br /&gt;
Ein Ereignis soll mehrere Geräte schalten:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1 on;;set Lampe2 on;;set FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aus Übersichtlichkeitsgründen können vor und nach den Semikolons auch Leerzeichen eingefügt werden (obwohl in einigen Dokumentation behauptet wird, dies dürfe man nicht machen):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1 on ;; set Lampe2 on ;; set FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn der Schaltbefehl bei allen Geräten gleich ist, kann man wie folgt zusammenfassen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1,Lampe2,FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Komma wird nicht [[Escapen in Perlbefehlen|escaped]] (verdoppelt), hier darf tatsächlich KEIN Leerzeichen vor oder nach dem Komma eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== Logfileinträge unterdrücken===&lt;br /&gt;
Das Attribute &amp;quot;verbose 0&amp;quot; verhindert, dass das Gerät Logfileinträge erzeugt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 define Funksteckdose FS20 22224222 01&lt;br /&gt;
 attr Funksteckdose verbose 0&lt;br /&gt;
&lt;br /&gt;
===FHT Lazy Mode benutzen===&lt;br /&gt;
Es gibt wenig Gründe, den FHT &amp;quot;Lazy Mode&amp;quot; nicht zu verwenden&lt;br /&gt;
 define Heizung_Bad FHT 060d&lt;br /&gt;
 attr Heizung_Bad lazy&lt;br /&gt;
&lt;br /&gt;
Dieser sorgt dafür, dass Temperaturänderungen (genau genommen alle Änderungen, auch z.B. date) nur übertragen werden, wenn sie nicht sowieso schon am FHT eingestellt sind und veringern die Funklast dadurch deutlich. &lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[Kommunikationsprobleme mit FHT]]&lt;br /&gt;
&lt;br /&gt;
== Oktober 2013 ==&lt;br /&gt;
=== Zuverlässigkeit von Wiedereinschalten erhöhen ===&lt;br /&gt;
Speziell bei FS20 Aktoren ist wegen des fehlenden Rückkanals nicht leicht erkennbar, ob ein Einschaltbefehl Wirkung gezeigt hat. Das bringt einen ganz schlechten WAF, wenn man z.B. mit einem FS20 Aktor eine Heizung ausschaltet und das Wiedereinschalten nach z.B. einer Stunde nicht klappt.&lt;br /&gt;
&lt;br /&gt;
Hier empfiehlt es sich, das Ausschalten mittels &lt;br /&gt;
:&amp;lt;code&amp;gt;set Heizungs_schalter off-for-timer 3584&amp;lt;/code&amp;gt;   (= fast eine Stunde)&lt;br /&gt;
zu erledigen. Da bei FS20 der off-for-timer Befehl im Aktor abgewickelt wird (und nicht durch FHEM), schaltet sich der Aktor auch dann garantiert wieder ein, wenn FHEM abstürzt, eine Funkstörung vorliegt oder ähnliches.  Bei Bedarf kann der Befehl off-for-timer zur  Verlängerung der Ausschaltzeit wiederholt werden. Dies kann z.B. nötig sein, wenn die Ausschaltung länger als 4,5 Stunden (15360 Sekunden, der Maximalwert des Timers) dauern soll.&lt;br /&gt;
&lt;br /&gt;
Achtung: dieser Trick funktioniert nur, wenn der Aktor &amp;quot;off-for-timer&amp;quot; selbst beherrscht. FS20 Geräte können das, HomeMatic können aber nur &amp;quot;on-for-timer&amp;quot;. Man kann off-for-timer mit HomeMatic trotzdem verwenden, aber in diesem Fall sendet FHEM den Einschaltbefehl nach der Timerzeit. InterTechno, RSL etc, können gar keinen Timer, hier sendet FHEM immer 2 Befehle im passenden Abstand.&lt;br /&gt;
&lt;br /&gt;
=== FS20 Timerzeiten ===&lt;br /&gt;
FS20 Timer werden in Sekunden angegeben. Es sind jedoch nicht alle Werte einstellbar. Da der Timer Wert in 7 Bit übertragen werden muss, sind nur 128 Werte möglich. Um mit diesen Werten im unteren Bereich möglichst fein aufzulösen, andererseits aber auch lange Zeiten zu ermöglichen, ist die Verteilung nicht linear. Einstellbar sind folgende Zeiten in Sekunden;&lt;br /&gt;
&lt;br /&gt;
0,25  0,5  0,75  1  1,25  1,5  1,75  2  2,25  2,5  2,75  3  3,25  3,5  3,75   &lt;br /&gt;
4  4,5  5  5,5  6  6,5  7  7,5  8  9  10  11  12  13  14  15  16  18  20  22   &lt;br /&gt;
24  26  28  30  32  36  40  44  48  52  56  60  64  72  80  88  96  104  112   &lt;br /&gt;
120  128  144  160  176  192  208  224  240  256  288  320  352  384  416   &lt;br /&gt;
448  480  512  576  640  704  768  832  896  960  1024  1152  1280  1408   &lt;br /&gt;
1536  1664  1792  1920  2048  2304  2560  2816  3072  3328  3584  3840  4096   &lt;br /&gt;
4608  5120  5632  6144  6656  7168  7680  8192  9216  10240  11264  12288   &lt;br /&gt;
13312  14336  15360 &lt;br /&gt;
(etwas übersichtlicher formatiert auch [[FS20 Allgemein#ON/OFF Befehle mit Time Parameter|hier]]).&lt;br /&gt;
 &lt;br /&gt;
Andere Zeiten werden von FHEM gerundet. Ein neues Setzen des Timer für FS20 löscht den alten Wert.&lt;br /&gt;
&lt;br /&gt;
Auch HomeMatic Aktoren beherrschen Time Parameter, im Gegensatz zu FS20 allerdings kein &amp;quot;off-for-timer&amp;quot;. Details dazu im Artikel [[HomeMatic Timerwerte]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Trick_der_Woche&amp;diff=40322</id>
		<title>Trick der Woche</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Trick_der_Woche&amp;diff=40322"/>
		<updated>2025-08-18T10:08:53Z</updated>

		<summary type="html">&lt;p&gt;TomLee: fhem-Dateien editieren&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite enthält Tipps und Tricks, die zu unbedeutend sind, einen eigenen Artikel zu rechtfertigen, alternative Schreibweisen/Lösungen für eine Problem darstellen, Ungenauigkeiten oder unklare Formulierungen in den offiziellen Dokumenten ergänzen und ähnliches. Jeder Eintrag ist typischerweise sehr kurz (wenige Zeilen lang) und beleuchtet vielleicht nur einen Aspekt von FHEM, er kann allgemeiner Natur sein, oder sich auf ein spezielles Gerät oder einen speziellen Anwendungsfall beziehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== August 2025==&lt;br /&gt;
=== FTUI(3) Dateien direkt in FHEMWEB bearbeiten ===&lt;br /&gt;
Im Attribut editFileList der [https://fhem.de/commandref_modular.html#FHEMWEB FHEMWEB]-Definition &#039;&#039;&#039;zusätzlich zu den Default-Werten&#039;&#039;&#039; eintragen:&lt;br /&gt;
 FTUI (www/tablet):$FW_dir.&#039;/tablet&#039;:^.*html$&lt;br /&gt;
 FTUI3 (www/ftui):$FW_dir.&#039;/ftui&#039;:^.*html$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== August 2022==&lt;br /&gt;
=== Update ===&lt;br /&gt;
Wenn der Befehl &amp;quot;Update&amp;quot; nicht funktioniert und insbesondere die Fehlermeldung &#039;&#039;Bad hostname &#039;fhem.de:80&#039;&#039;&#039; zurück gibt, kann es sinnvoll sein, den Parameter  -noSSL zu versuchen. Details dazu im Artikel [[Update]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Januar 2022==&lt;br /&gt;
=== günstiger Luftfeuchtesensor ===&lt;br /&gt;
Der [[HM-CC-TC Funk-Wandthermostat]] ist schon lange abgekündigt. Er wird derzeit oft recht günstig im Netz angeboten und eignet sich daher als billiger &amp;quot;StandAlone&amp;quot; Temperatur- und Luftfeuchtesensor, auch wenn er keinen Ventielantrieb steuern soll.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2020 ==&lt;br /&gt;
=== Performance von Notifys ===&lt;br /&gt;
Im Tipp vom Dezember 2013 [[Trick der Woche#notify durch mehrere Ereignisse auslösen lassen|notify durch mehrere Ereignisse auslösen lassen]] heisst es:&lt;br /&gt;
:&#039;&#039;[…] Wenn man aber möchte, dass z.B. &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; auslöst (um etwa Dim-Befehle auszuschliessen), kann dies wie folgt erreicht werden:&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:(on|off) …&amp;lt;/code&amp;gt;&lt;br /&gt;
Performanter ist allerdings:&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:o[nf]+  …&amp;lt;/code&amp;gt;&lt;br /&gt;
wobei &#039;&#039;&#039;o[nf]+&#039;&#039;&#039; eine &amp;quot;Regexp&amp;quot; für beliebige Zeichenketten ist, die mit &#039;&#039;&#039;o&#039;&#039;&#039; anfangen und &#039;&#039;&#039;n&#039;&#039;&#039; und/oder &#039;&#039;&#039;f&#039;&#039;&#039; enthalten, also (auch) on und off.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch:&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on|MeinSchalter:off … &amp;lt;/code&amp;gt;&lt;br /&gt;
verwendet werden.&lt;br /&gt;
Die letzten beiden Varianten sparen Ausführungszeit. Ganz allgemein ist es besser, im notify das Suchmuster mit einem [[Regulärer Ausdruck|regulären Ausdruck]] (Regexp) eng zu definieren.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on ... &amp;lt;/code&amp;gt;&lt;br /&gt;
ist performanter als&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter { if ($EVENT eq &amp;quot;on&amp;quot; ... &amp;lt;/code&amp;gt;&lt;br /&gt;
auch wenn das Ergebnis gleich ist.&lt;br /&gt;
&lt;br /&gt;
Allerdings ist &lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on ... &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas1 notify MeinSchalter:off ... &amp;lt;/code&amp;gt;&lt;br /&gt;
langsamer als&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchaltero[nf]+ { if ($EVENT eq &amp;quot;on&amp;quot;  ) { fhem( ) } else { fhem(&amp;quot;... &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die oben erwähnten &amp;quot;if&amp;quot; sind &amp;quot;perl if&amp;quot;s. Die Verwendung des FHEM Modul DOIF ist deutlich langsamer.  Die Betrachtung betrifft sowieso nur langsame Host-Systeme mit gleichzeitig vielen defines. Bei Verwendung z.b. einen Raspberry Pi 4 oder schnellerem Host dürften die Unterschiede vernachlässigbar sein.&lt;br /&gt;
&lt;br /&gt;
== Oktober 2020 ==&lt;br /&gt;
=== Entprellen ===&lt;br /&gt;
Will man ein notify innerhalb eines bestimmten Zeitraumes nur einmal auslösen lassen, auch wenn er in diesem Zeitraum mehrfach getriggered werden sollte, so bietet sich das [[Attribut]] &#039;&#039;&#039;disabledAfterTrigger&#039;&#039;&#039; an:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;notify_device&amp;gt; disabledAfterTrigger &amp;lt;Anzahl Sekunden&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Oktober 2019 ==&lt;br /&gt;
=== Funkstörungen durch leere Batterien ===&lt;br /&gt;
Unerklärliche Funkstörungen besonders im SlowRF Bereich (z.b. FS20) mit stark verminderter Reichweite von CULs, gestörter [[RFR CUL]] Kommunikation etc. gestörtem Empfang von Funktelegrammen aller Art können ihre Ursache darin haben, dass einige Geräte mit (fast) leeren Batterien unkontrolliert senden und dadurch den Kanal mit Störsignalen verschmutzen. Anfällig sind insbesondere ältere FHT Fenstersensoren wie der [[FHT80TF]], die mit fast leeren Batterien eine Art Rauschen aussenden und damit die &#039;&#039;&#039;komplette&#039;&#039;&#039; FS20 Kommunikation lahmlegen können, Störungen beeinflussen auch andere Funkprotokolle im selben Frequenzbereich, wie z.b. HM.&lt;br /&gt;
Also im Falle unerklärlicher und weitreicher Funkstörungen die Batterien aller Geräte überprüfen.&lt;br /&gt;
&lt;br /&gt;
== Februar 2019 ==&lt;br /&gt;
=== Unterräume anlegen ===&lt;br /&gt;
[[Datei:Unterraeume.png|350px|thumb|right|Beispiel für einen gegliederten Raum &amp;quot;Steuerung&amp;quot;]]&lt;br /&gt;
In [[FHEMWEB]] besteht neben der Möglichkeit, Geräte dadurch übersichtlich anzuordnen, indem diese Gruppen und einfachen Räumen zugeordnet werden, auch die Möglichkeit, Räume weiter zu gliedern und Unterräume zu verwenden. Dazu wird nach der Angabe des Hauptraums der Unterraum, getrennt durch ein &amp;quot;-&amp;gt;&amp;quot; angegeben. Beispiele:&lt;br /&gt;
 attr &amp;lt;DEVICENAME&amp;gt; room Steuerung-&amp;gt;Logik&lt;br /&gt;
 attr &amp;lt;DEVICENAME&amp;gt; room Steuerung-&amp;gt;Heizung&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Legt man zusätzlich einen Raum &#039;&#039;Steuerung&#039;&#039; an, erscheint dieser als zusätzlicher Eintrag in der Raumliste.&lt;br /&gt;
&lt;br /&gt;
== Januar 2019 ==&lt;br /&gt;
=== HomeMatic IP ===&lt;br /&gt;
Das [[HomeMatic IP]]-Protokoll unterscheidet sich deutlich vom bisherigen HomeMatic Protokoll, im Grunde ist es ein anderes System, das nur dem Namen nach dem älteren HomeMatic gleicht. HM-IP Geräte können aktuell (Anfang 2019) nur über eine systemeigene Zentrale CCU2 (als physisch vorhandenes Interface) und die HomeMatic-Module in FHEM integriert werden, sind in FHEM jedoch &#039;&#039;&#039;nicht&#039;&#039;&#039; unmittelbar als Homematic-Geräte ansprechbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dezember 2018 ==&lt;br /&gt;
===HomeMatic Heizungsregler Uhrzeit einstellen===&lt;br /&gt;
HomeMatic Thermostate / Heizungsregler  wie der HM-CC-TC der der HM-TC-IT-WM-W-EU etc. synchronisieren ihre Uhrzeit täglich etwa gegen Mitternacht mit der Zentrale. Man kann dieses Update aber jederzeit erzingen durch den Befehl  &lt;br /&gt;
 set &amp;lt;DEVICENAME&amp;gt; sysTime&lt;br /&gt;
&lt;br /&gt;
== November 2018 ==&lt;br /&gt;
===HomeMatic Heizunggeräte gebraucht gekauft===&lt;br /&gt;
HomeMatic Heizunggeräte gebraucht gekauft und jetzt lassen sie sich nicht richtig peeren oder pairen?&lt;br /&gt;
Das Problem ist meistens, dass die Geräte noch mit der Zentrale des Verkäufers gepairt oder mit anderen Geräten gepeert sind. &lt;br /&gt;
Mit Thermostaten wie der [[HM-CC-TC Funk-Wandthermostat]] oder der Nachfolger [[HM-TC-IT-WM-W-EU Funk-Wandthermostat AP]] können mit Ventilantrieben wie dem [[HM-CC-VD Funk-Stellantrieb]] nur gepeert werden, wenn &lt;br /&gt;
* die Thermostaten nicht selbst schon mit einer Zentrale (im FHEM Umfeld also z.b. einer [[Virtueller Controller VCCU]] oder [[HM-[[HM-CFG-LAN LAN Konfigurations-Adapter]] oder ähnliches) gepairt wurden&lt;br /&gt;
* die Ventilantriebe nicht selbst mit einer Zentrale gepairt oder mit einem Thermostaten gepeert wurden.&lt;br /&gt;
&lt;br /&gt;
Es ist daher sinnvoll zuerst alle Geräte zurückzusetzen, da viele Verkäufer dies vergessen. Wie das geht steht in der Anleitung.&lt;br /&gt;
Beispiele:&lt;br /&gt;
* HM-CC-TC -&amp;gt; MENU lange drücken, dann Sonderfunktion &amp;quot;RES&amp;quot; anwählen, mit OK-Taste bestätigen&lt;br /&gt;
* HM-CC-VD -&amp;gt; Anlernknopf 10 Sekunden lang drücken. Der Antrieb geht in Zustand A2, nachdem er das Ventil 1x auf- und zugefahren hat geht er in A3, Knopf nochmals drücken.&lt;br /&gt;
* HM-TC-IT-WM-W-EU -&amp;gt; Batterien entfernen, alle 3 Tasten gedrückt halten, Batterien einlegen, warten bis &amp;quot;rES&amp;quot; im Display erscheint, Tasten loslassen&lt;br /&gt;
&lt;br /&gt;
== Januar 2018 ==&lt;br /&gt;
=== at absolutem Datum ===&lt;br /&gt;
Vielen ist nicht klar, dass man mit dem &amp;quot;define … at&amp;quot; auch einfach ein absolutes Datum definieren kann (obwohl es in der Commandref steht). Anstatt umfangreicher DOIF Konstrukte oder &amp;quot;define … at&amp;quot; die täglich ablaufen und testen ob der gewünschte Tag schon erreicht ist, geht auch ein einfaches:&lt;br /&gt;
&lt;br /&gt;
 define Licht_Neujahr_2019 at 2019-01-03T06:01:01 set Licht1 on&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Allgemein: &lt;br /&gt;
 define &amp;lt;name&amp;gt; at [&amp;lt;datespec&amp;gt;] &amp;lt;command&amp;gt; &lt;br /&gt;
wobei &amp;lt;datespec&amp;gt; =  (YYYY-MM-DDTHH:MM:SS) (also in ISO8601 Schreibweise).&lt;br /&gt;
Wichtig ist die Angabe mit Sekunden, die nicht weggelassen werden können.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2017 ==&lt;br /&gt;
=== perl Version ===&lt;br /&gt;
Gelegentlich taucht die Frage auf, welche perl Version zum Betrieb von FHEM minimal erforderlich ist. Bedauerlicherweise lässt sich das aber aktuell nicht definitiv bestimmen.&lt;br /&gt;
Rudolf König testet zur Zeit (Ende 2017) mit v5.16 (5 Jahre alt) und v5.24 (ca. 1 Jahr alt). &lt;br /&gt;
Sollte sich herausstellen, dass eines seiner Module (vor allem fhem.pl selbst) nicht mit der jeweils &#039;&#039;aktuellen&#039;&#039; perl Version funktioniert, so wird das Modul entsprechend kompatibel gemacht.&lt;br /&gt;
Andererseits verwendet Rudolf König nach eigener Aussage (bewusst) keine Features, die eine höhere Version als perl 5.8.3 (immerhin älter als 13 Jahre) voraussetzen. Tatsächlich zeigen aktuelle Installation auf relativ alten BuffaloLinkstation Systemen, dass FEHM mit perl 5.8.3 prinzipiell lauffähig ist.&lt;br /&gt;
&lt;br /&gt;
Rudolf König prüft als Maintainer von fhem.pl aber nicht, welche Mindestversionen andere Entwickler in Ihren Modulen benötigen. Es ist daher möglich oder sogar wahrscheinlich, das einzelne Module höhere Versionen als 5.8.3 benötigen.&lt;br /&gt;
&lt;br /&gt;
Es gibt aktuell keinen Weg, die Mindestanforderungen z.b. automatisiert zu ermitteln.&lt;br /&gt;
&lt;br /&gt;
== November 2017 ==&lt;br /&gt;
=== Grundlastmodul ===&lt;br /&gt;
Mit einem Grundlastmodul ist es möglich, LED Leuchtmittel an einem Schaltaktor / Dimmer zu betreiben. Dies ist bei manchen nicht möglich, da einige LEDs nachglimmen oder flackern. Das Grundlastmodul, welches parallel zum Verbraucher angeschlossen wird, kann diesen Effekt aufheben, da ein Verbraucher mit ohmscher Last simuliert wird.&lt;br /&gt;
Das Modul ermöglicht eventuell auch den Betrieb eines [[RSL 2-Draht Einbauschalter]]s, der bei LED Leuchtmitteln ansonsten nicht eingesetzt werden kann, da zum Betrieb eine Restspannung über den Verbraucher benötigt wird, der bei LED Lampen mit Vorschaltgerät nicht vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
In Frage kommt z.b. ein Eltako ELTA Grundlastelement GLE / PTC, das ca. 5-8 Euro kostet.&lt;br /&gt;
Technisch handelt sich dabei um einen PTC, also einen Widerstand mit positivem Temperaturkoeffizient, d.h. der Widerstand sinkt deutlich, wenn das Element kälter wird. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das genannte Grundlastelement hat folgende Daten: &lt;br /&gt;
 Kaltwiderstand: 3500 Ω&lt;br /&gt;
 Einschaltstrom bei 230 V: 65 mA (ca. 15 W)&lt;br /&gt;
 Verlustleistung nach 60 Sekunden: 0,65 W &lt;br /&gt;
&lt;br /&gt;
Im kalten Zustand lässt der PTC bei 230 Volt einen Strom von ca. 0,065 Ampere zu.  &lt;br /&gt;
Das reicht, um von Schaltaktoren, Freischaltern, Dimmern etc. als die erforderliche Grundlast erkannt zu werden.&lt;br /&gt;
Wird der Stromkreis eingeschaltet, fliesst auch tatsächlich Strom durch den PTC, der sich dadurch schnell erwärmt (das Element wird tatsächlich sogar relativ heiss). Dadurch steigt steigt der Widerstand auf ca 50000-60000 Ohm an und die Verlustleistung sinkt auf unter 1 Watt. Der PTC regelt sich jetzt selber auf eine bestimmte Temperatur und Widerstand ein.&lt;br /&gt;
&lt;br /&gt;
Wird ausgeschaltet, so fliest über den PTC immer noch ein kleiner Reststrom von ca 0,005 Ampere, der als Grundlast reicht, um z.b. Spannungen abzubauen, die LEDs nachflackern lassen, dieser steigt mit Erkalten rasch an, dadurch werden auch Schalter wie die [[RSL 2-Draht Einbauschalter]] mit genug Strom versorgt.&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann also auch ein PTC mit diesen Werten und einer Leistung von ca. 20 Watt selbst gebaut werden, der Preis der Einzelteile liegt bei unter 2 Euro. Das Eltako Element ist bereits mit Isolierung und Anschlussleitungen versehen, mit eigner Arbeitszeit ist der Preisvorteil beim Selberbau also gering.&lt;br /&gt;
&lt;br /&gt;
== Februar 2017 ==&lt;br /&gt;
=== at Zeiten ===&lt;br /&gt;
 at 03:00      -&amp;gt;  1x um 3 Uhr (wann immer das nächste mal 3 Uhr ist, ggf. erst morgen)&lt;br /&gt;
 at *03:00     -&amp;gt;  jeden Tag um 3 Uhr&lt;br /&gt;
 at +03:00     -&amp;gt;  in 3 Stunden&lt;br /&gt;
 at +*03:00    -&amp;gt;  in 3 Stunden und dann alle 3 Stunden erneut&lt;br /&gt;
 at +*{4}03:00 -&amp;gt;  in 3 Stunden und dann alle 3 Stunden erneut, aber nur 4x ausführen.&lt;br /&gt;
&lt;br /&gt;
== Oktober 2016 ==&lt;br /&gt;
=== Grundlagen der Heizungssteuerung ===&lt;br /&gt;
Der Artikel [[Grundlagen der Heizungssteuerung]] soll einen zentralen Einstiegspunkt und eine Übersicht der Möglichkeiten insb. für Neulinge in FHEM bieten.&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung für Geräte ohne Batteriestatus ===&lt;br /&gt;
Es gibt Möglichkeiten um auch bei Geräten ohne Batteriestatus-Reading eine schwache Batterie erkennen zu können: [[Batterie%C3%BCberwachung#Ger.C3.A4te_ohne_Batteriestatus|Geräte ohne Batteriestatus]].&lt;br /&gt;
&lt;br /&gt;
== Mai 2016 ==&lt;br /&gt;
=== DbLog reparieren ===&lt;br /&gt;
Sollte ein fhem mit DbLog Probleme machen, oder auf der SQL-Konsole Fehler werfen, so ist eine Reparatur der DB fällig. Das ist auf der Kommandozeile verhältnismäßig einfach möglich und wird im Kapitel [[DbLog#Datenbank reparieren]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== DbLog bearbeiten ===&lt;br /&gt;
Unerwünschte Einträge in den Loggings treten immer wieder mal auf. Wie man dies in einer Datenbank korrigiert, dazu gibt das Kapitel [[DbLog#Bearbeitung von Datenbank-Einträgen]] eine erste Einführung.&lt;br /&gt;
&lt;br /&gt;
=== Pollenflug ===&lt;br /&gt;
In dieser schönen Jahreszeit werden manche durch Heuschnupfen geplagt. Auf der Seite [[Pollenflug]] wird beschrieben, wie man eine Pollenvorhersage in fhem einbinden kann - hilft zwar nicht gegen das Niesen, ist aber trotzdem ganz informativ... ;-)&lt;br /&gt;
&lt;br /&gt;
== April 2016 ==&lt;br /&gt;
=== HomeMatic und VCCU ===&lt;br /&gt;
HomeMatic Nutzer sollten unbedingt eine [[Virtueller Controller VCCU|VCCU]] einrichten und nutzen.&lt;br /&gt;
Die Einrichtung ist unaufwändig und schafft jede Menge Vorteile, auch beim Einsetzen nur einer Schnittstelle wie z.B. einem [[HM-CFG-LAN LAN Konfigurations-Adapter]]. Auch die nachträglich Einrichtung ist problemlos, sofern vorher nur ein I/O Gerät (&amp;quot;Funkschnittstelle&amp;quot;) verwendet wurde.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2015 ==&lt;br /&gt;
===defmod===&lt;br /&gt;
In vielen Fällen will man mit einer Aktion gleichzeitig eine andere Aktion bereits für später festlegen, z.b. nach Einschalten  einer Heizung durch einen Bewegungsmelder diese eine Stunde später wieder ausschalten.&lt;br /&gt;
&lt;br /&gt;
Dies kann z.B. durch ein Konstrukt dieser Art erledigt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Heizung_an notify Bewegung set HZG_WZ desired-temp 22 ;; define reset_Heizung at +01:00:00 set HZG_WZ desired-temp 16&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nachteilig ist, dass bei einer weiteren Auslösung des Bewegungsmelders die Heizzeit nicht verlängert wird, da eine Neudefinition von &#039;&#039;&#039;reset_Heizung&#039;&#039;&#039; mit der Fehlermeldung &#039;&#039;&#039;reset_Heizung already exists, delete it first&#039;&#039;&#039; quittiert wird. Die Lösung bisher war, das alte &#039;&#039;&#039;reset_Heizung&#039;&#039;&#039; zunächst zu löschen und dann erneut mit neuem Zeitstempel anzulegen:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Heizung_an notify Bewegung set HZG_WZ desired-temp 22 ;; delete reset_Heizung ;; define reset_Heizung at +01:00:00 set HZG_WZ desired-temp 16&amp;lt;/code&amp;gt;&lt;br /&gt;
Aber auch dieses umständliche Konstrukt hat noch einen Nachteil: Es erzeugt bei einer ersten Auslösung eine Fehlermeldung, weil &#039;&#039;&#039;reset_Heizung&#039;&#039;&#039; noch nicht exisitert und daher nicht gelöscht werden kann.  Dies liesse sich abfangen, was die Konstruktion weiter verkomplizieren würde.&lt;br /&gt;
&lt;br /&gt;
Daher hat Rudolf König mit FHEM 5.6 den neuen Befehel &amp;quot;defmod&amp;quot; eingeführt, der ein noch nicht existieredendes define neu anlegt (wie &amp;quot;define&amp;quot;), eine bereits vorhandenes aber direkt ändert (wie &amp;quot;delete&amp;quot; und danach &amp;quot;define&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Dadurch lässt sich verkürzt schreiben:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Heizung_an notify Bewegung set HZG_WZ desired-temp 22 ;; defmod reset_Heizung at +01:00:00 set HZG_WZ desired-temp 16&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== April 2015 ==&lt;br /&gt;
===FS20 Timer===&lt;br /&gt;
FS20 Aktoren beherrschen zwei verschiedene Timer-Methoden.&lt;br /&gt;
&lt;br /&gt;
Angenommen ein FS20 Device heisse &amp;quot;Lampe&amp;quot; und sei z.B. ein [[FS20_SU_Unterputz-Funk-Schalter|FS20 SU]] (Unterputzschalter), dann kann man mit FHEM sowohl &lt;br /&gt;
:&amp;lt;code&amp;gt; set Lampe on-for-timer 30&amp;lt;/code&amp;gt;&lt;br /&gt;
verwenden um die Lampe 30 Sekunden einzuschalten, aber auch zunächst in den FS20 SU die maximale Einschaltdauer einprogrammieren:&lt;br /&gt;
:&amp;lt;code&amp;gt; set Lampe timer 30&amp;lt;/code&amp;gt;&lt;br /&gt;
Dannach wird jedes normale&lt;br /&gt;
:&amp;lt;code&amp;gt; set Lampe on&amp;lt;/code&amp;gt;&lt;br /&gt;
die Lampe für nur 30 Sekunden einschalten.&lt;br /&gt;
&lt;br /&gt;
Als Timerwerte kommen in beiden Fällen die bekannten [[Trick_der_Woche#FS20_Timerzeiten|128 Sekundenwerte]] von 0,25 Sekunden bis Etwa 4,5 Stunden in Frage.&lt;br /&gt;
&lt;br /&gt;
Es ist offenbar nicht bei allen Aktoren möglich einen einmal eingestellten Timer zu löschen, neue Werte eingeben aber sehr wohl.&lt;br /&gt;
&lt;br /&gt;
Mehr hier: [[FS20_Allgemein#Gerätetimer setzen / löschen|FS20 timer]].&lt;br /&gt;
&lt;br /&gt;
== Februar 2015 ==&lt;br /&gt;
=== 1-wire am GPIO4-Port des RaspberryPi funktioniert nicht mehr nach Systemupdate ===&lt;br /&gt;
Es kann passieren, dass nach einem Systemupdate (apt-get update oder apt-get dist-upgrade) die 1-wire-Geräte am GPIO4-Port plötzlich nicht mehr funktionieren. Eine Problemlösung dazu ist im Artikel &amp;quot;[[Raspberry Pi und 1-Wire#1-wire am GPIO4-Port funktioniert nicht mehr nach Systemupdate]]&amp;quot; beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Backup der Konfiguration (fhem.cfg und fhem.state) bei jedem &amp;quot;save&amp;quot; ===&lt;br /&gt;
Der nachfolgende Codeschnipsel erstellt bei jedem &amp;quot;save&amp;quot; eine Kopie der aktuellen [[Konfiguration]] (fhem.cfg und fhem.state) in ein Verzeichnis &amp;quot;backup_cfg-state&amp;quot; welches unter /opt/fhem/ zu finden ist. Somit kann bei einem Fehler jederzeit auf den letzten Stand zurückgegangen werden.&lt;br /&gt;
Zuerst ins FHEM Befehlsfeld den folgenden Befehl eingeben:&lt;br /&gt;
:&amp;lt;code&amp;gt;{ `mkdir backup_cfg-state` } &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach folgendes [[notify]] anlegen:&lt;br /&gt;
 define backupCfg notify global:SAVE {\&lt;br /&gt;
 my $now = TimeNow();; $now =~ s/ /_/g;; \&lt;br /&gt;
 `cp $attr{global}{configfile} ./backup_cfg-state/fhem.cfg.$now`;;\&lt;br /&gt;
 `cp $attr{global}{statefile} ./backup_cfg-state/fhem.state.$now`;;\&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
Quelle: {{Link2Forum|Topic=30873|Message=234412|LinkText=FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
== Januar 2015 ==&lt;br /&gt;
=== CUL &amp;amp; CO über Serial ID-einbinden ===&lt;br /&gt;
Bei mehreren USB-Geräten kann es vorkommen, dass sie vertauscht werden z.B. &#039;&#039;/dev/ttyUSB0&#039;&#039; zu&#039;&#039; /dev/ttyUSB1&#039;&#039; oder &#039;&#039;/dev/ttyACM0&#039;&#039; zu &#039;&#039;/dev/ttyACM1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um dies zu umgehen, kann man sie über ihre Serial-ID in FHEM einbinden.&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl zeigt die Serial-ID:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;ls -l /dev/serial/by-id&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier die Beispielausgabe eines CUL868, JeeLink, RFXtrx und eines CUL433&lt;br /&gt;
&lt;br /&gt;
 user@xxxx:~# ls -l /dev/serial/by-id&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 23:34 usb-busware.de_CUL868-if00 -&amp;gt; ../../ttyACM0&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 13:26 usb-FTDI_FT232R_USB_UART_A901RQ9F-if00-port0-&amp;gt; ../../ttyUSB0&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 13:26 usb-RFXCOM_RFXtrx433_A1WZWL5Y-if00-port0-&amp;gt; ../../ttyUSB1&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 21:29 usb-busware.de_CUL433-if00 -&amp;gt; ../../ttyACM1 &lt;br /&gt;
&lt;br /&gt;
Damit lässt sich folgende Definition erstellen:&lt;br /&gt;
&lt;br /&gt;
z.B. für einen CUL868&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define CUL868 CUL /dev/serial/by-id/usb-busware.de_CUL868-if00@9600 1134&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder einen JeeLink&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define Jeelink JeeLink /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A901RQ9F-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einschränkung:&#039;&#039;&#039; Bei CULs von Busware lassen sich nur CUL433 und CUL868 unterscheiden. Zwei CUL868 haben z.B. immer die gleiche Serial-ID.&lt;br /&gt;
&lt;br /&gt;
=== HM LAN Konfig-Adapter Antenne verbessern===&lt;br /&gt;
Die Antenne des [[HM-CFG-LAN LAN Konfigurations-Adapter]] kann man mit etwas Bastelgeschick verlängern um den Empfang zu verbessern. &lt;br /&gt;
&lt;br /&gt;
Sinnvoll ist die Verlängerung auf 1/2 Lambda  (868MHz = 17,27 cm) oder gar 1 Lambda.&lt;br /&gt;
1 Lambda Antennen haben starke Richtwirkung in Form eines gedachten Zylinders, dessen Mittelachse die Antenne ist.&lt;br /&gt;
D.h., Alles was sich in Richtung des Anfangs und des Endes des Antennedrahtes befindet, hat schlechteren Empfang als mit einer kurzen Antenne. Daher muss man die Antenne ggf. genauer ausrichten.&lt;br /&gt;
&lt;br /&gt;
Anleitungen dazu werden an verschiedenen Stellen veröffentlicht, z.B. in &lt;br /&gt;
[http://www.ip-symcon.de/forum/threads/18411-Umbau-HM-LAN-Adapter-auf-Lambda-1-2-Dipol-Antenne diesem Beitrag] im IP-Symcon Forum (anders als der Namen der Anleitung vermuten lässt, liegt hier kein Dipol vor, sondern eine &amp;quot;normale&amp;quot; 1 Lambda Antenne.)&lt;br /&gt;
&lt;br /&gt;
Prinzipiell so dünnen Draht wie möglich verwenden.&lt;br /&gt;
&lt;br /&gt;
Wer noch mehr rausholen will, kann auch zusätzlichen Aufwand betreiben und die Antenne etwas von der Elektronik entfernen, die nämlich Störstrahlung in die Antenne einkoppelt. Oder eine Groundplane bauen.&lt;br /&gt;
Ein Anleitung für die CCU (analog auch für den HM LAN Konfig-Adapter einsetzbar) gibt es [http://www.techwriter.de/beispiel/funkeige.htm hier].&lt;br /&gt;
&lt;br /&gt;
== Dezember 2014 ==&lt;br /&gt;
=== FHT80TF als &amp;quot;Prüfsender&amp;quot; einsetzen  ===&lt;br /&gt;
Da der [[FHT80TF-2]] günstig ist und seinen Zustand ca. alle zwei Minuten sendet, kann er gut zum Ermitteln der Funklage von [[SlowRF]] Komponenten genutzt werden, auch wenn diese nicht senden. Den RSSI einer FS20 Schaltsteckdose kann man z.B. nicht wissen, da die Dose nur ein Empfänger ist. Wenn eine Dose nicht gut funktioniert und man den Verdacht hat, dass sie funktechnisch ungünstig liegt, kann man einen [[FHT80TF-2]] neben die Steckdose legen und man bekommt nach zwei Minuten einen Wert, der (trotz umgekehrter Funkrichtung) gut genug ist, um einem Hinweise zu geben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== November 2014 ==&lt;br /&gt;
=== FS20 Adressschema und die Rolle des Hauscodes  ===&lt;br /&gt;
[[FS20_Allgemein#FS20_Adressierungsschema_.28Vorschlag.29]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Oktober 2014 ==&lt;br /&gt;
=== Aktor für Wanddosen ohne Nulleiter  ===&lt;br /&gt;
Es gibt viele Aktoren die man in Einbaudosen hinter Schaltern einbauen kann. Oft scheitert deren Nutzung aber daran, dass in vielen Elektroinstalltionen in der Einbaudose eines (Licht)schalters kein Neutralleiter (Nulleiter) verlegt ist, den die meisten Aktoren zur eigenen Stromversorgung brauchen. Hier kann der [[RSL 2-Draht Einbauschalter]] helfen, der auch ohne Neutraleiter funktioniert und kompatibel zu InterTechno ist. Er lässt sich z.B. mit einem CUL(433) schalten. Problematisch ist damit allerdings das Schalten von LED Lampen.&lt;br /&gt;
&lt;br /&gt;
== August 2014 ==&lt;br /&gt;
=== Perl-Skripte Online testen  ===&lt;br /&gt;
Im Internet existieren Webseiten auf denen man Perl-Code online testen kann. Beispielsweise auf [http://www.tutorialspoint.com/execute_perl_online.php codingground] kann man Code zum Testen eingeben und die Auswirkungen betrachten. Dies eignet sich zur schnellen Fehleranalyse oder um Perl zu lernen. Natürlich lassen sich keine FHEM-Besonderheiten nutzen.&lt;br /&gt;
&lt;br /&gt;
== Juli 2014 ==&lt;br /&gt;
=== Funklast reduzieren===&lt;br /&gt;
Bewegungsmelder erzeugen in der Regel eine recht hohe Funklast, wenn sie oft ausgelöst werden, also z.B. Licht in einem Zimmer schalten sollen.&lt;br /&gt;
&lt;br /&gt;
Konstruktionen der Art:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* set Licht_Flur on-for-timer 256&amp;lt;/code&amp;gt;&lt;br /&gt;
haben daher den Nachteil bei viel Bewegung im Flur und je nach Einstellung des Sendeabstandes des Bewegungsmelders mindestens alle 120 Sekunde oder öfter ein &lt;br /&gt;
:&amp;lt;code&amp;gt;on-for-timer 256&amp;lt;/code&amp;gt;&lt;br /&gt;
zu senden. Das erzeugt eine hohe Funklast, speziell wenn der Aktor ein SlowRF Gerät ist (z.B. FS20 Unterputzschalter).&lt;br /&gt;
In solchen Fällen kann es helfen, nur dann einen Befehl zu senden, wenn das Licht nicht schon an ist:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* { if (Value(&amp;quot;Licht_Flur&amp;quot;) eq &amp;quot;off&amp;quot;) { fhem (&amp;quot;set Licht_Flur1 on-for-timer 256&amp;quot;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
Nachteilig ist aber, dass eine Auslösung innerhalb 256 Sekunden die Einschaltzeit nicht verlängert. Dies kann man umgehen, indem man nicht on-for-timer verwendet, sondern den Aktor selber verzögert auschaltet und bei weiteren Auslösungen nur die Verzögerung erneut anlegt:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* { if (Value(&amp;quot;Licht_Flur1&amp;quot;) eq &amp;quot;off&amp;quot;) { fhem (&amp;quot;set Licht_Flur on ;; define FlurLicht_aus at +00:04:16 set Licht_Flur off&amp;quot;) } else { fhem (&amp;quot;delete FlurLicht_aus ;; define FlurLicht_aus at +00:04:16 set Licht_Flur off&amp;quot;) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
Durch den relativ neuen Befehl &amp;quot;defmod&amp;quot; kann ausserdem das Löschen und neu Anlegen zusammengefasst werden, sieh Tipp Dezember 2015&lt;br /&gt;
&lt;br /&gt;
== Juni 2014 ==&lt;br /&gt;
=== Batteriestatus bei HomeMatic Devices aktivieren===&lt;br /&gt;
Zumindest einige (wenn nicht alle) batteriegespeisten HM-Geräte können Batteriemeldungen senden, tun dies in der normalen Konfiguration aber nicht.&lt;br /&gt;
Dazu muss das Register cyclicInfoMsg auf on gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
Wie man das macht steht z.B. hier&lt;br /&gt;
[[HM-SEC-SC_Tür-Fensterkontakt#Batteriestatus_aktivieren]]&lt;br /&gt;
und hier&lt;br /&gt;
[[HomeMatic_Type_ThreeState]]&lt;br /&gt;
&lt;br /&gt;
== Mai 2014 ==&lt;br /&gt;
=== Dummywert mit aktueller Uhrzeit versehen in anderen Dummy kopieren===&lt;br /&gt;
Der Inhalt von Dummy1 soll erweitert um  Uhrzeit und Datum in Dummy2 kopiert werden (z.B. um die Urzeit der letzten Auslösung einer Alarmanlage anzuzeigen)&lt;br /&gt;
:&amp;lt;code&amp;gt;{ fhem(&amp;quot;set dummy2 &amp;quot; . (Value(&amp;quot;Dummy1&amp;quot;).&amp;quot; &amp;quot;.TimeNow()) )  } &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zwei Dummywerte in einen anderen Dummy kopieren ===&lt;br /&gt;
Der String in Dummy1 soll um den String in Dummy2 erweitert und nach Dummy3 kopiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;{ fhem(&amp;quot;set Dummy3 &amp;quot;.(Value(&amp;quot;Dummy1&amp;quot;)+Value(&amp;quot;Dummy2&amp;quot;))) } &amp;lt;/code&amp;gt;&lt;br /&gt;
(Achtung: &amp;quot;+&amp;quot;  ist Zahlen addieren, &amp;quot;.&amp;quot; ist String konkatenieren / verketten)&lt;br /&gt;
&lt;br /&gt;
== April 2014==&lt;br /&gt;
=== Code sparen ===&lt;br /&gt;
Wer Definitionen wie die aus dem März zum [[Trick der Woche#Zuverlässigkeit von FS20 Schaltungen erhöhen|Abfangen von Fehlbedienungen]] verwendet, kann durch eine ELSE Erweiterung auch gleich das Auschalten erledigen.&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TV { if (&amp;quot;$EVENT&amp;quot; eq &amp;quot;on&amp;quot; || &amp;quot;$EVENT&amp;quot; eq &amp;quot;dimup&amp;quot;) { fhem(&amp;quot;set TV on&amp;quot;) } else { fhem(&amp;quot;set TV off&amp;quot;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierdurch schaltet ON oder versehentlich zu langes Drücken (also DIMUP) den Fernseher ein, jeder &#039;&#039;andere&#039;&#039; Tastendruck (also insbesondere die OFF Taste oder zu langes Drücken der OFF Taste -&amp;gt; DIMDOWN) den Fernseher aus.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist, dass die Fernbedienung standardkonfiguriert ist, siehe auch nächster Tip.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration eines FS20 Senders prüfen ===&lt;br /&gt;
Gelegentlich reagieren bestimmte notifys nicht, die von Sendern (Fernbedienungen, Sensoren oder Schaltern) ausgelöst werden sollen. Speziell bei FS20 aber auch bei HomeMatic kann das daran liegen, dass der Sender nicht sendet was man denkt. So gut wie alle FS20 Sender kennen nämlich nicht nur ON und OFF, sondern über ein Dutzend Schaltzustände. Dimmen ist einem noch hinreichend bewusst, es gibt aber auch exotische Dinge wie  Ein-für-Zeitdauer, Ein-auf-alte-Helligkeit, Aus-für-Zeitdauer (nur FS20), Ein-für-Zeitdauer-dannach-alter-Zustand und vieles mehr.&lt;br /&gt;
&lt;br /&gt;
Was also ein Infrarot-Bewegungsmelder bei Auslösung sendet und auch was eine Fernbedienungstaste sendet ist einstellbar. Wenn jetzt zum Beispiel an einer Fernbedienung auf Tastendruck nicht ON sondern Ein-für-Zeitdauer (ON-FOR-TIMER) gesendet wird, wird&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB:on set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
seltsamerweise nicht auslösen, obwohl die richtige Taste (und diese auch nicht zu lang) gedrückt wurde.&lt;br /&gt;
&lt;br /&gt;
Auch wenn man sich sicher ist, das Richtige in die Fernbedienung/Sensoren einprogramiert zu haben, ist ein einfacher Test immer, dies mit&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV notify TVFB set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
zu prüfen. Dieses notify löst immer aus, wenn &amp;quot;TVFB&amp;quot;  &#039;&#039;irgendetwas&#039;&#039; sendet, egal was. (Beachte: Man kann dann den Fernseher aber nicht mehr ausschalten, da auch die Austaste das notify auslöst und zum TV-Aktor nur &amp;quot;on&amp;quot; sendet). &lt;br /&gt;
&lt;br /&gt;
Geht die Schaltung jetzt (kann man den Fernseher also jetzt EINschalten), liegt der Verdacht nahe, dass die Konfiguration des Senders / Sensors anders ist, als man denkt. Das Logfile, der EventMonitor oder ein Beobachtung von FHEM per Telnet mittels &amp;quot;inform&amp;quot; gibt Aufschluss, welcher Befehl tatsächlich empfangen wurde.&lt;br /&gt;
&lt;br /&gt;
== März 2014==&lt;br /&gt;
=== Zuverlässigkeit von FS20 Schaltungen erhöhen ===&lt;br /&gt;
FS20 Fernbedienungen senden bei Tastendrücken von mehr als 0,4 Sekunden anstatt ON bzw. OFF DIMUP bzw DIMDOWN.(Auch einige FBs anderer Systeme verhalten sich ähnlich)&lt;br /&gt;
&lt;br /&gt;
Das führt gelegentlich zu allgemein schlechter Bedienbarkeit (und schlechtem WAF), da 0,4 Sekunden relativ kurz ist und gerne aus versehen länger gedrückt wird. Das ist vor allem problematisch, wenn etwas geschaltet werden soll, was keinen Dimmer hat oder Dimmen nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Eine Konfiguration wie &lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB:on set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
hat also dann den Nachteil, dass bei versehentlich zu langem Tastendruck auf die Fernbedienung das TV nicht angeht. Da die meisten Nutzer unbewusst dazu neigen, bei Misserfolg die selbe Taste erneut aber länger zu drücken (was erneut keinen Erfolg zeigt) ist Frustration zu erwarten.&lt;br /&gt;
&lt;br /&gt;
Es kann daher speziell bei nicht dimmbaren Aktoren von Vorteil sein, auch dimmen abzufangen, z.B. durch eine zweite zusätzliche Definition:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_dimup notify TVFB:dimup set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist in der Regel einfacher, einige dieser zusätzlichen Definitionen einzufügen, als allen Bedienern des Systems zu erklären, dass man keinesfalls länger als 0,4 Sekunden drücken darf.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch beide Befehle in einer Definition durch Perlbefehle {} abfangen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB { if (&amp;quot;$EVENT&amp;quot; eq &amp;quot;on&amp;quot; || &amp;quot;$EVENT&amp;quot; eq &amp;quot;dimup&amp;quot;) { fhem(&amp;quot;set TV on&amp;quot;) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allerdings hat dies den Nachteil, dass jedes Event dieses define durchläuft und erst später geprüft wird, ob das Event überhaupt irgendetwas auslöst. &lt;br /&gt;
Z.B. wird&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB ...&amp;lt;/code&amp;gt; &lt;br /&gt;
auch durch TVFB off ausgelöst (oder unter bestimmten Bedungen sogar duch alle Events), nur um dann nach dem Perl Test festzustellen, dass doch nichts getan werden soll.&lt;br /&gt;
&lt;br /&gt;
Ressourcenschonender ist daher:&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TVFB:on|TVFB:dimup set TV on &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Andere Möglichkeiten vergleiche: [[Trick der Woche#notify durch mehrere Ereignisse auslösen lassen|Notify durch mehrere Ereignisse auslösen lassen]] und [[Trick der Woche#Performance_von_Notifys|Performance von Notifys]]&lt;br /&gt;
&lt;br /&gt;
== Februar 2014==&lt;br /&gt;
=== Sequence nutzen ===&lt;br /&gt;
Man kann Aktionen statt mit einem Tastedruck auch mit einer Sequenz von Tastendücken auslösen. Das Format des Befehle ist:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; sequence &amp;lt;re1&amp;gt; &amp;lt;timeout1&amp;gt; &amp;lt;re2&amp;gt; [&amp;lt;timeout2&amp;gt; &amp;lt;re3&amp;gt; ...] &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei &amp;lt;re1&amp;gt; ...&amp;lt;re_n&amp;gt; die Aktionen sind und &amp;lt;timeout_n&amp;gt; der maximale Abstand der Tastendrücke in Sekunden.&lt;br /&gt;
&lt;br /&gt;
Angenommen, man wolle z.B. eine Lampe dann anschalten, wenn man zuerst Taste1 EIN, dann Taste2 AUS und dann wieder Taste1 EIN einer Fernbedienung drückt, könnte das konkret so aussehen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define MeineLampenSequenz1 sequence Btn1:on 0.5 Btn2:off 0.5 Btn1:on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zwischen jedem der Tastendrücke darf eine halbe Sekunde Abstand sein. Diese Definition selbst löst die Lampe nicht aus, sondern definiert nur wie die Sequenz aussehen soll. Um die Lampe bei erfolgreicher Betätigung der Sequenz auch einzuschalten, bedarf es zusätzlich etwas wie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define MeineLampe notify MeineLampenSequenz1:trigger set Lampe on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sequence kann man gut nutzen, um mit einer Fernbedienung mehr Funktionen zu schalten als Tasten zur Verfügung stehen. Ebenso könnte man damit simple Codeschlösser für Alarmanlagen bauen, z.B. um eine Anlage auszuschalten, wenn eine bestimmte Abfolge von Tasten gedrückt wird.&lt;br /&gt;
&lt;br /&gt;
Je nach Funksystem nimmt die Zuverlässigkeit aber rasch ab. Angenommen im Bereich FS20 (das System ist etwas unzuverlässiger ist als z.B. HomeMatic) seien 95% aller Funktsignale ungestört übertragbar, dann würden in der Praxis von 100 Tastendrücken an einer Fernbedienung 95x Erfolg zeigen und 5x fehlschlagen; das ist sicher tolerabel. &lt;br /&gt;
&lt;br /&gt;
Bei einer Sequenzlänge von nur 4 Tasten würde die kombinierte Erfolgsquote der Sequenz jedoch nur noch ca. 80% sein, zum Ausschalten einer Alarmanlage vermutlich bereits unpraktisch.&lt;br /&gt;
&lt;br /&gt;
== Januar 2014==&lt;br /&gt;
===isday===&lt;br /&gt;
Bekanntlich kann man  mit &amp;quot;isday&amp;quot; leicht testen ob es draussen hell ist oder nicht. isday ist eine Funktion des (automatisch geladenen) Moduls [[SUNRISE_EL]], das auch sunset und sunrise enthält.&lt;br /&gt;
&lt;br /&gt;
Problematisch bei isday ist die fehlende Möglichkeit, Sonnenaufgang und Untergang einzustellen (zumindest wenn man nicht 99_SUNRISE_EL.pm verändern will): isday ist wahr, wenn die Sonne im gegebenen Breitengrad theoretisch sichtbar ist. Wenn örtliche Gegebenheiten (Bebauung, Bäume, Tal etc.) eine Anpassung erfordern, kann man sich auch ein eigenes isday basteln, in dem man sunrise und sunset verwendet und dieses mit getrennten offsets versieht.&lt;br /&gt;
&lt;br /&gt;
Zuerst definiert man sich eine Variable (&amp;quot;dummy&amp;quot;) der anstelle isday eingesetzt werden soll, z.B.:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define Tageslicht dummy &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann wird diese mit sunset und sunrise befüllt:&lt;br /&gt;
&lt;br /&gt;
 define SetDummy1 at *{sunset(-3600)} set Tageslicht hell &lt;br /&gt;
 define SetDummy2 at *{sunrise(+1800)} set Tageslicht dunkel &lt;br /&gt;
&lt;br /&gt;
Jetzt kann für jeden Wechsel ein eigener Offset gewählt werden, im Beispiel 3600 Sekunden vor Sonnenuntergang und 1800 Sekunden nach Sonnenaufgang. Anstatt das Dummy &amp;quot;Tageslicht&amp;quot; mit den Werten &amp;quot;hell/dunkel&amp;quot; zu befüllen, kann natürlich auch 1/0 oder &amp;quot;Tag/Nacht&amp;quot; etc. verwendet werden, je nachdem was bei der Anwendung besser passt.&lt;br /&gt;
&lt;br /&gt;
Für höhere Ansprüche könnte hingegen das [[Twilight]]-Modul verwendet werden, das Dämmerungsstufen kennt.&lt;br /&gt;
&lt;br /&gt;
===Struktur von &amp;quot;else if&amp;quot; Verzweigungen===&lt;br /&gt;
 define ... notify ... {\&lt;br /&gt;
  if ... {\&lt;br /&gt;
   fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  else {\&lt;br /&gt;
   if ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Achtung: es muss tatsächlich &amp;quot;elsif&amp;quot; heissen und nicht &amp;quot;elseif&amp;quot; oder &amp;quot;else if&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Gilt für Perl Aufrufe. &lt;br /&gt;
Wer aktuell in FHEM neu einsteigt, kann auch den seit 2014 zur Verfügung stehenden FHEM Befehl [[DOIF]] verwenden, der komfortabler ist und zusätzliche Features aufweist.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2013==&lt;br /&gt;
===notify durch mehrere Ereignisse auslösen lassen===&lt;br /&gt;
Bekanntermassen löst&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
aus, wenn irgendein Ereignis vom Sender &amp;quot;MeinSchalter&amp;quot; eintrifft.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wird das notify jedoch nur ausgelöst, wenn dieses Ereignis eine &amp;quot;on&amp;quot; ist.&lt;br /&gt;
Wenn man aber möchte, das z.B. &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; auslöst (um etwa Dim-Befehle auszuschliessen) kann dies wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:(on|off) …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klammern sind wichtig, vergleiche eine Lösung, bei der zwei Sender alternativ das notify auslösen können:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on|MeinAndererSchalter:on …&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Selbstverständlich geht z.B. auch folgendes:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on|MeinAndererSchalter …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird ausgelöst wenn &amp;quot;MeinSchalter&amp;quot; das Ereignis &amp;quot;on&amp;quot; liefert oder &amp;quot;MeinAndererSchalter&amp;quot; irgendein Ereignis. Beachte hierzu jedoch den Tipp vom Dezember 2020 &amp;quot;Performance von Notifys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Aktoren über mehrere Funkschnittstellen ansprechen ===&lt;br /&gt;
Falls man mehrere Funkschnittstellen zur Reichweitenverlängerung hat (CUL / CUNO etc), und ein Aktor von beiden Funkschnittstellen in etwa gleich (schlecht) erreichbar ist, mag der Wunsch aufkommen, einen Funkbefehl über beide Schnittstellen auszusenden. Dies ist bei Funkprotokollen möglich, die kein echtes Pairing der Aktoren an die Funkschnittstelle erfordern, also z.B. FS20 oder Intertechno, nicht jedoch ohne weiteres bei HomeMatic.&lt;br /&gt;
&lt;br /&gt;
Problematisch ist aber, dass die Funkschnittstelle über IODev eindeutige je Aktor festgelegt werden muss, eine Zuordnung mehrerer IODevs ist nicht vorgesehen.&lt;br /&gt;
(wenn man IODev nicht setzt, wird per default die LETZTE definiert passende Schnittstelle verwendet)&lt;br /&gt;
&lt;br /&gt;
Dieses Problem kann mit einem Trick aber umgangen werden. Und zwar legt man den Aktor 2x mit gleicher Adresse aber abweichenden Namen und IOdevs an, z.B. so:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 define brenner_CUL1 FS20 11114244 11&lt;br /&gt;
 attr brenner_CUL1 IODev CUL1&lt;br /&gt;
 attr brenner_CUL1 room Keller&lt;br /&gt;
&lt;br /&gt;
 define brenner_CUL2 FS20 11114244 11&lt;br /&gt;
 attr brenner_CUL2 IODev CUL2&lt;br /&gt;
 attr brenner_CUL2 room Keller&lt;br /&gt;
&lt;br /&gt;
Ein Befehl der Art:&lt;br /&gt;
&lt;br /&gt;
 set brenner_CUL1,brenner_CUL2 on&lt;br /&gt;
&lt;br /&gt;
sendet den ON Befehl für den FS20 Aktor 11114244 11  jetzt tatsächlich über beide CULs aus!&lt;br /&gt;
&lt;br /&gt;
Achtung: Wenn die Schnittstellen gleichschnell angebunden sind, sollte vermutlich der [[Sendpool]] verwendet werden, da die Aussendungen sonst tatsächlich gleichzeitig erfolgen könnten und sich dann gegenseitig stören würden. Dieser Trick funktioniert ausserdem nur bei Befehlen, bei denen es im Zweifel egal ist, wenn sie beim Aktor 2x eintreffen. &lt;br /&gt;
&lt;br /&gt;
Bei HomeMatic lässt sich ein ähnlicher Effekt durch einrichten einer [[Virtueller Controller VCCU|virtuellen CCU]] erreichen.&lt;br /&gt;
&lt;br /&gt;
=== Retrycount bei FHTs ist überflüssig===&lt;br /&gt;
Das von der Funktion &#039;&#039;autocreate&#039;&#039; älterer FHEM Versionen beim Anlegen von FHT80 Heizungsreglern voreingetragene attribute &amp;quot;retrycount&amp;quot; hat in den allermeisten Fällen keine Wirkung, da es NUR greift, wenn man als Funkschnittstelle eine FHZ1X00PC verwendet und dann den Softbuffer einschaltet. Selbst wenn man diese Konfiguration nutzt, will gut überlegt werden, ob die Wirkung postiv ist: Bei ungenügender Empfangslage vergrössert es Kommunikationsprobleme eventuell sogar.&lt;br /&gt;
&lt;br /&gt;
Es kann also in der Regel entfernt oder auf den Wert &amp;quot;1&amp;quot; gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
 define Heizung_Bad FHT 060d&lt;br /&gt;
 attr Heizung_Bad retrycount 3       &amp;lt;=== Diese Zeile entfernen&lt;br /&gt;
&lt;br /&gt;
Siehe auch:[[Kommunikationsprobleme mit FHT]]&lt;br /&gt;
&lt;br /&gt;
== November 2013 ==&lt;br /&gt;
=== FS20 Funksteckdose sicherer schalten===&lt;br /&gt;
Seltsamerweise kommt es vor, das FS20 Aktoren - insbesondere die FS20 Funksteckdose - an der Grenze der Funkreichweite bestimmte Befehle eines Typs empfängt, andere aber nicht. Z.B. lässt sich die FS20 Steckdose zwar immer einschalten, aber oft nicht mehr aus (oder umgekehrt).&lt;br /&gt;
&lt;br /&gt;
Gelegentlich kann man die Zuverlässigkeit erhöhen, indem man statt dem nicht funktionierenden Befehl das Gegenteil mit &amp;quot;for-timer 1&amp;quot; verwendet.&lt;br /&gt;
&lt;br /&gt;
Im Fall, dass eine FS20 Steckdose sich also einwandfrei EINschalten lässt:&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
aber oft ein AUSschalten mittels&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA off&amp;lt;/code&amp;gt;&lt;br /&gt;
nicht funktioniert, kann man versuchen die Dose anstelle mit &amp;quot;off&amp;quot; mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA on-for-timer 1&amp;lt;/code&amp;gt;&lt;br /&gt;
auszuschalten.&lt;br /&gt;
&lt;br /&gt;
Analog kann man mit off-for-timer arbeiten, wenn sich Aktoren nicht einschalten lassen, ausschalten aber geht.&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Trick funtioniert ausdrücklich nur, wenn der &amp;quot;on/off-for-timer&amp;quot; Befehl im Aktor selber abgebildet wird. Daher ist der Trick vermutlich nicht auf andere Funksysteme übertragbar. z.B. unterstützt HM nur on-for-timer und Intertechno kennt keinen Timer.&lt;br /&gt;
&lt;br /&gt;
=== Mehrere Geräte zugleich schalten===&lt;br /&gt;
Ein Ereignis soll mehrere Geräte schalten:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1 on;;set Lampe2 on;;set FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aus Übersichtlichkeitsgründen können vor und nach den Semikolons auch Leerzeichen eingefügt werden (obwohl in einigen Dokumentation behauptet wird, dies dürfe man nicht machen):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1 on ;; set Lampe2 on ;; set FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn der Schaltbefehl bei allen Geräten gleich ist, kann man wie folgt zusammenfassen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1,Lampe2,FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Komma wird nicht [[Escapen in Perlbefehlen|escaped]] (verdoppelt), hier darf tatsächlich KEIN Leerzeichen vor oder nach dem Komma eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== Logfileinträge unterdrücken===&lt;br /&gt;
Das Attribute &amp;quot;verbose 0&amp;quot; verhindert, dass das Gerät Logfileinträge erzeugt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 define Funksteckdose FS20 22224222 01&lt;br /&gt;
 attr Funksteckdose verbose 0&lt;br /&gt;
&lt;br /&gt;
===FHT Lazy Mode benutzen===&lt;br /&gt;
Es gibt wenig Gründe, den FHT &amp;quot;Lazy Mode&amp;quot; nicht zu verwenden&lt;br /&gt;
 define Heizung_Bad FHT 060d&lt;br /&gt;
 attr Heizung_Bad lazy&lt;br /&gt;
&lt;br /&gt;
Dieser sorgt dafür, dass Temperaturänderungen (genau genommen alle Änderungen, auch z.B. date) nur übertragen werden, wenn sie nicht sowieso schon am FHT eingestellt sind und veringern die Funklast dadurch deutlich. &lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[Kommunikationsprobleme mit FHT]]&lt;br /&gt;
&lt;br /&gt;
== Oktober 2013 ==&lt;br /&gt;
=== Zuverlässigkeit von Wiedereinschalten erhöhen ===&lt;br /&gt;
Speziell bei FS20 Aktoren ist wegen des fehlenden Rückkanals nicht leicht erkennbar, ob ein Einschaltbefehl Wirkung gezeigt hat. Das bringt einen ganz schlechten WAF, wenn man z.B. mit einem FS20 Aktor eine Heizung ausschaltet und das Wiedereinschalten nach z.B. einer Stunde nicht klappt.&lt;br /&gt;
&lt;br /&gt;
Hier empfiehlt es sich, das Ausschalten mittels &lt;br /&gt;
:&amp;lt;code&amp;gt;set Heizungs_schalter off-for-timer 3584&amp;lt;/code&amp;gt;   (= fast eine Stunde)&lt;br /&gt;
zu erledigen. Da bei FS20 der off-for-timer Befehl im Aktor abgewickelt wird (und nicht durch FHEM), schaltet sich der Aktor auch dann garantiert wieder ein, wenn FHEM abstürzt, eine Funkstörung vorliegt oder ähnliches.  Bei Bedarf kann der Befehl off-for-timer zur  Verlängerung der Ausschaltzeit wiederholt werden. Dies kann z.B. nötig sein, wenn die Ausschaltung länger als 4,5 Stunden (15360 Sekunden, der Maximalwert des Timers) dauern soll.&lt;br /&gt;
&lt;br /&gt;
Achtung: dieser Trick funktioniert nur, wenn der Aktor &amp;quot;off-for-timer&amp;quot; selbst beherrscht. FS20 Geräte können das, HomeMatic können aber nur &amp;quot;on-for-timer&amp;quot;. Man kann off-for-timer mit HomeMatic trotzdem verwenden, aber in diesem Fall sendet FHEM den Einschaltbefehl nach der Timerzeit. InterTechno, RSL etc, können gar keinen Timer, hier sendet FHEM immer 2 Befehle im passenden Abstand.&lt;br /&gt;
&lt;br /&gt;
=== FS20 Timerzeiten ===&lt;br /&gt;
FS20 Timer werden in Sekunden angegeben. Es sind jedoch nicht alle Werte einstellbar. Da der Timer Wert in 7 Bit übertragen werden muss, sind nur 128 Werte möglich. Um mit diesen Werten im unteren Bereich möglichst fein aufzulösen, andererseits aber auch lange Zeiten zu ermöglichen, ist die Verteilung nicht linear. Einstellbar sind folgende Zeiten in Sekunden;&lt;br /&gt;
&lt;br /&gt;
0,25  0,5  0,75  1  1,25  1,5  1,75  2  2,25  2,5  2,75  3  3,25  3,5  3,75   &lt;br /&gt;
4  4,5  5  5,5  6  6,5  7  7,5  8  9  10  11  12  13  14  15  16  18  20  22   &lt;br /&gt;
24  26  28  30  32  36  40  44  48  52  56  60  64  72  80  88  96  104  112   &lt;br /&gt;
120  128  144  160  176  192  208  224  240  256  288  320  352  384  416   &lt;br /&gt;
448  480  512  576  640  704  768  832  896  960  1024  1152  1280  1408   &lt;br /&gt;
1536  1664  1792  1920  2048  2304  2560  2816  3072  3328  3584  3840  4096   &lt;br /&gt;
4608  5120  5632  6144  6656  7168  7680  8192  9216  10240  11264  12288   &lt;br /&gt;
13312  14336  15360 &lt;br /&gt;
(etwas übersichtlicher formatiert auch [[FS20 Allgemein#ON/OFF Befehle mit Time Parameter|hier]]).&lt;br /&gt;
 &lt;br /&gt;
Andere Zeiten werden von FHEM gerundet. Ein neues Setzen des Timer für FS20 löscht den alten Wert.&lt;br /&gt;
&lt;br /&gt;
Auch HomeMatic Aktoren beherrschen Time Parameter, im Gegensatz zu FS20 allerdings kein &amp;quot;off-for-timer&amp;quot;. Details dazu im Artikel [[HomeMatic Timerwerte]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FileLog&amp;diff=40104</id>
		<title>FileLog</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FileLog&amp;diff=40104"/>
		<updated>2025-04-15T18:25:51Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Protokollierung von Fhem-Ereignissen&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=92_FileLog.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[FileLog]] dient zur Protokollierung von Ereignissen in FHEM. Die Einträge werden in eine einfache Textdatei geschrieben. Zur Protokollierung in eine Datenbank kann alternativ oder auch parallel das Modul [[DbLog]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Logdateien sind die Basis für die Erstellung von Diagrammen ([[SVG]]).&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
Ein FileLog wird (Details in der {{Link2CmdRef|Anker=FileLogdefine}}) mittels &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; FileLog &amp;lt;filename&amp;gt; &amp;lt;regexp&amp;gt; [readonly]&amp;lt;/code&amp;gt;&lt;br /&gt;
angelegt. Dabei bezeichnet&lt;br /&gt;
;&amp;lt;name&amp;gt;&lt;br /&gt;
: - wie üblich - der Devicename der Definition&lt;br /&gt;
;&amp;lt;filename&amp;gt;&lt;br /&gt;
: legt den Namen der Datei auf Dateisystemebene fest&lt;br /&gt;
[[Datei:FileLogRegExpHelper.png|200px|thumb|right|Hilfe für addRegexpPart]]&lt;br /&gt;
;&amp;lt;regexp&amp;gt;&lt;br /&gt;
: bestimmt, welche Daten in die Datei geschrieben werden. Für die Bearbeitung der [[Regulärer Ausdruck|regexp]] stellt [[FHEMWEB]] die gezeigte Hilfsfunktion zur Verfügung (siehe hierzu auch dieses {{Link2Forum|Topic=12557|LinkText=Forenthema}} sowie den Abschnitt [[#Sonderfälle|Sonderfälle]])&lt;br /&gt;
;[readonly]&lt;br /&gt;
: ist optional und wird in [[#Sonderfälle|Sonderfällen]] benötigt. Dieser Parameter ist seit März 2015 ([https://svn.fhem.de/trac/changeset/8264 Changeset 8264]) verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Über {{Link2CmdRef|Anker=FileLogattr|Label=Attribute}} lässt sich unter anderem auch festlegen, wie die Archivierung von Logdateien durchgeführt werden soll (Archivierungsbefehl, -pfad sowie Anzahl von Archivgenerationen).&lt;br /&gt;
&lt;br /&gt;
Wenn bestimmte Zeilen &#039;&#039;&#039;nicht&#039;&#039;&#039; in die Logdatei geschrieben werden sollen, ist das Attribut &#039;&#039;ignoreRegexp&#039;&#039; hilfreich. Wenn beispielsweise alle Zeilen, die die Zeichenfolge &amp;quot;AbCd&amp;quot; oder &amp;quot;CdEf&amp;quot; enthalten &#039;&#039;&#039;nicht&#039;&#039;&#039; geloggt werden sollen, dann wäre&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;log-name&amp;gt; ignoreRegexp .*AbCd.*|.*CdEf.*&amp;lt;/code&amp;gt;&lt;br /&gt;
eine Attributdefinition, die das ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Dies bezieht sich aber nur auf normale FileLog-Instanzen. Falls Events aus dem globalen FHEM-Logfile ausgeschlossen werden sollen, muss man das Attribut in &#039;&#039;&#039;global&#039;&#039;&#039; angeben. (Zusammenhang siehe [[#Globale Logdatei]]) &lt;br /&gt;
:&amp;lt;code&amp;gt;attr global ignoreRegexp .*AbCd.*|.*CdEf.*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funktionen ==&lt;br /&gt;
&#039;&#039;FileLog&#039;&#039; bietet Funktionen wie &#039;&#039;reopen&#039;&#039;, &#039;&#039;absorb&#039;&#039; und &#039;&#039;get&#039;&#039;. Details dazu sind in der {{Link2CmdRef|Anker=FileLogset}} zu finden.&lt;br /&gt;
&lt;br /&gt;
Sofern eine Instanz vom Objekt [[eventTypes]] angelegt ist, bietet die Detailansicht eines FileLog eine komfortable Möglichkeit, die regulären Ausdrücke für den/die Filter zu bearbeiten. &lt;br /&gt;
&lt;br /&gt;
== Sonderfälle ==&lt;br /&gt;
Üblicherweise sind FileLog Devices dafür zuständig, aufgrund von Events die gewünschten Daten in die Logdatei zu schreiben, in Sonderfällen kann FileLog aber auch dafür verwendet werden, &amp;quot;bestehende&amp;quot; Dateien (in die aus anderen Quellen / von anderen Programme geschrieben wird) zu behandeln.&lt;br /&gt;
&lt;br /&gt;
=== Globale Logdatei ===&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Bis August 2021 war die Spezifikation von &#039;&#039;&#039;fakelog&#039;&#039;&#039; erforderlich bzw. möglich, um die Sonderbehandlung für diese Logdatei zu unterstützen. Mittlerweile ist das nicht mehr nötig und es wird (auch in der Beispielkonfiguration) der Wert &#039;&#039;&#039;Logfile&#039;&#039;&#039; empfohlen.}}&lt;br /&gt;
Die globale Logdatei für FHEM (üblicherweise als fhem.log bezeichnet) wird mit dem Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr global logfile &amp;lt;filename&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
für das &#039;&#039;global&#039;&#039;-Objekt definiert, wobei für &#039;&#039;&amp;lt;filename&amp;gt;&#039;&#039; normalerweise &amp;lt;code&amp;gt;./log/fhem-%Y-%m.log&amp;lt;/code&amp;gt; verwendet wird.&lt;br /&gt;
&lt;br /&gt;
Um das &#039;&#039;fhem.log&#039;&#039; über das [[FHEMWEB|Web Interface]] anzeigen zu können, ist ein weiterer Eintrag in der [[Konfiguration]] erforderlich, nämlich:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Logfile FileLog &amp;lt;filename&amp;gt; &amp;lt;strike&amp;gt;fakelog&amp;lt;/strike&amp;gt; Logfile&amp;lt;/code&amp;gt;&lt;br /&gt;
Das &#039;&#039;&amp;lt;filename&amp;gt;&#039;&#039; muss &#039;&#039;&#039;zwingend&#039;&#039;&#039; durch den gleichen Wert ersetzt werden, der in der Definition des globalen &#039;&#039;logfile&#039;&#039; Attributs verwendet wurde, weil anderenfalls unterschiedliche Dateien verwendet werden - mit dem Effekt, dass die über das Web Interface angezeigte Datei nicht die erwarteten Einträge enthält (Details dazu auch in diesem {{Link2Forum|Topic=40041|Message=323315|LinkText=Forenbeitrag}}).&lt;br /&gt;
&lt;br /&gt;
=== Logdaten aus anderen Quellen ===&lt;br /&gt;
Soll ein FileLog Device Daten aus anderen Quellen anzeigen, empfiehlt es sich, den Parameter &#039;&#039;&#039;&#039;&#039;readonly&#039;&#039;&#039;&#039;&#039; anzugeben. Damit wird vermieden, dass FHEM ebenfalls versucht, in die angegebene Datei (&amp;lt;filename&amp;gt;) zu schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Unterdrückung der addRegexpPart Hilfsfunktion ===&lt;br /&gt;
Wird bei einem FileLog Device die Anzeige der addRegxepPart Hilfsfunktion nicht gewünscht, muss als &amp;lt;regexp&amp;gt;-Parameter der gleiche Wert angegeben werden, der auch für den &amp;lt;name&amp;gt;-Parameter spezifiziert wurde (bisher (Nov. 2021) konnte dafür auch der Wert &#039;&#039;fakelog&#039;&#039; als &amp;lt;regexp&amp;gt;-Parameter verwendet werden; das wird in späteren Versionen nicht mehr unterstützt werden). &lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
=== Werte auslesen ===&lt;br /&gt;
Manchmal möchte man Daten aus den Logs abrufen, ohne händisch in den Logfiles herumzuwühlen. Dies ist insbesondere auch dann hilfreich, wenn man eigene Funktionen, Notifys oder spezielle Plots entwirft, bei denen man auf Logdaten zugreifen möchte.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich beschrieben ist dies in der {{Link2CmdRef|Lang=de|Anker=FileLog}} und unterscheidet sich minimal (aber entscheidend) von der Struktur bei [[DbLog#Werte_auslesen|DbLogs]].&lt;br /&gt;
&lt;br /&gt;
Hier ein paar Beispiele, was man damit anstellen kann:&lt;br /&gt;
* &amp;lt;code&amp;gt;get FileLog_FHT_3a32 - - 2016-10-01 2016-10-03&amp;lt;/code&amp;gt;&lt;br /&gt;
: alle Einträge des FileLog_FHT_3a32 vom 01.10.-03.10.2016&lt;br /&gt;
* &amp;lt;code&amp;gt;get FileLog_FHT_3a32 - - 2016-10-01_08:00:00 2016-10-01_16:00:00&amp;lt;/code&amp;gt; &lt;br /&gt;
: alle Einträge des FileLog_FHT_3a32 von 8-16 Uhr am 01.10.2016&lt;br /&gt;
* &amp;lt;code&amp;gt;get FileLog_FHT_3a32 - - 2016-10-01_08:00:00 2016-10-01_16:00:00 4:measured:0:&amp;lt;/code&amp;gt;&lt;br /&gt;
: nur die Temperatur-Werte&lt;br /&gt;
* &amp;lt;code&amp;gt;{ ReadingsTimestamp(&amp;quot;FHT_3a32&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;0&amp;quot;) }&amp;lt;/code&amp;gt; &lt;br /&gt;
: Timestamp des aktuellen state des FHT_3a32&lt;br /&gt;
* &amp;lt;code&amp;gt;{ OldTimestamp(&amp;quot;FHT_3a32&amp;quot;) }&amp;lt;/code&amp;gt; &lt;br /&gt;
: Timestamp des letzten state des FHT_3a32&lt;br /&gt;
* &amp;lt;code&amp;gt;{ time_str2num(OldTimestamp(&amp;quot;FHT_3a32&amp;quot;)) }&amp;lt;/code&amp;gt; &lt;br /&gt;
: Timestamp in Sekunden des letzten state des FHT_3a32&lt;br /&gt;
* ...&lt;br /&gt;
Weitere Beispiele kann man sich gut aus den SVG-Dateien ziehen.&lt;br /&gt;
&lt;br /&gt;
=== Mehrere Werte und Dummy in einer Zeile formatiert in Logdatei schreiben ===&lt;br /&gt;
Manchmal möchte man die einzelnen Werte nicht untereinander in der Logdatei haben, sondern wie bei einer CSV-Datei in einer Zeile.&lt;br /&gt;
&lt;br /&gt;
Hierzu kann man wie im Beispiel die einzelnen Readings Kesseltemperatur, Vorlauftemperatur und Rücklauftemperatur aus One-Wire-Sensoren DS18B20 und die Außentemperatur als vierten Wert aus einem Dummy über sprintf formatieren. Wer das durcht Komma oder Semikolon getrennt haben möchte, ersetzt die Leerzeichen zwischen den einzelnen Werten durch sein Wunschtrennzeichen.&amp;lt;syntaxhighlight lang=&amp;quot;Text&amp;quot;&amp;gt;&lt;br /&gt;
attr HEIZUNG userReadings HeizDataLog {sprintf(&amp;quot;K: %3.1f VL: %3.1f  RL: %3.1f Pr: %4.1f&amp;quot;, ReadingsVal(&amp;quot;OWX_28_4C966XXXXXXX&amp;quot;,&amp;quot;temperature&amp;quot;, 0),ReadingsVal(&amp;quot;OWX_28_4F9XXXXXXXXX&amp;quot;,&amp;quot;temperature&amp;quot;, 0),ReadingsVal(&amp;quot;OWX_28_FFAXXXXXXXXX&amp;quot;,&amp;quot;temperature&amp;quot;, 0), (Value(&amp;quot;Heiz_Temp_Outside&amp;quot;)))}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Für die einzelnen Userreadings lassen sich auch unterschiedliche Intervalle angeben.&amp;lt;syntaxhighlight lang=&amp;quot;Text&amp;quot;&amp;gt;attr HEIZUNG event-min-interval HeizDataLog:300, HeizKesselTemp:20&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Da im Beispiel nur Userreading HeizDataLog geschreiben werden soll, muss es bei &amp;lt;regexp&amp;gt; dementsprechend angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Text&amp;quot;&amp;gt;&lt;br /&gt;
# logging&lt;br /&gt;
define FileLog_Heizung FileLog ./log/Heizung/Heizung_%Y_%m.log HEIZUNG:HeizDataLog.*&lt;br /&gt;
attr FileLog_Heizung logtype text&lt;br /&gt;
attr FileLog_Heizung room LogFiles,Heizung&lt;br /&gt;
attr FileLog_Heizung group Heizung&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das ergibt folgendes Ergebnis:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Text&amp;quot;&amp;gt;&lt;br /&gt;
2020-09-27_19:36:57 HEIZUNG HeizDataLog: K: 66.8 VL: 60.8  RL: 35.7 Out: 18.4&lt;br /&gt;
2020-09-27_19:41:58 HEIZUNG HeizDataLog: K: 60.0 VL: 56.9  RL: 34.3 Out: 18.3&lt;br /&gt;
2020-09-27_19:46:58 HEIZUNG HeizDataLog: K: 50.2 VL: 47.9  RL: 34.4 Out: 18.2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=40041|Message=323315|LinkText=Forenbeitrag}} zum Thema fhem.log / fakelog&lt;br /&gt;
* Forenthema zum {{Link2Forum|Topic=124167|LinkText=&amp;quot;Deprecate&amp;quot; von &#039;&#039;fakelog&#039;&#039;}} &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Logging]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40084</id>
		<title>Dimplex Wärmepumpenmanager</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40084"/>
		<updated>2025-03-30T17:01:16Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- bitte noch die Abkürzung &amp;quot;NWPM&amp;quot; erklären (Benutzer:Ph1959de, 2015/02/02) --&amp;gt;&lt;br /&gt;
Mit der NWPM-Erweiterung ist es möglich, den Dimplex Wärmepumpenmanager in ein Hausnetzwerk einzubinden. Durch die Einbindung der NWPM-Erweiterung ist es ebenfalls möglich, die zur Verfügung gestellten Werte vom Wärmepumpenmanager mittels ModbusTCP in FHEM zu übernehmen, anzuzeigen und grafisch darzustellen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzung ==&lt;br /&gt;
Die Anbindung des Dimplex Wärmepumpenmanager an FHEM erfolgt mittels NWPM-Erweiterung und der aktuellen FHEM Installation. Weiterhin werden die zur Verfügung stehenden Module:&lt;br /&gt;
&lt;br /&gt;
* 36_ModbusTCPServer.pm &lt;br /&gt;
* 37_ModbusCoil.pm&lt;br /&gt;
* 37_ModbusRegister.pm&lt;br /&gt;
&lt;br /&gt;
genutzt. Getestet wurde der Zugriff auf einem BeagleBone Black mit der [[BeagleBone Black|hier beschriebenen]] Debian Installation.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Die oben aufgeführten Module sind notwendig und müssen nachinstalliert werden. Zum Zeitpunkt der Erstellung dieser Dokumentation (31.1.2015) sind diese noch nicht offiziell in FHEM enthalten und werden auch nicht mittels Update verteilt. Die Module werden mit dem Befehl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update all https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mb/controls_modbus.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
über die FHEM Befehlszeile installiert und anschließend&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reload 36_ModbusTCPServer.pm &lt;br /&gt;
reload 37_ModbusCoil.pm&lt;br /&gt;
reload 37_ModbusRegister.pm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
mit einem Reload geladen.&lt;br /&gt;
== Benutzung == &lt;br /&gt;
=== Anlegen der ModbusTCPServer Verbindung ===&lt;br /&gt;
Wie im nachfolgenden angegeben muss zunächst eine ModbusTCPServer Verbindung hergestellt werden. Die angegebene IP-Adresse muss durch die IP-Adresse der Wärmepumpe ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define HeatPumpServer ModbusTCPServer 192.168.1.150&lt;br /&gt;
attr HeatPumpServer verbose 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ein erfolgreicher Verbindungsaufbau wird mit einem „ok“ im State gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
=== Modbus-Register/Coil Adressen definieren ===&lt;br /&gt;
Im nachfolgendem Beispiel wird anhand der Außentemperatur die Adressdefinition erklärt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_outdoor_temperature ModbusRegister 0 1&lt;br /&gt;
attr dim_outdoor_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_outdoor_temperature conversion 0.1:0&lt;br /&gt;
attr dim_outdoor_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_outdoor_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_outdoor_temperature plcDataType INT&lt;br /&gt;
attr dim_outdoor_temperature registerType Holding&lt;br /&gt;
attr dim_outdoor_temperature room Dimplex&lt;br /&gt;
attr dim_outdoor_temperature stateAlias temperature&lt;br /&gt;
attr dim_outdoor_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_outdoor_temperature updateInterval 00:10:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erklärung:&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Erläuterungen zur Adressdefinition&lt;br /&gt;
|-&lt;br /&gt;
! Attribut !! Erläuterungen&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 0 Device Adresse, in der Regel bei ModbusTCP immer 0&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 1 Register Adresse, wird unter www.dimplex.de/wiki → ModbusTCP → Spalten IP zur Verfügung gestellt&lt;br /&gt;
|-&lt;br /&gt;
| IODev              || Verwendeter und zuvor angelegter ModbusTCPServer&lt;br /&gt;
|-&lt;br /&gt;
| conversion         || eine gegebenenfalls notwendige Konvertierung des übermittelten Values&lt;br /&gt;
|-&lt;br /&gt;
| PlcDataType        || Ermögliche automatische Interpretation der ankommenden Daten&lt;br /&gt;
|-&lt;br /&gt;
| stateAlias         || es wird ein zusätzliches Reading erzeugt, um zum Beispiel das Statistic-Modul nutzen zu können, stateAlias ist eine echte Kopie von &amp;quot;state&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| updateInterval    || Intervall des Abfragezyklus (z.B. 00:10:00 Minuten)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Betriebsdaten ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Betriebsdaten. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_outdoor_temperature     || Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_flow_temperature        || Vorlauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_return_temperature      || Rücklauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_returnset_temperature   || Rücklaufsolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_room_temperature        || Raumtemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhw_temperature         || Warmwassertemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwset_temperature      || Warmwassersolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_brine_temperature       || Soletemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_high_pressure           || Hochdruck&lt;br /&gt;
|-&lt;br /&gt;
| dim_low_pressure           || Niederdruck&lt;br /&gt;
|}&lt;br /&gt;
Register Warmwassertemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw_temperature ModbusRegister 0 3&lt;br /&gt;
attr dim_dhw_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_dhw_temperature conversion 0.1:0&lt;br /&gt;
attr dim_dhw_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_dhw_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_dhw_temperature plcDataType INT&lt;br /&gt;
attr dim_dhw_temperature registerType Holding&lt;br /&gt;
attr dim_dhw_temperature room Dimplex&lt;br /&gt;
attr dim_dhw_temperature stateAlias temperature&lt;br /&gt;
attr dim_dhw_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_dhw_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Vorlauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flow_temperature ModbusRegister 0 5&lt;br /&gt;
attr dim_flow_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_flow_temperature conversion 0.1:0&lt;br /&gt;
attr dim_flow_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_flow_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_flow_temperature plcDataType INT&lt;br /&gt;
attr dim_flow_temperature registerType Holding&lt;br /&gt;
attr dim_flow_temperature room Dimplex&lt;br /&gt;
attr dim_flow_temperature stateAlias temperature&lt;br /&gt;
attr dim_flow_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_flow_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_return_temperature ModbusRegister 0 2&lt;br /&gt;
attr dim_return_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_return_temperature conversion 0.1:0&lt;br /&gt;
attr dim_return_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_return_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_return_temperature plcDataType INT&lt;br /&gt;
attr dim_return_temperature registerType Holding&lt;br /&gt;
attr dim_return_temperature room Dimplex&lt;br /&gt;
attr dim_return_temperature stateAlias temperature&lt;br /&gt;
attr dim_return_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_return_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklaufsolltemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_returnset_temperature ModbusRegister 0 53&lt;br /&gt;
attr dim_returnset_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_returnset_temperature conversion 0.1:0&lt;br /&gt;
attr dim_returnset_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_returnset_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_returnset_temperature plcDataType INT&lt;br /&gt;
attr dim_returnset_temperature registerType Holding&lt;br /&gt;
attr dim_returnset_temperature room Dimplex&lt;br /&gt;
attr dim_returnset_temperature stateAlias temperature&lt;br /&gt;
attr dim_returnset_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_returnset_temperature updateInterval 00:05:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Betriebsdaten ====&lt;br /&gt;
Anlegen eines täglichen Logfile der Betriebsdaten.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_temperature FileLog ./log/filelog_dim_temperature-%W-%d.log dim_.*._temperature:temperature:.*|dim_.*._pressure:pressure:.*&lt;br /&gt;
attr filelog_dim_temperature room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Statistiken ====&lt;br /&gt;
Folgender Code legt die Statistiken der Betriebsdaten an&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_statistics statistics dim_.*._temperature|dim_.*._pressure&lt;br /&gt;
attr dim_statistics dayChangeTime 1&lt;br /&gt;
attr dim_statistics deltaReadings temperature,pressure&lt;br /&gt;
attr dim_statistics minAvgMaxReadings temperature,pressure&lt;br /&gt;
attr dim_statistics room Dimplex&lt;br /&gt;
attr dim_statistics tendencyReadings temperature,pressure&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustände ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Zustände. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_output      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_output      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_ output      || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_output || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_output  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_output         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_output   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_output    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Coil Verdichter und passenden HourCounter für Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_output ModbusCoil 0 41&lt;br /&gt;
attr dim_compressor_output IODev HeatPumpServer&lt;br /&gt;
attr dim_compressor_output disableRegisterMapping 1&lt;br /&gt;
attr dim_compressor_output event-min-interval .*:900&lt;br /&gt;
attr dim_compressor_output event-on-change-reading .*&lt;br /&gt;
attr dim_compressor_output room Dimplex&lt;br /&gt;
attr dim_compressor_output source Coil&lt;br /&gt;
attr dim_compressor_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_compressor_output HourCounter dim_compressor_output:on dim_compressor_output:off&lt;br /&gt;
attr hourcounter_compressor_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_compressor_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Ventilator definieren und passenden HourCounter für Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_output ModbusCoil 0 43&lt;br /&gt;
attr dim_ventilator_output IODev HeatPumpServer&lt;br /&gt;
attr dim_ventilator_output disableRegisterMapping 1&lt;br /&gt;
attr dim_ventilator_output event-min-interval .*:900&lt;br /&gt;
attr dim_ventilator_output event-on-change-reading .*&lt;br /&gt;
attr dim_ventilator_output room Dimplex&lt;br /&gt;
attr dim_ventilator_output source Coil&lt;br /&gt;
attr dim_ventilator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_ventilator_output HourCounter dim_ventilator_output:on dim_ventilator_output:off&lt;br /&gt;
attr hourcounter_ventilator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_ventilator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil 2.Wärmeerzeuger definieren und passenden HourCounter für 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_output ModbusCoil 0 44&lt;br /&gt;
attr dim_2heatgenerator_output IODev HeatPumpServer&lt;br /&gt;
attr dim_2heatgenerator_output disableRegisterMapping 1&lt;br /&gt;
attr dim_2heatgenerator_output event-min-interval .*:900&lt;br /&gt;
attr dim_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
attr dim_2heatgenerator_output room Dimplex&lt;br /&gt;
attr dim_2heatgenerator_output source Coil&lt;br /&gt;
attr dim_2heatgenerator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_2heatgenerator_output HourCounter dim_2heatgenerator_output:on dim_2heatgenerator_output:off&lt;br /&gt;
attr hourcounter_2heatgenerator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Heizungsumwälzpumpe M13 definieren und passenden HourCounter für Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_output ModbusCoil 0 45&lt;br /&gt;
attr dim_circulationpump_output IODev HeatPumpServer&lt;br /&gt;
attr dim_circulationpump_output disableRegisterMapping 1&lt;br /&gt;
attr dim_circulationpump_output event-min-interval .*:900&lt;br /&gt;
attr dim_circulationpump_output event-on-change-reading .*&lt;br /&gt;
attr dim_circulationpump_output room Dimplex&lt;br /&gt;
attr dim_circulationpump_output source Coil&lt;br /&gt;
attr dim_circulationpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_circulationpump_output HourCounter dim_circulationpump_output:on dim_circulationpump_output:off&lt;br /&gt;
attr hourcounter_circulationpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_circulationpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Warmwasserpumpe M18 definieren und passenden HourCounter für Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_output ModbusCoil 0 46&lt;br /&gt;
attr dim_dhwpump_output IODev HeatPumpServer&lt;br /&gt;
attr dim_dhwpump_output disableRegisterMapping 1&lt;br /&gt;
attr dim_dhwpump_output event-min-interval .*:900&lt;br /&gt;
attr dim_dhwpump_output event-on-change-reading .*&lt;br /&gt;
attr dim_dhwpump_output room Dimplex&lt;br /&gt;
attr dim_dhwpump_output source Coil&lt;br /&gt;
attr dim_dhwpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_dhwpump_output HourCounter dim_dhwpump_output:on dim_dhwpump_output:off&lt;br /&gt;
attr hourcounter_dhwpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_dhwpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Zusatzpumpe M16 definieren und Passenden HourCounter für Zusatzpumpe M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_auxiliarypump_output ModbusCoil 0 49&lt;br /&gt;
attr dim_auxiliarypump_output IODev HeatPumpServer&lt;br /&gt;
attr dim_auxiliarypump_output disableRegisterMapping 1&lt;br /&gt;
attr dim_auxiliarypump_output event-min-interval .*:900&lt;br /&gt;
attr dim_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
attr dim_auxiliarypump_output room Dimplex&lt;br /&gt;
attr dim_auxiliarypump_output source Coil&lt;br /&gt;
attr dim_auxiliarypump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_auxiliarypump_output HourCounter dim_auxiliarypump_output:on dim_auxiliarypump_output:off&lt;br /&gt;
attr hourcounter_auxiliarypump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Flanschheizung definieren und passenden HourCounter für Flanschheizung M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_output ModbusCoil 0 50&lt;br /&gt;
attr dim_flangeheater_output IODev HeatPumpServer&lt;br /&gt;
attr dim_flangeheater_output disableRegisterMapping 1&lt;br /&gt;
attr dim_flangeheater_output event-min-interval .*:900&lt;br /&gt;
attr dim_flangeheater_output event-on-change-reading .*&lt;br /&gt;
attr dim_flangeheater_output room Dimplex&lt;br /&gt;
attr dim_flangeheater_output source Coil&lt;br /&gt;
attr dim_flangeheater_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_flangeheater_output HourCounter dim_flangeheater_output:on dim_flangeheater_output:off&lt;br /&gt;
attr hourcounter_flangeheater_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_flangeheater_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Zustände ====&lt;br /&gt;
Anlegen eines wöchentlichen Logfile der Zustände:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_output_week FileLog ./log/filelog_dim_output_week-%W.log dim_.*._output.*&lt;br /&gt;
attr filelog_dim_output_week room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Historie. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_history      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_history      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_history       || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_history || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_history  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_history         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_history   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_history    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Register Historie Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_history ModbusRegister 0 72&lt;br /&gt;
attr dim_compressor_history IODev HeatPumpServer&lt;br /&gt;
attr dim_compressor_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_compressor_history event-on-change-reading .*&lt;br /&gt;
attr dim_compressor_history plcDataType INT&lt;br /&gt;
attr dim_compressor_history registerType Holding&lt;br /&gt;
attr dim_compressor_history room Dimplex&lt;br /&gt;
attr dim_compressor_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_history ModbusRegister 0 74&lt;br /&gt;
attr dim_ventilator_history IODev HeatPumpServer&lt;br /&gt;
attr dim_ventilator_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_ventilator_history event-on-change-reading .*&lt;br /&gt;
attr dim_ventilator_history plcDataType INT&lt;br /&gt;
attr dim_ventilator_history registerType Holding&lt;br /&gt;
attr dim_ventilator_history room Dimplex&lt;br /&gt;
attr dim_ventilator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_history ModbusRegister 0 75&lt;br /&gt;
attr dim_2heatgenerator_history IODev HeatPumpServer&lt;br /&gt;
attr dim_2heatgenerator_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_2heatgenerator_history event-on-change-reading .*&lt;br /&gt;
attr dim_2heatgenerator_history plcDataType INT&lt;br /&gt;
attr dim_2heatgenerator_history registerType Holding&lt;br /&gt;
attr dim_2heatgenerator_history room Dimplex&lt;br /&gt;
attr dim_2heatgenerator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_history ModbusRegister 0 76&lt;br /&gt;
attr dim_circulationpump_history IODev HeatPumpServer&lt;br /&gt;
attr dim_circulationpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_circulationpump_history event-on-change-reading .*&lt;br /&gt;
attr dim_circulationpump_history plcDataType INT&lt;br /&gt;
attr dim_circulationpump_history registerType Holding&lt;br /&gt;
attr dim_circulationpump_history room Dimplex&lt;br /&gt;
attr dim_circulationpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_history ModbusRegister 0 77&lt;br /&gt;
attr dim_dhwpump_history IODev HeatPumpServer&lt;br /&gt;
attr dim_dhwpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_dhwpump_history event-on-change-reading .*&lt;br /&gt;
attr dim_dhwpump_history plcDataType INT&lt;br /&gt;
attr dim_dhwpump_history registerType Holding&lt;br /&gt;
attr dim_dhwpump_history room Dimplex&lt;br /&gt;
attr dim_dhwpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Flanschheizung definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_history ModbusRegister 0 78&lt;br /&gt;
attr dim_flangeheater_history IODev HeatPumpServer&lt;br /&gt;
attr dim_flangeheater_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_flangeheater_history event-on-change-reading .*&lt;br /&gt;
attr dim_flangeheater_history plcDataType INT&lt;br /&gt;
attr dim_flangeheater_history registerType Holding&lt;br /&gt;
attr dim_flangeheater_history room Dimplex&lt;br /&gt;
attr dim_flangeheater_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Logfile Historie ====&lt;br /&gt;
Anlegen eines monatlichen Logfile für die Historischen Daten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_history_month FileLog ./log/filelog_dim_history_month-%m.log dim_.*._history.*&lt;br /&gt;
attr filelog_dim_history_month room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Wärmemengen ====&lt;br /&gt;
Laut Definition aus dem [http://www.dimplex.de/wiki Dimplex-Wiki] werden die Wärmemengen für Heizen, Warmwasser und Schwimmbad aus 3 Register-Adressen zusammengesetzt. Im Nachfolgenden Code-Beispiel wird dies entsprechend dargestellt. Dabei wird jeweils im ersten Register ein neues userReading mit der Darstellung der Gesamtwärmemenge angelegt.&lt;br /&gt;
&lt;br /&gt;
Wärmemenge Heizen definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_heating1_thermalenergy ModbusRegister 0 5096&lt;br /&gt;
attr dim_heating1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_heating1_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_heating1_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_heating1_thermalenergy registerType Holding&lt;br /&gt;
attr dim_heating1_thermalenergy room Dimplex&lt;br /&gt;
attr dim_heating1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
attr dim_heating1_thermalenergy userReadings heatingthermalenergy {\&lt;br /&gt;
((ReadingsVal(&amp;quot;dim_heating3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
(ReadingsVal(&amp;quot;dim_heating2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
(ReadingsVal(&amp;quot;dim_heating1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_heating2_thermalenergy ModbusRegister 0 5097&lt;br /&gt;
attr dim_heating2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_heating2_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_heating2_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_heating2_thermalenergy registerType Holding&lt;br /&gt;
attr dim_heating2_thermalenergy room Dimplex&lt;br /&gt;
attr dim_heating2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_heating3_thermalenergy ModbusRegister 0 5098&lt;br /&gt;
attr dim_heating3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_heating3_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_heating3_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_heating3_thermalenergy registerType Holding&lt;br /&gt;
attr dim_heating3_thermalenergy room Dimplex&lt;br /&gt;
attr dim_heating3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Wärmemenge Warmwasser definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw1_thermalenergy ModbusRegister 0 5099&lt;br /&gt;
attr dim_dhw1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_dhw1_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_dhw1_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_dhw1_thermalenergy registerType Holding&lt;br /&gt;
attr dim_dhw1_thermalenergy room Dimplex&lt;br /&gt;
attr dim_dhw1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
attr dim_dhw1_thermalenergy userReadings dhwthermalenergy {\                 ((ReadingsVal(&amp;quot;dim_dhw3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
(ReadingsVal(&amp;quot;dim_dhw2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
(ReadingsVal(&amp;quot;dim_dhw1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_dhw2_thermalenergy ModbusRegister 0 5100&lt;br /&gt;
attr dim_dhw2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_dhw2_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_dhw2_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_dhw2_thermalenergy registerType Holding&lt;br /&gt;
attr dim_dhw2_thermalenergy room Dimplex&lt;br /&gt;
attr dim_dhw2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_dhw3_thermalenergy ModbusRegister 0 5101&lt;br /&gt;
attr dim_dhw3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_dhw3_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_dhw3_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_dhw3_thermalenergy registerType Holding&lt;br /&gt;
attr dim_dhw3_thermalenergy room Dimplex&lt;br /&gt;
attr dim_dhw3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Umweltenergie ====&lt;br /&gt;
Als Umweltenergie wird die zugeführte Kälteenergie aus der Umwelt (Luft/Erdreich) bezeichnet. Das Auslesen dieser Werte über die Schnittstelle ist erst ab einem neueren Softwarestand möglich. Die Differenz der gesamten Wärmemenge und der Umweltenergie entspricht in etwa der Energie des Verdichters.&lt;br /&gt;
&lt;br /&gt;
Umweltenergie/entzogene Kälteenergie definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_environment1_energy ModbusRegister 0 5127&lt;br /&gt;
attr dim_environment1_energy IODev HeatPumpServer&lt;br /&gt;
attr dim_environment1_energy event-on-change-reading .*&lt;br /&gt;
attr dim_environment1_energy plcDataType INT&lt;br /&gt;
attr dim_environment1_energy registerType Holding&lt;br /&gt;
attr dim_environment1_energy room Dimplex&lt;br /&gt;
attr dim_environment1_energy updateInterval 00:15:00&lt;br /&gt;
attr dim_environment1_energy userReadings environmentenergy {\&lt;br /&gt;
((ReadingsVal(&amp;quot;dim_environment3_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
(ReadingsVal(&amp;quot;dim_environment2_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
(ReadingsVal(&amp;quot;dim_environment1_energy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_environment2_energy ModbusRegister 0 5128&lt;br /&gt;
attr dim_environment2_energy IODev HeatPumpServer&lt;br /&gt;
attr dim_environment2_energy event-on-change-reading .*&lt;br /&gt;
attr dim_environment2_energy plcDataType INT&lt;br /&gt;
attr dim_environment2_energy registerType Holding&lt;br /&gt;
attr dim_environment2_energy room Dimplex&lt;br /&gt;
attr dim_environment2_energy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_environment3_energy ModbusRegister 0 5129&lt;br /&gt;
attr dim_environment3_energy IODev HeatPumpServer&lt;br /&gt;
attr dim_environment3_energy event-on-change-reading .*&lt;br /&gt;
attr dim_environment3_energy plcDataType INT&lt;br /&gt;
attr dim_environment3_energy registerType Holding&lt;br /&gt;
attr dim_environment3_energy room Dimplex&lt;br /&gt;
attr dim_environment3_energy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Wärmemengen ====&lt;br /&gt;
Anlegen eines jährlichen Logfile der Wärmemengen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_thermalenergy_year FileLog ./log/filelog_dim_thermalenergy_year-%y.log dim_heating1_thermalenergy:heatingthermalenergy:.*|dim_heating1_thermalenergy:heatingthermalenergy:.*&lt;br /&gt;
attr filelog_dim_thermalenergy_year room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Meldungen ===&lt;br /&gt;
[[Bild:dimplex_rh_status_heatpump.jpg|thumb|right|Beispiel Meldungen]]&lt;br /&gt;
Eine sinnvolle Anzeige sind die Meldungen (Status, Sperre, Störung) der Wärmepumpe. Im nachfolgenden Beispiel werden die Meldungen mit dem Hilfsmodul [[readingsHistory]] dargestellt. Die Definitionen der Meldungen beziehen sich auf die im [http://www.dimplex.de/wiki Dimplex-Wiki] beschriebene L-Software. Bei abweichenden Softwareständen müssen die Register sowie die Texte angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Register Statusmeldung definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_status_heatpump ModbusRegister 0 103&lt;br /&gt;
attr dim_status_heatpump IODev HeatPumpServer&lt;br /&gt;
attr dim_status_heatpump event-on-change-reading .*&lt;br /&gt;
attr dim_status_heatpump plcDataType INT&lt;br /&gt;
attr dim_status_heatpump registerType Holding&lt;br /&gt;
attr dim_status_heatpump room Dimplex&lt;br /&gt;
attr dim_status_heatpump updateInterval 00:00:10&lt;br /&gt;
attr dim_status_heatpump userReadings Status {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 1) ? &amp;quot;Aus&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 4) ? &amp;quot;Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Abtauen&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Durchflussüberwachnung&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Sperrmeldunge definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_block_heatpump ModbusRegister 0 104&lt;br /&gt;
attr dim_block_heatpump IODev HeatPumpServer&lt;br /&gt;
attr dim_block_heatpump event-on-change-reading .*&lt;br /&gt;
attr dim_block_heatpump plcDataType INT&lt;br /&gt;
attr dim_block_heatpump registerType Holding&lt;br /&gt;
attr dim_block_heatpump room Dimplex&lt;br /&gt;
attr dim_block_heatpump updateInterval 00:00:10&lt;br /&gt;
attr dim_block_heatpump userReadings Sperre {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 7) ? &amp;quot;Systemkontrolle&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 9) ? &amp;quot;Pumpenvorlauf&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Mindeststandzeit&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Netzbelastung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 12) ? &amp;quot;Schaltspielsperre&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;EVU&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Störmeldungen definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_fault_heatpump ModbusRegister 0 105&lt;br /&gt;
attr dim_fault_heatpump IODev HeatPumpServer&lt;br /&gt;
attr dim_fault_heatpump event-on-change-reading .*&lt;br /&gt;
attr dim_fault_heatpump plcDataType INT&lt;br /&gt;
attr dim_fault_heatpump registerType Holding&lt;br /&gt;
attr dim_fault_heatpump room Dimplex&lt;br /&gt;
attr dim_fault_heatpump updateInterval 00:01:00&lt;br /&gt;
attr dim_fault_heatpump userReadings Störung {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 6) ? &amp;quot;Elektronisches Ex.Ventil&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;Sensorik&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 19) ? &amp;quot;!Primärkreis&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 22) ? &amp;quot;!Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 23) ? &amp;quot;!Last Verdichter&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 24) ? &amp;quot;!Codierung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 25) ? &amp;quot;!Niederdruck&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 26) ? &amp;quot;!Frostschutz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 29) ? &amp;quot;!Temperatur Differenz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 31) ? &amp;quot;!Durchfluss&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Anzeige der Meldungen ====&lt;br /&gt;
readingsHistory definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define rh_dim_status_heatpump readingsHistory dim_status_heatpump:Status dim_block_heatpump:Sperre dim_fault_heatpump:Störung&lt;br /&gt;
attr rh_dim_status_heatpump alias Status&lt;br /&gt;
attr rh_dim_status_heatpump mapping {&#039;dim_status_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_block_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_fault_heatpump&#039; =&amp;gt; &#039;&#039;}&lt;br /&gt;
attr rh_dim_status_heatpump nohtml 1&lt;br /&gt;
attr rh_dim_status_heatpump room Dimplex&lt;br /&gt;
attr rh_dim_status_heatpump rows 20&lt;br /&gt;
attr rh_dim_status_heatpump timestampFormat %b %a %R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plotbeispiel ==&lt;br /&gt;
=== Temperaturen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:40:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set ytics nomirror&lt;br /&gt;
set y2tics &lt;br /&gt;
set grid ytics y2tics&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Temperatur (°C)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_outdoor_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_room_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_return_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_returnset_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_dhw_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_flow_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_brine_temperature.*::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;AT&#039; ls l7 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RT&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RL&#039; ls l2 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RLS&#039; ls l3 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;WWT&#039; ls l4 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;VLT&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;SOL&#039; ls l6 lw 1 with lines&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgänge ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:45:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
set ytics (&amp;quot;An&amp;quot; -1, &amp;quot;Aus&amp;quot; -2, &amp;quot;An&amp;quot; -5, &amp;quot;Aus&amp;quot; -6, &amp;quot;An&amp;quot; -9, &amp;quot;Aus&amp;quot; -10, &amp;quot;An&amp;quot; -13, &amp;quot;Aus&amp;quot; -14)&lt;br /&gt;
set y2tics (&amp;quot;An&amp;quot; 1, &amp;quot;Aus&amp;quot; 0, &amp;quot;An&amp;quot; -3, &amp;quot;Aus&amp;quot; -4, &amp;quot;An&amp;quot; -7, &amp;quot;Aus&amp;quot; -8, &amp;quot;An&amp;quot; -11, &amp;quot;Aus&amp;quot; -12)&lt;br /&gt;
set grid&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Digital&amp;quot;&lt;br /&gt;
set yrange [-16:2]&lt;br /&gt;
set y2range [-16:2]&lt;br /&gt;
&lt;br /&gt;
#FileLog 3:dim_compressor_output.*::$fld[2]=~&amp;quot;on&amp;quot;?1:0&lt;br /&gt;
#FileLog 3:dim_ventilator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-1:-2&lt;br /&gt;
#FileLog 3:dim_2heatgenerator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-3:-4&lt;br /&gt;
#FileLog 3:dim_circulationpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-5:-6&lt;br /&gt;
#FileLog 3:dim_dhwpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-7:-8&lt;br /&gt;
#FileLog 3:dim_auxiliarypump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-9:-10&lt;br /&gt;
#FileLog 3:dim_solarpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-11:-12&lt;br /&gt;
#FileLog 3:dim_flangeheater_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-13:-14&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Vd&#039; ls l7 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Ve&#039; ls l6 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;2.We&#039; ls l5 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Hub&#039; ls l4 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Wup&#039; ls l3 lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Zup&#039; ls l0 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Sol&#039; ls l2 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Flh&#039; ls l7 lw 1.5 with steps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:dimplex_hp_graph.jpg|thumb|right|Plotbeispiel]]&lt;br /&gt;
Im nebenstehenden Plotbeispiel werde die Temperaturen (Analogwerte) sowie die Ausgänge (Digitalwerte) dargestellt. Im einzelnen sind die Kurven für die&lt;br /&gt;
&lt;br /&gt;
* Aussen- (AT)&lt;br /&gt;
* Raum- (RT)&lt;br /&gt;
* Rücklauf- (RL)&lt;br /&gt;
* Rücklaufsoll- (RLS)&lt;br /&gt;
* Warmwasser- (WWT) und &lt;br /&gt;
* Vorlauftemperatur (VLT) &lt;br /&gt;
&lt;br /&gt;
sowie die Ausgänge für&lt;br /&gt;
&lt;br /&gt;
* Verdichter 1 (Vd)&lt;br /&gt;
* Ventilator (Ve)&lt;br /&gt;
* 2.Wärmeerzeuger (2We)&lt;br /&gt;
* Heizungsumwälzpumpe (Hup)&lt;br /&gt;
* Warmwasserumwälzpumpe (Wup) und&lt;br /&gt;
* Zusatzumwälzpumpe (Zup)&lt;br /&gt;
&lt;br /&gt;
enthalten.&lt;br /&gt;
&lt;br /&gt;
= Kontakt =&lt;br /&gt;
Weitere Fragen, Wünsche und Anregungen bitte im entsprechenden {{Link2Forum|Topic=33086|LinkText=Forenthread zum Wiki-Artikel &amp;quot;Dimplex Wärmepumpenmanager&amp;quot;}} zur Diskussion stellen.&lt;br /&gt;
&lt;br /&gt;
Offene Punkte:&lt;br /&gt;
- Darstellung der Werte in einer readingsGroup&lt;br /&gt;
- Zugriff auf Zeitfunktionen mit Lesen und Schreiben&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40083</id>
		<title>Dimplex Wärmepumpenmanager</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40083"/>
		<updated>2025-03-30T16:55:14Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- bitte noch die Abkürzung &amp;quot;NWPM&amp;quot; erklären (Benutzer:Ph1959de, 2015/02/02) --&amp;gt;&lt;br /&gt;
Mit der NWPM-Erweiterung ist es möglich, den Dimplex Wärmepumpenmanager in ein Hausnetzwerk einzubinden. Durch die Einbindung der NWPM-Erweiterung ist es ebenfalls möglich, die zur Verfügung gestellten Werte vom Wärmepumpenmanager mittels ModbusTCP in FHEM zu übernehmen, anzuzeigen und grafisch darzustellen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzung ==&lt;br /&gt;
Die Anbindung des Dimplex Wärmepumpenmanager an FHEM erfolgt mittels NWPM-Erweiterung und der aktuellen FHEM Installation. Weiterhin werden die zur Verfügung stehenden Module:&lt;br /&gt;
&lt;br /&gt;
* 36_ModbusTCPServer.pm &lt;br /&gt;
* 37_ModbusCoil.pm&lt;br /&gt;
* 37_ModbusRegister.pm&lt;br /&gt;
&lt;br /&gt;
genutzt. Getestet wurde der Zugriff auf einem BeagleBone Black mit der [[BeagleBone Black|hier beschriebenen]] Debian Installation.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Die oben aufgeführten Module sind notwendig und müssen nachinstalliert werden. Zum Zeitpunkt der Erstellung dieser Dokumentation (31.1.2015) sind diese noch nicht offiziell in FHEM enthalten und werden auch nicht mittels Update verteilt. Die Module werden mit dem Befehl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update all https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mb/controls_modbus.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
über die FHEM Befehlszeile installiert und anschließend&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reload 36_ModbusTCPServer.pm &lt;br /&gt;
reload 37_ModbusCoil.pm&lt;br /&gt;
reload 37_ModbusRegister.pm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
mit einem Reload geladen.&lt;br /&gt;
== Benutzung == &lt;br /&gt;
=== Anlegen der ModbusTCPServer Verbindung ===&lt;br /&gt;
Wie im nachfolgenden angegeben muss zunächst eine ModbusTCPServer Verbindung hergestellt werden. Die angegebene IP-Adresse muss durch die IP-Adresse der Wärmepumpe ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
########################################################&lt;br /&gt;
##  ModbusTCPServer definieren&lt;br /&gt;
########################################################&lt;br /&gt;
define HeatPumpServer ModbusTCPServer 192.168.1.150&lt;br /&gt;
attr HeatPumpServer verbose 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ein erfolgreicher Verbindungsaufbau wird mit einem „ok“ im State gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
=== Modbus-Register/Coil Adressen definieren ===&lt;br /&gt;
Im nachfolgendem Beispiel wird anhand der Außentemperatur die Adressdefinition erklärt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_outdoor_temperature ModbusRegister 0 1&lt;br /&gt;
attr dim_outdoor_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_outdoor_temperature conversion 0.1:0&lt;br /&gt;
attr dim_outdoor_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_outdoor_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_outdoor_temperature plcDataType INT&lt;br /&gt;
attr dim_outdoor_temperature registerType Holding&lt;br /&gt;
attr dim_outdoor_temperature room Dimplex&lt;br /&gt;
attr dim_outdoor_temperature stateAlias temperature&lt;br /&gt;
attr dim_outdoor_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_outdoor_temperature updateInterval 00:10:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erklärung:&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Erläuterungen zur Adressdefinition&lt;br /&gt;
|-&lt;br /&gt;
! Attribut !! Erläuterungen&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 0 Device Adresse, in der Regel bei ModbusTCP immer 0&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 1 Register Adresse, wird unter www.dimplex.de/wiki → ModbusTCP → Spalten IP zur Verfügung gestellt&lt;br /&gt;
|-&lt;br /&gt;
| IODev              || Verwendeter und zuvor angelegter ModbusTCPServer&lt;br /&gt;
|-&lt;br /&gt;
| conversion         || eine gegebenenfalls notwendige Konvertierung des übermittelten Values&lt;br /&gt;
|-&lt;br /&gt;
| PlcDataType        || Ermögliche automatische Interpretation der ankommenden Daten&lt;br /&gt;
|-&lt;br /&gt;
| stateAlias         || es wird ein zusätzliches Reading erzeugt, um zum Beispiel das Statistic-Modul nutzen zu können, stateAlias ist eine echte Kopie von &amp;quot;state&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| updateInterval    || Intervall des Abfragezyklus (z.B. 00:10:00 Minuten)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Betriebsdaten ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Betriebsdaten. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_outdoor_temperature     || Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_flow_temperature        || Vorlauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_return_temperature      || Rücklauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_returnset_temperature   || Rücklaufsolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_room_temperature        || Raumtemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhw_temperature         || Warmwassertemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwset_temperature      || Warmwassersolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_brine_temperature       || Soletemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_high_pressure           || Hochdruck&lt;br /&gt;
|-&lt;br /&gt;
| dim_low_pressure           || Niederdruck&lt;br /&gt;
|}&lt;br /&gt;
Register Warmwassertemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw_temperature ModbusRegister 0 3&lt;br /&gt;
attr dim_dhw_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_dhw_temperature conversion 0.1:0&lt;br /&gt;
attr dim_dhw_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_dhw_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_dhw_temperature plcDataType INT&lt;br /&gt;
attr dim_dhw_temperature registerType Holding&lt;br /&gt;
attr dim_dhw_temperature room Dimplex&lt;br /&gt;
attr dim_dhw_temperature stateAlias temperature&lt;br /&gt;
attr dim_dhw_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_dhw_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Vorlauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flow_temperature ModbusRegister 0 5&lt;br /&gt;
attr dim_flow_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_flow_temperature conversion 0.1:0&lt;br /&gt;
attr dim_flow_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_flow_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_flow_temperature plcDataType INT&lt;br /&gt;
attr dim_flow_temperature registerType Holding&lt;br /&gt;
attr dim_flow_temperature room Dimplex&lt;br /&gt;
attr dim_flow_temperature stateAlias temperature&lt;br /&gt;
attr dim_flow_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_flow_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_return_temperature ModbusRegister 0 2&lt;br /&gt;
attr dim_return_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_return_temperature conversion 0.1:0&lt;br /&gt;
attr dim_return_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_return_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_return_temperature plcDataType INT&lt;br /&gt;
attr dim_return_temperature registerType Holding&lt;br /&gt;
attr dim_return_temperature room Dimplex&lt;br /&gt;
attr dim_return_temperature stateAlias temperature&lt;br /&gt;
attr dim_return_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_return_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklaufsolltemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_returnset_temperature ModbusRegister 0 53&lt;br /&gt;
attr dim_returnset_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_returnset_temperature conversion 0.1:0&lt;br /&gt;
attr dim_returnset_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_returnset_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_returnset_temperature plcDataType INT&lt;br /&gt;
attr dim_returnset_temperature registerType Holding&lt;br /&gt;
attr dim_returnset_temperature room Dimplex&lt;br /&gt;
attr dim_returnset_temperature stateAlias temperature&lt;br /&gt;
attr dim_returnset_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_returnset_temperature updateInterval 00:05:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Betriebsdaten ====&lt;br /&gt;
Anlegen eines täglichen Logfile der Betriebsdaten.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_temperature FileLog ./log/filelog_dim_temperature-%W-%d.log dim_.*._temperature:temperature:.*|dim_.*._pressure:pressure:.*&lt;br /&gt;
attr filelog_dim_temperature room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Statistiken ====&lt;br /&gt;
Folgender Code legt die Statistiken der Betriebsdaten an&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_statistics statistics dim_.*._temperature|dim_.*._pressure&lt;br /&gt;
attr dim_statistics dayChangeTime 1&lt;br /&gt;
attr dim_statistics deltaReadings temperature,pressure&lt;br /&gt;
attr dim_statistics minAvgMaxReadings temperature,pressure&lt;br /&gt;
attr dim_statistics room Dimplex&lt;br /&gt;
attr dim_statistics tendencyReadings temperature,pressure&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustände ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Zustände. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_output      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_output      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_ output      || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_output || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_output  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_output         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_output   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_output    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Coil Verdichter und passenden HourCounter für Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_output ModbusCoil 0 41&lt;br /&gt;
attr dim_compressor_output IODev HeatPumpServer&lt;br /&gt;
attr dim_compressor_output disableRegisterMapping 1&lt;br /&gt;
attr dim_compressor_output event-min-interval .*:900&lt;br /&gt;
attr dim_compressor_output event-on-change-reading .*&lt;br /&gt;
attr dim_compressor_output room Dimplex&lt;br /&gt;
attr dim_compressor_output source Coil&lt;br /&gt;
attr dim_compressor_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_compressor_output HourCounter dim_compressor_output:on dim_compressor_output:off&lt;br /&gt;
attr hourcounter_compressor_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_compressor_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Ventilator definieren und passenden HourCounter für Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_output ModbusCoil 0 43&lt;br /&gt;
attr dim_ventilator_output IODev HeatPumpServer&lt;br /&gt;
attr dim_ventilator_output disableRegisterMapping 1&lt;br /&gt;
attr dim_ventilator_output event-min-interval .*:900&lt;br /&gt;
attr dim_ventilator_output event-on-change-reading .*&lt;br /&gt;
attr dim_ventilator_output room Dimplex&lt;br /&gt;
attr dim_ventilator_output source Coil&lt;br /&gt;
attr dim_ventilator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_ventilator_output HourCounter dim_ventilator_output:on dim_ventilator_output:off&lt;br /&gt;
attr hourcounter_ventilator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_ventilator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil 2.Wärmeerzeuger definieren und passenden HourCounter für 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_output ModbusCoil 0 44&lt;br /&gt;
attr dim_2heatgenerator_output IODev HeatPumpServer&lt;br /&gt;
attr dim_2heatgenerator_output disableRegisterMapping 1&lt;br /&gt;
attr dim_2heatgenerator_output event-min-interval .*:900&lt;br /&gt;
attr dim_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
attr dim_2heatgenerator_output room Dimplex&lt;br /&gt;
attr dim_2heatgenerator_output source Coil&lt;br /&gt;
attr dim_2heatgenerator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_2heatgenerator_output HourCounter dim_2heatgenerator_output:on dim_2heatgenerator_output:off&lt;br /&gt;
attr hourcounter_2heatgenerator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Heizungsumwälzpumpe M13 definieren und passenden HourCounter für Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_output ModbusCoil 0 45&lt;br /&gt;
attr dim_circulationpump_output IODev HeatPumpServer&lt;br /&gt;
attr dim_circulationpump_output disableRegisterMapping 1&lt;br /&gt;
attr dim_circulationpump_output event-min-interval .*:900&lt;br /&gt;
attr dim_circulationpump_output event-on-change-reading .*&lt;br /&gt;
attr dim_circulationpump_output room Dimplex&lt;br /&gt;
attr dim_circulationpump_output source Coil&lt;br /&gt;
attr dim_circulationpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_circulationpump_output HourCounter dim_circulationpump_output:on dim_circulationpump_output:off&lt;br /&gt;
attr hourcounter_circulationpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_circulationpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Warmwasserpumpe M18 definieren und passenden HourCounter für Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_output ModbusCoil 0 46&lt;br /&gt;
attr dim_dhwpump_output IODev HeatPumpServer&lt;br /&gt;
attr dim_dhwpump_output disableRegisterMapping 1&lt;br /&gt;
attr dim_dhwpump_output event-min-interval .*:900&lt;br /&gt;
attr dim_dhwpump_output event-on-change-reading .*&lt;br /&gt;
attr dim_dhwpump_output room Dimplex&lt;br /&gt;
attr dim_dhwpump_output source Coil&lt;br /&gt;
attr dim_dhwpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_dhwpump_output HourCounter dim_dhwpump_output:on dim_dhwpump_output:off&lt;br /&gt;
attr hourcounter_dhwpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_dhwpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Zusatzpumpe M16 definieren und Passenden HourCounter für Zusatzpumpe M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_auxiliarypump_output ModbusCoil 0 49&lt;br /&gt;
attr dim_auxiliarypump_output IODev HeatPumpServer&lt;br /&gt;
attr dim_auxiliarypump_output disableRegisterMapping 1&lt;br /&gt;
attr dim_auxiliarypump_output event-min-interval .*:900&lt;br /&gt;
attr dim_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
attr dim_auxiliarypump_output room Dimplex&lt;br /&gt;
attr dim_auxiliarypump_output source Coil&lt;br /&gt;
attr dim_auxiliarypump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_auxiliarypump_output HourCounter dim_auxiliarypump_output:on dim_auxiliarypump_output:off&lt;br /&gt;
attr hourcounter_auxiliarypump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Flanschheizung definieren und passenden HourCounter für Flanschheizung M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_output ModbusCoil 0 50&lt;br /&gt;
attr dim_flangeheater_output IODev HeatPumpServer&lt;br /&gt;
attr dim_flangeheater_output disableRegisterMapping 1&lt;br /&gt;
attr dim_flangeheater_output event-min-interval .*:900&lt;br /&gt;
attr dim_flangeheater_output event-on-change-reading .*&lt;br /&gt;
attr dim_flangeheater_output room Dimplex&lt;br /&gt;
attr dim_flangeheater_output source Coil&lt;br /&gt;
attr dim_flangeheater_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_flangeheater_output HourCounter dim_flangeheater_output:on dim_flangeheater_output:off&lt;br /&gt;
attr hourcounter_flangeheater_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_flangeheater_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Zustände ====&lt;br /&gt;
Anlegen eines wöchentlichen Logfile der Zustände:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_output_week FileLog ./log/filelog_dim_output_week-%W.log dim_.*._output.*&lt;br /&gt;
attr filelog_dim_output_week room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Historie. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_history      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_history      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_history       || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_history || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_history  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_history         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_history   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_history    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Register Historie Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_history ModbusRegister 0 72&lt;br /&gt;
attr dim_compressor_history IODev HeatPumpServer&lt;br /&gt;
attr dim_compressor_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_compressor_history event-on-change-reading .*&lt;br /&gt;
attr dim_compressor_history plcDataType INT&lt;br /&gt;
attr dim_compressor_history registerType Holding&lt;br /&gt;
attr dim_compressor_history room Dimplex&lt;br /&gt;
attr dim_compressor_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_history ModbusRegister 0 74&lt;br /&gt;
attr dim_ventilator_history IODev HeatPumpServer&lt;br /&gt;
attr dim_ventilator_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_ventilator_history event-on-change-reading .*&lt;br /&gt;
attr dim_ventilator_history plcDataType INT&lt;br /&gt;
attr dim_ventilator_history registerType Holding&lt;br /&gt;
attr dim_ventilator_history room Dimplex&lt;br /&gt;
attr dim_ventilator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_history ModbusRegister 0 75&lt;br /&gt;
attr dim_2heatgenerator_history IODev HeatPumpServer&lt;br /&gt;
attr dim_2heatgenerator_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_2heatgenerator_history event-on-change-reading .*&lt;br /&gt;
attr dim_2heatgenerator_history plcDataType INT&lt;br /&gt;
attr dim_2heatgenerator_history registerType Holding&lt;br /&gt;
attr dim_2heatgenerator_history room Dimplex&lt;br /&gt;
attr dim_2heatgenerator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_history ModbusRegister 0 76&lt;br /&gt;
attr dim_circulationpump_history IODev HeatPumpServer&lt;br /&gt;
attr dim_circulationpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_circulationpump_history event-on-change-reading .*&lt;br /&gt;
attr dim_circulationpump_history plcDataType INT&lt;br /&gt;
attr dim_circulationpump_history registerType Holding&lt;br /&gt;
attr dim_circulationpump_history room Dimplex&lt;br /&gt;
attr dim_circulationpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_history ModbusRegister 0 77&lt;br /&gt;
attr dim_dhwpump_history IODev HeatPumpServer&lt;br /&gt;
attr dim_dhwpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_dhwpump_history event-on-change-reading .*&lt;br /&gt;
attr dim_dhwpump_history plcDataType INT&lt;br /&gt;
attr dim_dhwpump_history registerType Holding&lt;br /&gt;
attr dim_dhwpump_history room Dimplex&lt;br /&gt;
attr dim_dhwpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Flanschheizung definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_history ModbusRegister 0 78&lt;br /&gt;
attr dim_flangeheater_history IODev HeatPumpServer&lt;br /&gt;
attr dim_flangeheater_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_flangeheater_history event-on-change-reading .*&lt;br /&gt;
attr dim_flangeheater_history plcDataType INT&lt;br /&gt;
attr dim_flangeheater_history registerType Holding&lt;br /&gt;
attr dim_flangeheater_history room Dimplex&lt;br /&gt;
attr dim_flangeheater_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Logfile Historie ====&lt;br /&gt;
Anlegen eines monatlichen Logfile für die Historischen Daten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_history_month FileLog ./log/filelog_dim_history_month-%m.log dim_.*._history.*&lt;br /&gt;
attr filelog_dim_history_month room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Wärmemengen ====&lt;br /&gt;
Laut Definition aus dem [http://www.dimplex.de/wiki Dimplex-Wiki] werden die Wärmemengen für Heizen, Warmwasser und Schwimmbad aus 3 Register-Adressen zusammengesetzt. Im Nachfolgenden Code-Beispiel wird dies entsprechend dargestellt. Dabei wird jeweils im ersten Register ein neues userReading mit der Darstellung der Gesamtwärmemenge angelegt.&lt;br /&gt;
&lt;br /&gt;
Wärmemenge Heizen definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_heating1_thermalenergy ModbusRegister 0 5096&lt;br /&gt;
attr dim_heating1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_heating1_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_heating1_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_heating1_thermalenergy registerType Holding&lt;br /&gt;
attr dim_heating1_thermalenergy room Dimplex&lt;br /&gt;
attr dim_heating1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
attr dim_heating1_thermalenergy userReadings heatingthermalenergy {\&lt;br /&gt;
                                    ((ReadingsVal(&amp;quot;dim_heating3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                     (ReadingsVal(&amp;quot;dim_heating2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                     (ReadingsVal(&amp;quot;dim_heating1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_heating2_thermalenergy ModbusRegister 0 5097&lt;br /&gt;
attr dim_heating2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_heating2_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_heating2_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_heating2_thermalenergy registerType Holding&lt;br /&gt;
attr dim_heating2_thermalenergy room Dimplex&lt;br /&gt;
attr dim_heating2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_heating3_thermalenergy ModbusRegister 0 5098&lt;br /&gt;
attr dim_heating3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_heating3_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_heating3_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_heating3_thermalenergy registerType Holding&lt;br /&gt;
attr dim_heating3_thermalenergy room Dimplex&lt;br /&gt;
attr dim_heating3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Wärmemenge Warmwasser definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw1_thermalenergy ModbusRegister 0 5099&lt;br /&gt;
attr dim_dhw1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_dhw1_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_dhw1_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_dhw1_thermalenergy registerType Holding&lt;br /&gt;
attr dim_dhw1_thermalenergy room Dimplex&lt;br /&gt;
attr dim_dhw1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
attr dim_dhw1_thermalenergy userReadings dhwthermalenergy {\                 ((ReadingsVal(&amp;quot;dim_dhw3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
(ReadingsVal(&amp;quot;dim_dhw2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
(ReadingsVal(&amp;quot;dim_dhw1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_dhw2_thermalenergy ModbusRegister 0 5100&lt;br /&gt;
attr dim_dhw2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_dhw2_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_dhw2_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_dhw2_thermalenergy registerType Holding&lt;br /&gt;
attr dim_dhw2_thermalenergy room Dimplex&lt;br /&gt;
attr dim_dhw2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_dhw3_thermalenergy ModbusRegister 0 5101&lt;br /&gt;
attr dim_dhw3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_dhw3_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_dhw3_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_dhw3_thermalenergy registerType Holding&lt;br /&gt;
attr dim_dhw3_thermalenergy room Dimplex&lt;br /&gt;
attr dim_dhw3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Umweltenergie ====&lt;br /&gt;
Als Umweltenergie wird die zugeführte Kälteenergie aus der Umwelt (Luft/Erdreich) bezeichnet. Das Auslesen dieser Werte über die Schnittstelle ist erst ab einem neueren Softwarestand möglich. Die Differenz der gesamten Wärmemenge und der Umweltenergie entspricht in etwa der Energie des Verdichters.&lt;br /&gt;
&lt;br /&gt;
Umweltenergie/entzogene Kälteenergie definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_environment1_energy ModbusRegister 0 5127&lt;br /&gt;
attr dim_environment1_energy IODev HeatPumpServer&lt;br /&gt;
attr dim_environment1_energy event-on-change-reading .*&lt;br /&gt;
attr dim_environment1_energy plcDataType INT&lt;br /&gt;
attr dim_environment1_energy registerType Holding&lt;br /&gt;
attr dim_environment1_energy room Dimplex&lt;br /&gt;
attr dim_environment1_energy updateInterval 00:15:00&lt;br /&gt;
attr dim_environment1_energy userReadings environmentenergy {\&lt;br /&gt;
                                 ((ReadingsVal(&amp;quot;dim_environment3_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                  (ReadingsVal(&amp;quot;dim_environment2_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                  (ReadingsVal(&amp;quot;dim_environment1_energy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_environment2_energy ModbusRegister 0 5128&lt;br /&gt;
attr dim_environment2_energy IODev HeatPumpServer&lt;br /&gt;
attr dim_environment2_energy event-on-change-reading .*&lt;br /&gt;
attr dim_environment2_energy plcDataType INT&lt;br /&gt;
attr dim_environment2_energy registerType Holding&lt;br /&gt;
attr dim_environment2_energy room Dimplex&lt;br /&gt;
attr dim_environment2_energy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_environment3_energy ModbusRegister 0 5129&lt;br /&gt;
attr dim_environment3_energy IODev HeatPumpServer&lt;br /&gt;
attr dim_environment3_energy event-on-change-reading .*&lt;br /&gt;
attr dim_environment3_energy plcDataType INT&lt;br /&gt;
attr dim_environment3_energy registerType Holding&lt;br /&gt;
attr dim_environment3_energy room Dimplex&lt;br /&gt;
attr dim_environment3_energy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Wärmemengen ====&lt;br /&gt;
Anlegen eines jährlichen Logfile der Wärmemengen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_thermalenergy_year FileLog ./log/filelog_dim_thermalenergy_year-%y.log dim_heating1_thermalenergy:heatingthermalenergy:.*|dim_heating1_thermalenergy:heatingthermalenergy:.*&lt;br /&gt;
attr filelog_dim_thermalenergy_year room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Meldungen ===&lt;br /&gt;
[[Bild:dimplex_rh_status_heatpump.jpg|thumb|right|Beispiel Meldungen]]&lt;br /&gt;
Eine sinnvolle Anzeige sind die Meldungen (Status, Sperre, Störung) der Wärmepumpe. Im nachfolgenden Beispiel werden die Meldungen mit dem Hilfsmodul [[readingsHistory]] dargestellt. Die Definitionen der Meldungen beziehen sich auf die im [http://www.dimplex.de/wiki Dimplex-Wiki] beschriebene L-Software. Bei abweichenden Softwareständen müssen die Register sowie die Texte angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Register Statusmeldung definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_status_heatpump ModbusRegister 0 103&lt;br /&gt;
attr dim_status_heatpump IODev HeatPumpServer&lt;br /&gt;
attr dim_status_heatpump event-on-change-reading .*&lt;br /&gt;
attr dim_status_heatpump plcDataType INT&lt;br /&gt;
attr dim_status_heatpump registerType Holding&lt;br /&gt;
attr dim_status_heatpump room Dimplex&lt;br /&gt;
attr dim_status_heatpump updateInterval 00:00:10&lt;br /&gt;
attr dim_status_heatpump userReadings Status {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 1) ? &amp;quot;Aus&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 4) ? &amp;quot;Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Abtauen&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Durchflussüberwachnung&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Sperrmeldunge definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_block_heatpump ModbusRegister 0 104&lt;br /&gt;
attr dim_block_heatpump IODev HeatPumpServer&lt;br /&gt;
attr dim_block_heatpump event-on-change-reading .*&lt;br /&gt;
attr dim_block_heatpump plcDataType INT&lt;br /&gt;
attr dim_block_heatpump registerType Holding&lt;br /&gt;
attr dim_block_heatpump room Dimplex&lt;br /&gt;
attr dim_block_heatpump updateInterval 00:00:10&lt;br /&gt;
attr dim_block_heatpump userReadings Sperre {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 7) ? &amp;quot;Systemkontrolle&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 9) ? &amp;quot;Pumpenvorlauf&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Mindeststandzeit&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Netzbelastung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 12) ? &amp;quot;Schaltspielsperre&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;EVU&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Störmeldungen definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_fault_heatpump ModbusRegister 0 105&lt;br /&gt;
attr dim_fault_heatpump IODev HeatPumpServer&lt;br /&gt;
attr dim_fault_heatpump event-on-change-reading .*&lt;br /&gt;
attr dim_fault_heatpump plcDataType INT&lt;br /&gt;
attr dim_fault_heatpump registerType Holding&lt;br /&gt;
attr dim_fault_heatpump room Dimplex&lt;br /&gt;
attr dim_fault_heatpump updateInterval 00:01:00&lt;br /&gt;
attr dim_fault_heatpump userReadings Störung {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 6) ? &amp;quot;Elektronisches Ex.Ventil&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;Sensorik&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 19) ? &amp;quot;!Primärkreis&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 22) ? &amp;quot;!Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 23) ? &amp;quot;!Last Verdichter&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 24) ? &amp;quot;!Codierung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 25) ? &amp;quot;!Niederdruck&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 26) ? &amp;quot;!Frostschutz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 29) ? &amp;quot;!Temperatur Differenz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 31) ? &amp;quot;!Durchfluss&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Anzeige der Meldungen ====&lt;br /&gt;
readingsHistory definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define rh_dim_status_heatpump readingsHistory dim_status_heatpump:Status dim_block_heatpump:Sperre dim_fault_heatpump:Störung&lt;br /&gt;
attr rh_dim_status_heatpump alias Status&lt;br /&gt;
attr rh_dim_status_heatpump mapping {&#039;dim_status_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_block_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_fault_heatpump&#039; =&amp;gt; &#039;&#039;}&lt;br /&gt;
attr rh_dim_status_heatpump nohtml 1&lt;br /&gt;
attr rh_dim_status_heatpump room Dimplex&lt;br /&gt;
attr rh_dim_status_heatpump rows 20&lt;br /&gt;
attr rh_dim_status_heatpump timestampFormat %b %a %R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plotbeispiel ==&lt;br /&gt;
=== Temperaturen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:40:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set ytics nomirror&lt;br /&gt;
set y2tics &lt;br /&gt;
set grid ytics y2tics&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Temperatur (°C)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_outdoor_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_room_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_return_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_returnset_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_dhw_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_flow_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_brine_temperature.*::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;AT&#039; ls l7 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RT&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RL&#039; ls l2 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RLS&#039; ls l3 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;WWT&#039; ls l4 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;VLT&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;SOL&#039; ls l6 lw 1 with lines&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgänge ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:45:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
set ytics (&amp;quot;An&amp;quot; -1, &amp;quot;Aus&amp;quot; -2, &amp;quot;An&amp;quot; -5, &amp;quot;Aus&amp;quot; -6, &amp;quot;An&amp;quot; -9, &amp;quot;Aus&amp;quot; -10, &amp;quot;An&amp;quot; -13, &amp;quot;Aus&amp;quot; -14)&lt;br /&gt;
set y2tics (&amp;quot;An&amp;quot; 1, &amp;quot;Aus&amp;quot; 0, &amp;quot;An&amp;quot; -3, &amp;quot;Aus&amp;quot; -4, &amp;quot;An&amp;quot; -7, &amp;quot;Aus&amp;quot; -8, &amp;quot;An&amp;quot; -11, &amp;quot;Aus&amp;quot; -12)&lt;br /&gt;
set grid&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Digital&amp;quot;&lt;br /&gt;
set yrange [-16:2]&lt;br /&gt;
set y2range [-16:2]&lt;br /&gt;
&lt;br /&gt;
#FileLog 3:dim_compressor_output.*::$fld[2]=~&amp;quot;on&amp;quot;?1:0&lt;br /&gt;
#FileLog 3:dim_ventilator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-1:-2&lt;br /&gt;
#FileLog 3:dim_2heatgenerator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-3:-4&lt;br /&gt;
#FileLog 3:dim_circulationpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-5:-6&lt;br /&gt;
#FileLog 3:dim_dhwpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-7:-8&lt;br /&gt;
#FileLog 3:dim_auxiliarypump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-9:-10&lt;br /&gt;
#FileLog 3:dim_solarpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-11:-12&lt;br /&gt;
#FileLog 3:dim_flangeheater_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-13:-14&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Vd&#039; ls l7 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Ve&#039; ls l6 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;2.We&#039; ls l5 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Hub&#039; ls l4 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Wup&#039; ls l3 lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Zup&#039; ls l0 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Sol&#039; ls l2 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Flh&#039; ls l7 lw 1.5 with steps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:dimplex_hp_graph.jpg|thumb|right|Plotbeispiel]]&lt;br /&gt;
Im nebenstehenden Plotbeispiel werde die Temperaturen (Analogwerte) sowie die Ausgänge (Digitalwerte) dargestellt. Im einzelnen sind die Kurven für die&lt;br /&gt;
&lt;br /&gt;
* Aussen- (AT)&lt;br /&gt;
* Raum- (RT)&lt;br /&gt;
* Rücklauf- (RL)&lt;br /&gt;
* Rücklaufsoll- (RLS)&lt;br /&gt;
* Warmwasser- (WWT) und &lt;br /&gt;
* Vorlauftemperatur (VLT) &lt;br /&gt;
&lt;br /&gt;
sowie die Ausgänge für&lt;br /&gt;
&lt;br /&gt;
* Verdichter 1 (Vd)&lt;br /&gt;
* Ventilator (Ve)&lt;br /&gt;
* 2.Wärmeerzeuger (2We)&lt;br /&gt;
* Heizungsumwälzpumpe (Hup)&lt;br /&gt;
* Warmwasserumwälzpumpe (Wup) und&lt;br /&gt;
* Zusatzumwälzpumpe (Zup)&lt;br /&gt;
&lt;br /&gt;
enthalten.&lt;br /&gt;
&lt;br /&gt;
= Kontakt =&lt;br /&gt;
Weitere Fragen, Wünsche und Anregungen bitte im entsprechenden {{Link2Forum|Topic=33086|LinkText=Forenthread zum Wiki-Artikel &amp;quot;Dimplex Wärmepumpenmanager&amp;quot;}} zur Diskussion stellen.&lt;br /&gt;
&lt;br /&gt;
Offene Punkte:&lt;br /&gt;
- Darstellung der Werte in einer readingsGroup&lt;br /&gt;
- Zugriff auf Zeitfunktionen mit Lesen und Schreiben&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40082</id>
		<title>Dimplex Wärmepumpenmanager</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40082"/>
		<updated>2025-03-30T16:32:30Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- bitte noch die Abkürzung &amp;quot;NWPM&amp;quot; erklären (Benutzer:Ph1959de, 2015/02/02) --&amp;gt;&lt;br /&gt;
Mit der NWPM-Erweiterung ist es möglich, den Dimplex Wärmepumpenmanager in ein Hausnetzwerk einzubinden. Durch die Einbindung der NWPM-Erweiterung ist es ebenfalls möglich, die zur Verfügung gestellten Werte vom Wärmepumpenmanager mittels ModbusTCP in FHEM zu übernehmen, anzuzeigen und grafisch darzustellen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzung ==&lt;br /&gt;
Die Anbindung des Dimplex Wärmepumpenmanager an FHEM erfolgt mittels NWPM-Erweiterung und der aktuellen FHEM Installation. Weiterhin werden die zur Verfügung stehenden Module:&lt;br /&gt;
&lt;br /&gt;
* 36_ModbusTCPServer.pm &lt;br /&gt;
* 37_ModbusCoil.pm&lt;br /&gt;
* 37_ModbusRegister.pm&lt;br /&gt;
&lt;br /&gt;
genutzt. Getestet wurde der Zugriff auf einem BeagleBone Black mit der [[BeagleBone Black|hier beschriebenen]] Debian Installation.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Die oben aufgeführten Module sind notwendig und müssen nachinstalliert werden. Zum Zeitpunkt der Erstellung dieser Dokumentation (31.1.2015) sind diese noch nicht offiziell in FHEM enthalten und werden auch nicht mittels Update verteilt. Die Module werden mit dem Befehl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update all https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mb/controls_modbus.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
über die FHEM Befehlszeile installiert und anschließend&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reload 36_ModbusTCPServer.pm &lt;br /&gt;
reload 37_ModbusCoil.pm&lt;br /&gt;
reload 37_ModbusRegister.pm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
mit einem Reload geladen.&lt;br /&gt;
== Benutzung == &lt;br /&gt;
=== Anlegen der ModbusTCPServer Verbindung ===&lt;br /&gt;
Wie im nachfolgenden angegeben muss zunächst eine ModbusTCPServer Verbindung hergestellt werden. Die angegebene IP-Adresse muss durch die IP-Adresse der Wärmepumpe ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
########################################################&lt;br /&gt;
##  ModbusTCPServer definieren&lt;br /&gt;
########################################################&lt;br /&gt;
define HeatPumpServer ModbusTCPServer 192.168.1.150&lt;br /&gt;
attr HeatPumpServer verbose 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ein erfolgreicher Verbindungsaufbau wird mit einem „ok“ im State gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
=== Modbus-Register/Coil Adressen definieren ===&lt;br /&gt;
Im nachfolgendem Beispiel wird anhand der Außentemperatur die Adressdefinition erklärt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_outdoor_temperature ModbusRegister 0 1&lt;br /&gt;
attr dim_outdoor_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_outdoor_temperature conversion 0.1:0&lt;br /&gt;
attr dim_outdoor_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_outdoor_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_outdoor_temperature plcDataType INT&lt;br /&gt;
attr dim_outdoor_temperature registerType Holding&lt;br /&gt;
attr dim_outdoor_temperature room Dimplex&lt;br /&gt;
attr dim_outdoor_temperature stateAlias temperature&lt;br /&gt;
attr dim_outdoor_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_outdoor_temperature updateInterval 00:10:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erklärung:&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Erläuterungen zur Adressdefinition&lt;br /&gt;
|-&lt;br /&gt;
! Attribut !! Erläuterungen&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 0 Device Adresse, in der Regel bei ModbusTCP immer 0&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 1 Register Adresse, wird unter www.dimplex.de/wiki → ModbusTCP → Spalten IP zur Verfügung gestellt&lt;br /&gt;
|-&lt;br /&gt;
| IODev              || Verwendeter und zuvor angelegter ModbusTCPServer&lt;br /&gt;
|-&lt;br /&gt;
| conversion         || eine gegebenenfalls notwendige Konvertierung des übermittelten Values&lt;br /&gt;
|-&lt;br /&gt;
| PlcDataType        || Ermögliche automatische Interpretation der ankommenden Daten&lt;br /&gt;
|-&lt;br /&gt;
| stateAlias         || es wird ein zusätzliches Reading erzeugt, um zum Beispiel das Statistic-Modul nutzen zu können, stateAlias ist eine echte Kopie von &amp;quot;state&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| updateInterval    || Intervall des Abfragezyklus (z.B. 00:10:00 Minuten)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Betriebsdaten ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Betriebsdaten. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_outdoor_temperature     || Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_flow_temperature        || Vorlauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_return_temperature      || Rücklauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_returnset_temperature   || Rücklaufsolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_room_temperature        || Raumtemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhw_temperature         || Warmwassertemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwset_temperature      || Warmwassersolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_brine_temperature       || Soletemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_high_pressure           || Hochdruck&lt;br /&gt;
|-&lt;br /&gt;
| dim_low_pressure           || Niederdruck&lt;br /&gt;
|}&lt;br /&gt;
Register Warmwassertemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw_temperature ModbusRegister 0 3&lt;br /&gt;
attr dim_dhw_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_dhw_temperature conversion 0.1:0&lt;br /&gt;
attr dim_dhw_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_dhw_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_dhw_temperature plcDataType INT&lt;br /&gt;
attr dim_dhw_temperature registerType Holding&lt;br /&gt;
attr dim_dhw_temperature room Dimplex&lt;br /&gt;
attr dim_dhw_temperature stateAlias temperature&lt;br /&gt;
attr dim_dhw_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_dhw_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Vorlauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flow_temperature ModbusRegister 0 5&lt;br /&gt;
attr dim_flow_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_flow_temperature conversion 0.1:0&lt;br /&gt;
attr dim_flow_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_flow_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_flow_temperature plcDataType INT&lt;br /&gt;
attr dim_flow_temperature registerType Holding&lt;br /&gt;
attr dim_flow_temperature room Dimplex&lt;br /&gt;
attr dim_flow_temperature stateAlias temperature&lt;br /&gt;
attr dim_flow_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_flow_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_return_temperature ModbusRegister 0 2&lt;br /&gt;
attr dim_return_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_return_temperature conversion 0.1:0&lt;br /&gt;
attr dim_return_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_return_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_return_temperature plcDataType INT&lt;br /&gt;
attr dim_return_temperature registerType Holding&lt;br /&gt;
attr dim_return_temperature room Dimplex&lt;br /&gt;
attr dim_return_temperature stateAlias temperature&lt;br /&gt;
attr dim_return_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_return_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklaufsolltemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_returnset_temperature ModbusRegister 0 53&lt;br /&gt;
attr dim_returnset_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_returnset_temperature conversion 0.1:0&lt;br /&gt;
attr dim_returnset_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_returnset_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_returnset_temperature plcDataType INT&lt;br /&gt;
attr dim_returnset_temperature registerType Holding&lt;br /&gt;
attr dim_returnset_temperature room Dimplex&lt;br /&gt;
attr dim_returnset_temperature stateAlias temperature&lt;br /&gt;
attr dim_returnset_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_returnset_temperature updateInterval 00:05:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Betriebsdaten ====&lt;br /&gt;
Anlegen eines täglichen Logfile der Betriebsdaten.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_temperature FileLog ./log/filelog_dim_temperature-%W-%d.log dim_.*._temperature:temperature:.*|dim_.*._pressure:pressure:.*&lt;br /&gt;
attr filelog_dim_temperature room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Statistiken ====&lt;br /&gt;
Folgender Code legt die Statistiken der Betriebsdaten an&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_statistics statistics dim_.*._temperature|dim_.*._pressure&lt;br /&gt;
attr dim_statistics dayChangeTime 1&lt;br /&gt;
attr dim_statistics deltaReadings temperature,pressure&lt;br /&gt;
attr dim_statistics minAvgMaxReadings temperature,pressure&lt;br /&gt;
attr dim_statistics room Dimplex&lt;br /&gt;
attr dim_statistics tendencyReadings temperature,pressure&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustände ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Zustände. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_output      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_output      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_ output      || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_output || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_output  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_output         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_output   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_output    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Coil Verdichter und passenden HourCounter für Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_output ModbusCoil 0 41&lt;br /&gt;
attr dim_compressor_output IODev HeatPumpServer&lt;br /&gt;
attr dim_compressor_output disableRegisterMapping 1&lt;br /&gt;
attr dim_compressor_output event-min-interval .*:900&lt;br /&gt;
attr dim_compressor_output event-on-change-reading .*&lt;br /&gt;
attr dim_compressor_output room Dimplex&lt;br /&gt;
attr dim_compressor_output source Coil&lt;br /&gt;
attr dim_compressor_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_compressor_output HourCounter dim_compressor_output:on dim_compressor_output:off&lt;br /&gt;
attr hourcounter_compressor_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_compressor_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Ventilator definieren und passenden HourCounter für Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_output ModbusCoil 0 43&lt;br /&gt;
attr dim_ventilator_output IODev HeatPumpServer&lt;br /&gt;
attr dim_ventilator_output disableRegisterMapping 1&lt;br /&gt;
attr dim_ventilator_output event-min-interval .*:900&lt;br /&gt;
attr dim_ventilator_output event-on-change-reading .*&lt;br /&gt;
attr dim_ventilator_output room Dimplex&lt;br /&gt;
attr dim_ventilator_output source Coil&lt;br /&gt;
attr dim_ventilator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_ventilator_output HourCounter dim_ventilator_output:on dim_ventilator_output:off&lt;br /&gt;
attr hourcounter_ventilator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_ventilator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil 2.Wärmeerzeuger definieren und passenden HourCounter für 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_output ModbusCoil 0 44&lt;br /&gt;
attr dim_2heatgenerator_output IODev HeatPumpServer&lt;br /&gt;
attr dim_2heatgenerator_output disableRegisterMapping 1&lt;br /&gt;
attr dim_2heatgenerator_output event-min-interval .*:900&lt;br /&gt;
attr dim_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
attr dim_2heatgenerator_output room Dimplex&lt;br /&gt;
attr dim_2heatgenerator_output source Coil&lt;br /&gt;
attr dim_2heatgenerator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_2heatgenerator_output HourCounter dim_2heatgenerator_output:on dim_2heatgenerator_output:off&lt;br /&gt;
attr hourcounter_2heatgenerator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Heizungsumwälzpumpe M13 definieren und passenden HourCounter für Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_output ModbusCoil 0 45&lt;br /&gt;
attr dim_circulationpump_output IODev HeatPumpServer&lt;br /&gt;
attr dim_circulationpump_output disableRegisterMapping 1&lt;br /&gt;
attr dim_circulationpump_output event-min-interval .*:900&lt;br /&gt;
attr dim_circulationpump_output event-on-change-reading .*&lt;br /&gt;
attr dim_circulationpump_output room Dimplex&lt;br /&gt;
attr dim_circulationpump_output source Coil&lt;br /&gt;
attr dim_circulationpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_circulationpump_output HourCounter dim_circulationpump_output:on dim_circulationpump_output:off&lt;br /&gt;
attr hourcounter_circulationpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_circulationpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Warmwasserpumpe M18 definieren und passenden HourCounter für Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_output ModbusCoil 0 46&lt;br /&gt;
attr dim_dhwpump_output IODev HeatPumpServer&lt;br /&gt;
attr dim_dhwpump_output disableRegisterMapping 1&lt;br /&gt;
attr dim_dhwpump_output event-min-interval .*:900&lt;br /&gt;
attr dim_dhwpump_output event-on-change-reading .*&lt;br /&gt;
attr dim_dhwpump_output room Dimplex&lt;br /&gt;
attr dim_dhwpump_output source Coil&lt;br /&gt;
attr dim_dhwpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_dhwpump_output HourCounter dim_dhwpump_output:on dim_dhwpump_output:off&lt;br /&gt;
attr hourcounter_dhwpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_dhwpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Zusatzpumpe M16 definieren und Passenden HourCounter für Zusatzpumpe M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_auxiliarypump_output ModbusCoil 0 49&lt;br /&gt;
attr dim_auxiliarypump_output IODev HeatPumpServer&lt;br /&gt;
attr dim_auxiliarypump_output disableRegisterMapping 1&lt;br /&gt;
attr dim_auxiliarypump_output event-min-interval .*:900&lt;br /&gt;
attr dim_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
attr dim_auxiliarypump_output room Dimplex&lt;br /&gt;
attr dim_auxiliarypump_output source Coil&lt;br /&gt;
attr dim_auxiliarypump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_auxiliarypump_output HourCounter dim_auxiliarypump_output:on dim_auxiliarypump_output:off&lt;br /&gt;
attr hourcounter_auxiliarypump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Flanschheizung definieren und passenden HourCounter für Flanschheizung M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_output ModbusCoil 0 50&lt;br /&gt;
attr dim_flangeheater_output IODev HeatPumpServer&lt;br /&gt;
attr dim_flangeheater_output disableRegisterMapping 1&lt;br /&gt;
attr dim_flangeheater_output event-min-interval .*:900&lt;br /&gt;
attr dim_flangeheater_output event-on-change-reading .*&lt;br /&gt;
attr dim_flangeheater_output room Dimplex&lt;br /&gt;
attr dim_flangeheater_output source Coil&lt;br /&gt;
attr dim_flangeheater_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_flangeheater_output HourCounter dim_flangeheater_output:on dim_flangeheater_output:off&lt;br /&gt;
attr hourcounter_flangeheater_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_flangeheater_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Zustände ====&lt;br /&gt;
Anlegen eines wöchentlichen Logfile der Zustände:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_output_week FileLog ./log/filelog_dim_output_week-%W.log dim_.*._output.*&lt;br /&gt;
attr filelog_dim_output_week room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Historie. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_history      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_history      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_history       || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_history || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_history  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_history         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_history   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_history    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Register Historie Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_history ModbusRegister 0 72&lt;br /&gt;
attr dim_compressor_history IODev HeatPumpServer&lt;br /&gt;
attr dim_compressor_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_compressor_history event-on-change-reading .*&lt;br /&gt;
attr dim_compressor_history plcDataType INT&lt;br /&gt;
attr dim_compressor_history registerType Holding&lt;br /&gt;
attr dim_compressor_history room Dimplex&lt;br /&gt;
attr dim_compressor_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_history ModbusRegister 0 74&lt;br /&gt;
attr dim_ventilator_history IODev HeatPumpServer&lt;br /&gt;
attr dim_ventilator_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_ventilator_history event-on-change-reading .*&lt;br /&gt;
attr dim_ventilator_history plcDataType INT&lt;br /&gt;
attr dim_ventilator_history registerType Holding&lt;br /&gt;
attr dim_ventilator_history room Dimplex&lt;br /&gt;
attr dim_ventilator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_history ModbusRegister 0 75&lt;br /&gt;
attr dim_2heatgenerator_history IODev HeatPumpServer&lt;br /&gt;
attr dim_2heatgenerator_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_2heatgenerator_history event-on-change-reading .*&lt;br /&gt;
attr dim_2heatgenerator_history plcDataType INT&lt;br /&gt;
attr dim_2heatgenerator_history registerType Holding&lt;br /&gt;
attr dim_2heatgenerator_history room Dimplex&lt;br /&gt;
attr dim_2heatgenerator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_history ModbusRegister 0 76&lt;br /&gt;
attr dim_circulationpump_history IODev HeatPumpServer&lt;br /&gt;
attr dim_circulationpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_circulationpump_history event-on-change-reading .*&lt;br /&gt;
attr dim_circulationpump_history plcDataType INT&lt;br /&gt;
attr dim_circulationpump_history registerType Holding&lt;br /&gt;
attr dim_circulationpump_history room Dimplex&lt;br /&gt;
attr dim_circulationpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_history ModbusRegister 0 77&lt;br /&gt;
attr dim_dhwpump_history IODev HeatPumpServer&lt;br /&gt;
attr dim_dhwpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_dhwpump_history event-on-change-reading .*&lt;br /&gt;
attr dim_dhwpump_history plcDataType INT&lt;br /&gt;
attr dim_dhwpump_history registerType Holding&lt;br /&gt;
attr dim_dhwpump_history room Dimplex&lt;br /&gt;
attr dim_dhwpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Flanschheizung definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_history ModbusRegister 0 78&lt;br /&gt;
attr dim_flangeheater_history IODev HeatPumpServer&lt;br /&gt;
attr dim_flangeheater_history alignUpdateInterval 00:01:00&lt;br /&gt;
attr dim_flangeheater_history event-on-change-reading .*&lt;br /&gt;
attr dim_flangeheater_history plcDataType INT&lt;br /&gt;
attr dim_flangeheater_history registerType Holding&lt;br /&gt;
attr dim_flangeheater_history room Dimplex&lt;br /&gt;
attr dim_flangeheater_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Logfile Historie ====&lt;br /&gt;
Anlegen eines monatlichen Logfile für die Historischen Daten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_history_month FileLog ./log/filelog_dim_history_month-%m.log dim_.*._history.*&lt;br /&gt;
attr filelog_dim_history_month room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Wärmemengen ====&lt;br /&gt;
Laut Definition aus dem [http://www.dimplex.de/wiki Dimplex-Wiki] werden die Wärmemengen für Heizen, Warmwasser und Schwimmbad aus 3 Register-Adressen zusammengesetzt. Im Nachfolgenden Code-Beispiel wird dies entsprechend dargestellt. Dabei wird jeweils im ersten Register ein neues userReading mit der Darstellung der Gesamtwärmemenge angelegt.&lt;br /&gt;
&lt;br /&gt;
Wärmemenge Heizen definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_heating1_thermalenergy ModbusRegister 0 5096&lt;br /&gt;
attr dim_heating1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_heating1_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_heating1_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_heating1_thermalenergy registerType Holding&lt;br /&gt;
attr dim_heating1_thermalenergy room Dimplex&lt;br /&gt;
attr dim_heating1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
attr dim_heating1_thermalenergy userReadings heatingthermalenergy {\&lt;br /&gt;
                                    ((ReadingsVal(&amp;quot;dim_heating3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                     (ReadingsVal(&amp;quot;dim_heating2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                     (ReadingsVal(&amp;quot;dim_heating1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_heating2_thermalenergy ModbusRegister 0 5097&lt;br /&gt;
attr dim_heating2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_heating2_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_heating2_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_heating2_thermalenergy registerType Holding&lt;br /&gt;
attr dim_heating2_thermalenergy room Dimplex&lt;br /&gt;
attr dim_heating2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_heating3_thermalenergy ModbusRegister 0 5098&lt;br /&gt;
attr dim_heating3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_heating3_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_heating3_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_heating3_thermalenergy registerType Holding&lt;br /&gt;
attr dim_heating3_thermalenergy room Dimplex&lt;br /&gt;
attr dim_heating3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Wärmemenge Warmwasser definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw1_thermalenergy ModbusRegister 0 5099&lt;br /&gt;
attr dim_dhw1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_dhw1_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_dhw1_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_dhw1_thermalenergy registerType Holding&lt;br /&gt;
attr dim_dhw1_thermalenergy room Dimplex&lt;br /&gt;
attr dim_dhw1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
attr dim_dhw1_thermalenergy userReadings dhwthermalenergy {\&lt;br /&gt;
                                ((ReadingsVal(&amp;quot;dim_dhw3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                 (ReadingsVal(&amp;quot;dim_dhw2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                 (ReadingsVal(&amp;quot;dim_dhw1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_dhw2_thermalenergy ModbusRegister 0 5100&lt;br /&gt;
attr dim_dhw2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_dhw2_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_dhw2_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_dhw2_thermalenergy registerType Holding&lt;br /&gt;
attr dim_dhw2_thermalenergy room Dimplex&lt;br /&gt;
attr dim_dhw2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_dhw3_thermalenergy ModbusRegister 0 5101&lt;br /&gt;
attr dim_dhw3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
attr dim_dhw3_thermalenergy event-on-change-reading .*&lt;br /&gt;
attr dim_dhw3_thermalenergy plcDataType INT&lt;br /&gt;
attr dim_dhw3_thermalenergy registerType Holding&lt;br /&gt;
attr dim_dhw3_thermalenergy room Dimplex&lt;br /&gt;
attr dim_dhw3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Umweltenergie ====&lt;br /&gt;
Als Umweltenergie wird die zugeführte Kälteenergie aus der Umwelt (Luft/Erdreich) bezeichnet. Das Auslesen dieser Werte über die Schnittstelle ist erst ab einem neueren Softwarestand möglich. Die Differenz der gesamten Wärmemenge und der Umweltenergie entspricht in etwa der Energie des Verdichters.&lt;br /&gt;
&lt;br /&gt;
Umweltenergie/entzogene Kälteenergie definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_environment1_energy ModbusRegister 0 5127&lt;br /&gt;
attr dim_environment1_energy IODev HeatPumpServer&lt;br /&gt;
attr dim_environment1_energy event-on-change-reading .*&lt;br /&gt;
attr dim_environment1_energy plcDataType INT&lt;br /&gt;
attr dim_environment1_energy registerType Holding&lt;br /&gt;
attr dim_environment1_energy room Dimplex&lt;br /&gt;
attr dim_environment1_energy updateInterval 00:15:00&lt;br /&gt;
attr dim_environment1_energy userReadings environmentenergy {\&lt;br /&gt;
                                 ((ReadingsVal(&amp;quot;dim_environment3_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                  (ReadingsVal(&amp;quot;dim_environment2_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                  (ReadingsVal(&amp;quot;dim_environment1_energy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_environment2_energy ModbusRegister 0 5128&lt;br /&gt;
attr dim_environment2_energy IODev HeatPumpServer&lt;br /&gt;
attr dim_environment2_energy event-on-change-reading .*&lt;br /&gt;
attr dim_environment2_energy plcDataType INT&lt;br /&gt;
attr dim_environment2_energy registerType Holding&lt;br /&gt;
attr dim_environment2_energy room Dimplex&lt;br /&gt;
attr dim_environment2_energy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_environment3_energy ModbusRegister 0 5129&lt;br /&gt;
attr dim_environment3_energy IODev HeatPumpServer&lt;br /&gt;
attr dim_environment3_energy event-on-change-reading .*&lt;br /&gt;
attr dim_environment3_energy plcDataType INT&lt;br /&gt;
attr dim_environment3_energy registerType Holding&lt;br /&gt;
attr dim_environment3_energy room Dimplex&lt;br /&gt;
attr dim_environment3_energy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Wärmemengen ====&lt;br /&gt;
Anlegen eines jährlichen Logfile der Wärmemengen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_thermalenergy_year FileLog ./log/filelog_dim_thermalenergy_year-%y.log dim_heating1_thermalenergy:heatingthermalenergy:.*|dim_heating1_thermalenergy:heatingthermalenergy:.*&lt;br /&gt;
attr filelog_dim_thermalenergy_year room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Meldungen ===&lt;br /&gt;
[[Bild:dimplex_rh_status_heatpump.jpg|thumb|right|Beispiel Meldungen]]&lt;br /&gt;
Eine sinnvolle Anzeige sind die Meldungen (Status, Sperre, Störung) der Wärmepumpe. Im nachfolgenden Beispiel werden die Meldungen mit dem Hilfsmodul [[readingsHistory]] dargestellt. Die Definitionen der Meldungen beziehen sich auf die im [http://www.dimplex.de/wiki Dimplex-Wiki] beschriebene L-Software. Bei abweichenden Softwareständen müssen die Register sowie die Texte angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Register Statusmeldung definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_status_heatpump ModbusRegister 0 103&lt;br /&gt;
attr dim_status_heatpump IODev HeatPumpServer&lt;br /&gt;
attr dim_status_heatpump event-on-change-reading .*&lt;br /&gt;
attr dim_status_heatpump plcDataType INT&lt;br /&gt;
attr dim_status_heatpump registerType Holding&lt;br /&gt;
attr dim_status_heatpump room Dimplex&lt;br /&gt;
attr dim_status_heatpump updateInterval 00:00:10&lt;br /&gt;
attr dim_status_heatpump userReadings Status {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 1) ? &amp;quot;Aus&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 4) ? &amp;quot;Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Abtauen&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Durchflussüberwachnung&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Sperrmeldunge definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_block_heatpump ModbusRegister 0 104&lt;br /&gt;
attr dim_block_heatpump IODev HeatPumpServer&lt;br /&gt;
attr dim_block_heatpump event-on-change-reading .*&lt;br /&gt;
attr dim_block_heatpump plcDataType INT&lt;br /&gt;
attr dim_block_heatpump registerType Holding&lt;br /&gt;
attr dim_block_heatpump room Dimplex&lt;br /&gt;
attr dim_block_heatpump updateInterval 00:00:10&lt;br /&gt;
attr dim_block_heatpump userReadings Sperre {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 7) ? &amp;quot;Systemkontrolle&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 9) ? &amp;quot;Pumpenvorlauf&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Mindeststandzeit&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Netzbelastung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 12) ? &amp;quot;Schaltspielsperre&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;EVU&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Störmeldungen definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_fault_heatpump ModbusRegister 0 105&lt;br /&gt;
attr dim_fault_heatpump IODev HeatPumpServer&lt;br /&gt;
attr dim_fault_heatpump event-on-change-reading .*&lt;br /&gt;
attr dim_fault_heatpump plcDataType INT&lt;br /&gt;
attr dim_fault_heatpump registerType Holding&lt;br /&gt;
attr dim_fault_heatpump room Dimplex&lt;br /&gt;
attr dim_fault_heatpump updateInterval 00:01:00&lt;br /&gt;
attr dim_fault_heatpump userReadings Störung {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 6) ? &amp;quot;Elektronisches Ex.Ventil&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;Sensorik&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 19) ? &amp;quot;!Primärkreis&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 22) ? &amp;quot;!Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 23) ? &amp;quot;!Last Verdichter&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 24) ? &amp;quot;!Codierung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 25) ? &amp;quot;!Niederdruck&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 26) ? &amp;quot;!Frostschutz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 29) ? &amp;quot;!Temperatur Differenz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 31) ? &amp;quot;!Durchfluss&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Anzeige der Meldungen ====&lt;br /&gt;
readingsHistory definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define rh_dim_status_heatpump readingsHistory dim_status_heatpump:Status dim_block_heatpump:Sperre dim_fault_heatpump:Störung&lt;br /&gt;
attr rh_dim_status_heatpump alias Status&lt;br /&gt;
attr rh_dim_status_heatpump mapping {&#039;dim_status_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_block_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_fault_heatpump&#039; =&amp;gt; &#039;&#039;}&lt;br /&gt;
attr rh_dim_status_heatpump nohtml 1&lt;br /&gt;
attr rh_dim_status_heatpump room Dimplex&lt;br /&gt;
attr rh_dim_status_heatpump rows 20&lt;br /&gt;
attr rh_dim_status_heatpump timestampFormat %b %a %R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plotbeispiel ==&lt;br /&gt;
=== Temperaturen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:40:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set ytics nomirror&lt;br /&gt;
set y2tics &lt;br /&gt;
set grid ytics y2tics&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Temperatur (°C)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_outdoor_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_room_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_return_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_returnset_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_dhw_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_flow_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_brine_temperature.*::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;AT&#039; ls l7 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RT&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RL&#039; ls l2 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RLS&#039; ls l3 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;WWT&#039; ls l4 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;VLT&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;SOL&#039; ls l6 lw 1 with lines&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgänge ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:45:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
set ytics (&amp;quot;An&amp;quot; -1, &amp;quot;Aus&amp;quot; -2, &amp;quot;An&amp;quot; -5, &amp;quot;Aus&amp;quot; -6, &amp;quot;An&amp;quot; -9, &amp;quot;Aus&amp;quot; -10, &amp;quot;An&amp;quot; -13, &amp;quot;Aus&amp;quot; -14)&lt;br /&gt;
set y2tics (&amp;quot;An&amp;quot; 1, &amp;quot;Aus&amp;quot; 0, &amp;quot;An&amp;quot; -3, &amp;quot;Aus&amp;quot; -4, &amp;quot;An&amp;quot; -7, &amp;quot;Aus&amp;quot; -8, &amp;quot;An&amp;quot; -11, &amp;quot;Aus&amp;quot; -12)&lt;br /&gt;
set grid&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Digital&amp;quot;&lt;br /&gt;
set yrange [-16:2]&lt;br /&gt;
set y2range [-16:2]&lt;br /&gt;
&lt;br /&gt;
#FileLog 3:dim_compressor_output.*::$fld[2]=~&amp;quot;on&amp;quot;?1:0&lt;br /&gt;
#FileLog 3:dim_ventilator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-1:-2&lt;br /&gt;
#FileLog 3:dim_2heatgenerator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-3:-4&lt;br /&gt;
#FileLog 3:dim_circulationpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-5:-6&lt;br /&gt;
#FileLog 3:dim_dhwpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-7:-8&lt;br /&gt;
#FileLog 3:dim_auxiliarypump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-9:-10&lt;br /&gt;
#FileLog 3:dim_solarpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-11:-12&lt;br /&gt;
#FileLog 3:dim_flangeheater_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-13:-14&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Vd&#039; ls l7 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Ve&#039; ls l6 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;2.We&#039; ls l5 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Hub&#039; ls l4 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Wup&#039; ls l3 lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Zup&#039; ls l0 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Sol&#039; ls l2 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Flh&#039; ls l7 lw 1.5 with steps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:dimplex_hp_graph.jpg|thumb|right|Plotbeispiel]]&lt;br /&gt;
Im nebenstehenden Plotbeispiel werde die Temperaturen (Analogwerte) sowie die Ausgänge (Digitalwerte) dargestellt. Im einzelnen sind die Kurven für die&lt;br /&gt;
&lt;br /&gt;
* Aussen- (AT)&lt;br /&gt;
* Raum- (RT)&lt;br /&gt;
* Rücklauf- (RL)&lt;br /&gt;
* Rücklaufsoll- (RLS)&lt;br /&gt;
* Warmwasser- (WWT) und &lt;br /&gt;
* Vorlauftemperatur (VLT) &lt;br /&gt;
&lt;br /&gt;
sowie die Ausgänge für&lt;br /&gt;
&lt;br /&gt;
* Verdichter 1 (Vd)&lt;br /&gt;
* Ventilator (Ve)&lt;br /&gt;
* 2.Wärmeerzeuger (2We)&lt;br /&gt;
* Heizungsumwälzpumpe (Hup)&lt;br /&gt;
* Warmwasserumwälzpumpe (Wup) und&lt;br /&gt;
* Zusatzumwälzpumpe (Zup)&lt;br /&gt;
&lt;br /&gt;
enthalten.&lt;br /&gt;
&lt;br /&gt;
= Kontakt =&lt;br /&gt;
Weitere Fragen, Wünsche und Anregungen bitte im entsprechenden {{Link2Forum|Topic=33086|LinkText=Forenthread zum Wiki-Artikel &amp;quot;Dimplex Wärmepumpenmanager&amp;quot;}} zur Diskussion stellen.&lt;br /&gt;
&lt;br /&gt;
Offene Punkte:&lt;br /&gt;
- Darstellung der Werte in einer readingsGroup&lt;br /&gt;
- Zugriff auf Zeitfunktionen mit Lesen und Schreiben&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40081</id>
		<title>Dimplex Wärmepumpenmanager</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40081"/>
		<updated>2025-03-30T16:23:47Z</updated>

		<summary type="html">&lt;p&gt;TomLee: ?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- bitte noch die Abkürzung &amp;quot;NWPM&amp;quot; erklären (Benutzer:Ph1959de, 2015/02/02) --&amp;gt;&lt;br /&gt;
Mit der NWPM-Erweiterung ist es möglich, den Dimplex Wärmepumpenmanager in ein Hausnetzwerk einzubinden. Durch die Einbindung der NWPM-Erweiterung ist es ebenfalls möglich, die zur Verfügung gestellten Werte vom Wärmepumpenmanager mittels ModbusTCP in FHEM zu übernehmen, anzuzeigen und grafisch darzustellen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzung ==&lt;br /&gt;
Die Anbindung des Dimplex Wärmepumpenmanager an FHEM erfolgt mittels NWPM-Erweiterung und der aktuellen FHEM Installation. Weiterhin werden die zur Verfügung stehenden Module:&lt;br /&gt;
&lt;br /&gt;
* 36_ModbusTCPServer.pm &lt;br /&gt;
* 37_ModbusCoil.pm&lt;br /&gt;
* 37_ModbusRegister.pm&lt;br /&gt;
&lt;br /&gt;
genutzt. Getestet wurde der Zugriff auf einem BeagleBone Black mit der [[BeagleBone Black|hier beschriebenen]] Debian Installation.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Die oben aufgeführten Module sind notwendig und müssen nachinstalliert werden. Zum Zeitpunkt der Erstellung dieser Dokumentation (31.1.2015) sind diese noch nicht offiziell in FHEM enthalten und werden auch nicht mittels Update verteilt. Die Module werden mit dem Befehl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update all https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mb/controls_modbus.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
über die FHEM Befehlszeile installiert und anschließend&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reload 36_ModbusTCPServer.pm &lt;br /&gt;
reload 37_ModbusCoil.pm&lt;br /&gt;
reload 37_ModbusRegister.pm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
mit einem Reload geladen.&lt;br /&gt;
== Benutzung == &lt;br /&gt;
=== Anlegen der ModbusTCPServer Verbindung ===&lt;br /&gt;
Wie im nachfolgenden angegeben muss zunächst eine ModbusTCPServer Verbindung hergestellt werden. Die angegebene IP-Adresse muss durch die IP-Adresse der Wärmepumpe ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
########################################################&lt;br /&gt;
##  ModbusTCPServer definieren&lt;br /&gt;
########################################################&lt;br /&gt;
define HeatPumpServer ModbusTCPServer 192.168.1.150&lt;br /&gt;
attr HeatPumpServer verbose 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ein erfolgreicher Verbindungsaufbau wird mit einem „ok“ im State gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
=== Modbus-Register/Coil Adressen definieren ===&lt;br /&gt;
Im nachfolgendem Beispiel wird anhand der Außentemperatur die Adressdefinition erklärt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_outdoor_temperature ModbusRegister 0 1&lt;br /&gt;
attr dim_outdoor_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_outdoor_temperature conversion 0.1:0&lt;br /&gt;
attr dim_outdoor_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_outdoor_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_outdoor_temperature plcDataType INT&lt;br /&gt;
attr dim_outdoor_temperature registerType Holding&lt;br /&gt;
attr dim_outdoor_temperature room Dimplex&lt;br /&gt;
attr dim_outdoor_temperature stateAlias temperature&lt;br /&gt;
attr dim_outdoor_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_outdoor_temperature updateInterval 00:10:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erklärung:&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Erläuterungen zur Adressdefinition&lt;br /&gt;
|-&lt;br /&gt;
! Attribut !! Erläuterungen&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 0 Device Adresse, in der Regel bei ModbusTCP immer 0&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 1 Register Adresse, wird unter www.dimplex.de/wiki → ModbusTCP → Spalten IP zur Verfügung gestellt&lt;br /&gt;
|-&lt;br /&gt;
| IODev              || Verwendeter und zuvor angelegter ModbusTCPServer&lt;br /&gt;
|-&lt;br /&gt;
| conversion         || eine gegebenenfalls notwendige Konvertierung des übermittelten Values&lt;br /&gt;
|-&lt;br /&gt;
| PlcDataType        || Ermögliche automatische Interpretation der ankommenden Daten&lt;br /&gt;
|-&lt;br /&gt;
| stateAlias         || es wird ein zusätzliches Reading erzeugt, um zum Beispiel das Statistic-Modul nutzen zu können, stateAlias ist eine echte Kopie von &amp;quot;state&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| updateInterval    || Intervall des Abfragezyklus (z.B. 00:10:00 Minuten)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Betriebsdaten ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Betriebsdaten. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_outdoor_temperature     || Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_flow_temperature        || Vorlauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_return_temperature      || Rücklauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_returnset_temperature   || Rücklaufsolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_room_temperature        || Raumtemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhw_temperature         || Warmwassertemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwset_temperature      || Warmwassersolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_brine_temperature       || Soletemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_high_pressure           || Hochdruck&lt;br /&gt;
|-&lt;br /&gt;
| dim_low_pressure           || Niederdruck&lt;br /&gt;
|}&lt;br /&gt;
Register Warmwassertemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw_temperature ModbusRegister 0 3&lt;br /&gt;
attr dim_dhw_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_dhw_temperature conversion 0.1:0&lt;br /&gt;
attr dim_dhw_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_dhw_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_dhw_temperature plcDataType INT&lt;br /&gt;
attr dim_dhw_temperature registerType Holding&lt;br /&gt;
attr dim_dhw_temperature room Dimplex&lt;br /&gt;
attr dim_dhw_temperature stateAlias temperature&lt;br /&gt;
attr dim_dhw_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_dhw_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Vorlauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flow_temperature ModbusRegister 0 5&lt;br /&gt;
attr dim_flow_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_flow_temperature conversion 0.1:0&lt;br /&gt;
attr dim_flow_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_flow_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_flow_temperature plcDataType INT&lt;br /&gt;
attr dim_flow_temperature registerType Holding&lt;br /&gt;
attr dim_flow_temperature room Dimplex&lt;br /&gt;
attr dim_flow_temperature stateAlias temperature&lt;br /&gt;
attr dim_flow_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_flow_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_return_temperature ModbusRegister 0 2&lt;br /&gt;
attr dim_return_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_return_temperature conversion 0.1:0&lt;br /&gt;
attr dim_return_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_return_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_return_temperature plcDataType INT&lt;br /&gt;
attr dim_return_temperature registerType Holding&lt;br /&gt;
attr dim_return_temperature room Dimplex&lt;br /&gt;
attr dim_return_temperature stateAlias temperature&lt;br /&gt;
attr dim_return_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_return_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklaufsolltemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_returnset_temperature ModbusRegister 0 53&lt;br /&gt;
attr dim_returnset_temperature IODev HeatPumpServer&lt;br /&gt;
attr dim_returnset_temperature conversion 0.1:0&lt;br /&gt;
attr dim_returnset_temperature event-min-interval .*:900&lt;br /&gt;
attr dim_returnset_temperature event-on-change-reading .*&lt;br /&gt;
attr dim_returnset_temperature plcDataType INT&lt;br /&gt;
attr dim_returnset_temperature registerType Holding&lt;br /&gt;
attr dim_returnset_temperature room Dimplex&lt;br /&gt;
attr dim_returnset_temperature stateAlias temperature&lt;br /&gt;
attr dim_returnset_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
attr dim_returnset_temperature updateInterval 00:05:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Betriebsdaten ====&lt;br /&gt;
Anlegen eines täglichen Logfile der Betriebsdaten.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_temperature FileLog ./log/filelog_dim_temperature-%W-%d.log dim_.*._temperature:temperature:.*|dim_.*._pressure:pressure:.*&lt;br /&gt;
attr filelog_dim_temperature room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Statistiken ====&lt;br /&gt;
Folgender Code legt die Statistiken der Betriebsdaten an&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_statistics statistics dim_.*._temperature|dim_.*._pressure&lt;br /&gt;
attr dim_statistics dayChangeTime 1&lt;br /&gt;
attr dim_statistics deltaReadings temperature,pressure&lt;br /&gt;
attr dim_statistics minAvgMaxReadings temperature,pressure&lt;br /&gt;
attr dim_statistics room Dimplex&lt;br /&gt;
attr dim_statistics tendencyReadings temperature,pressure&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustände ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Zustände. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_output      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_output      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_ output      || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_output || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_output  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_output         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_output   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_output    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Coil Verdichter und passenden HourCounter für Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_output ModbusCoil 0 41&lt;br /&gt;
attr dim_compressor_output IODev HeatPumpServer&lt;br /&gt;
attr dim_compressor_output disableRegisterMapping 1&lt;br /&gt;
attr dim_compressor_output event-min-interval .*:900&lt;br /&gt;
attr dim_compressor_output event-on-change-reading .*&lt;br /&gt;
attr dim_compressor_output room Dimplex&lt;br /&gt;
attr dim_compressor_output source Coil&lt;br /&gt;
attr dim_compressor_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_compressor_output HourCounter dim_compressor_output:on dim_compressor_output:off&lt;br /&gt;
attr hourcounter_compressor_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_compressor_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Ventilator definieren und passenden HourCounter für Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_output ModbusCoil 0 43&lt;br /&gt;
  attr dim_ventilator_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_ventilator_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_ventilator_output event-min-interval .*:900&lt;br /&gt;
  attr dim_ventilator_output event-on-change-reading .*&lt;br /&gt;
  attr dim_ventilator_output room Dimplex&lt;br /&gt;
  attr dim_ventilator_output source Coil&lt;br /&gt;
  attr dim_ventilator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_ventilator_output HourCounter dim_ventilator_output:on dim_ventilator_output:off&lt;br /&gt;
  attr hourcounter_ventilator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_ventilator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil 2.Wärmeerzeuger definieren und passenden HourCounter für 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_output ModbusCoil 0 44&lt;br /&gt;
  attr dim_2heatgenerator_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_2heatgenerator_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_2heatgenerator_output event-min-interval .*:900&lt;br /&gt;
  attr dim_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
  attr dim_2heatgenerator_output room Dimplex&lt;br /&gt;
  attr dim_2heatgenerator_output source Coil&lt;br /&gt;
  attr dim_2heatgenerator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_2heatgenerator_output HourCounter dim_2heatgenerator_output:on dim_2heatgenerator_output:off&lt;br /&gt;
  attr hourcounter_2heatgenerator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Heizungsumwälzpumpe M13 definieren und passenden HourCounter für Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_output ModbusCoil 0 45&lt;br /&gt;
  attr dim_circulationpump_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_circulationpump_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_circulationpump_output event-min-interval .*:900&lt;br /&gt;
  attr dim_circulationpump_output event-on-change-reading .*&lt;br /&gt;
  attr dim_circulationpump_output room Dimplex&lt;br /&gt;
  attr dim_circulationpump_output source Coil&lt;br /&gt;
  attr dim_circulationpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_circulationpump_output HourCounter dim_circulationpump_output:on dim_circulationpump_output:off&lt;br /&gt;
  attr hourcounter_circulationpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_circulationpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Warmwasserpumpe M18 definieren und passenden HourCounter für Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_output ModbusCoil 0 46&lt;br /&gt;
attr dim_dhwpump_output IODev HeatPumpServer&lt;br /&gt;
attr dim_dhwpump_output disableRegisterMapping 1&lt;br /&gt;
attr dim_dhwpump_output event-min-interval .*:900&lt;br /&gt;
attr dim_dhwpump_output event-on-change-reading .*&lt;br /&gt;
attr dim_dhwpump_output room Dimplex&lt;br /&gt;
attr dim_dhwpump_output source Coil&lt;br /&gt;
attr dim_dhwpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_dhwpump_output HourCounter dim_dhwpump_output:on dim_dhwpump_output:off&lt;br /&gt;
attr hourcounter_dhwpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_dhwpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Zusatzpumpe M16 definieren und Passenden HourCounter für Zusatzpumpe M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_auxiliarypump_output ModbusCoil 0 49&lt;br /&gt;
  attr dim_auxiliarypump_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_auxiliarypump_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_auxiliarypump_output event-min-interval .*:900&lt;br /&gt;
  attr dim_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
  attr dim_auxiliarypump_output room Dimplex&lt;br /&gt;
  attr dim_auxiliarypump_output source Coil&lt;br /&gt;
  attr dim_auxiliarypump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_auxiliarypump_output HourCounter dim_auxiliarypump_output:on dim_auxiliarypump_output:off&lt;br /&gt;
   attr hourcounter_auxiliarypump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
   attr hourcounter_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Flanschheizung definieren und passenden HourCounter für Flanschheizung M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_output ModbusCoil 0 50&lt;br /&gt;
  attr dim_flangeheater_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_flangeheater_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_flangeheater_output event-min-interval .*:900&lt;br /&gt;
  attr dim_flangeheater_output event-on-change-reading .*&lt;br /&gt;
  attr dim_flangeheater_output room Dimplex&lt;br /&gt;
  attr dim_flangeheater_output source Coil&lt;br /&gt;
  attr dim_flangeheater_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_flangeheater_output HourCounter dim_flangeheater_output:on dim_flangeheater_output:off&lt;br /&gt;
  attr hourcounter_flangeheater_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_flangeheater_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Zustände ====&lt;br /&gt;
Anlegen eines wöchentlichen Logfile der Zustände:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_output_week FileLog ./log/filelog_dim_output_week-%W.log dim_.*._output.*&lt;br /&gt;
  attr filelog_dim_output_week room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Historie. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_history      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_history      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_history       || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_history || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_history  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_history         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_history   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_history    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Register Historie Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_history ModbusRegister 0 72&lt;br /&gt;
  attr dim_compressor_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_compressor_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_compressor_history event-on-change-reading .*&lt;br /&gt;
  attr dim_compressor_history plcDataType INT&lt;br /&gt;
  attr dim_compressor_history registerType Holding&lt;br /&gt;
  attr dim_compressor_history room Dimplex&lt;br /&gt;
  attr dim_compressor_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_history ModbusRegister 0 74&lt;br /&gt;
  attr dim_ventilator_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_ventilator_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_ventilator_history event-on-change-reading .*&lt;br /&gt;
  attr dim_ventilator_history plcDataType INT&lt;br /&gt;
  attr dim_ventilator_history registerType Holding&lt;br /&gt;
  attr dim_ventilator_history room Dimplex&lt;br /&gt;
  attr dim_ventilator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_history ModbusRegister 0 75&lt;br /&gt;
  attr dim_2heatgenerator_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_2heatgenerator_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_2heatgenerator_history event-on-change-reading .*&lt;br /&gt;
  attr dim_2heatgenerator_history plcDataType INT&lt;br /&gt;
  attr dim_2heatgenerator_history registerType Holding&lt;br /&gt;
  attr dim_2heatgenerator_history room Dimplex&lt;br /&gt;
  attr dim_2heatgenerator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_history ModbusRegister 0 76&lt;br /&gt;
  attr dim_circulationpump_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_circulationpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_circulationpump_history event-on-change-reading .*&lt;br /&gt;
  attr dim_circulationpump_history plcDataType INT&lt;br /&gt;
  attr dim_circulationpump_history registerType Holding&lt;br /&gt;
  attr dim_circulationpump_history room Dimplex&lt;br /&gt;
  attr dim_circulationpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_history ModbusRegister 0 77&lt;br /&gt;
  attr dim_dhwpump_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhwpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_dhwpump_history event-on-change-reading .*&lt;br /&gt;
  attr dim_dhwpump_history plcDataType INT&lt;br /&gt;
  attr dim_dhwpump_history registerType Holding&lt;br /&gt;
  attr dim_dhwpump_history room Dimplex&lt;br /&gt;
  attr dim_dhwpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Flanschheizung definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_history ModbusRegister 0 78&lt;br /&gt;
  attr dim_flangeheater_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_flangeheater_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_flangeheater_history event-on-change-reading .*&lt;br /&gt;
  attr dim_flangeheater_history plcDataType INT&lt;br /&gt;
  attr dim_flangeheater_history registerType Holding&lt;br /&gt;
  attr dim_flangeheater_history room Dimplex&lt;br /&gt;
  attr dim_flangeheater_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Logfile Historie ====&lt;br /&gt;
Anlegen eines monatlichen Logfile für die Historischen Daten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_history_month FileLog ./log/filelog_dim_history_month-%m.log dim_.*._history.*&lt;br /&gt;
  attr filelog_dim_history_month room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Wärmemengen ====&lt;br /&gt;
Laut Definition aus dem [http://www.dimplex.de/wiki Dimplex-Wiki] werden die Wärmemengen für Heizen, Warmwasser und Schwimmbad aus 3 Register-Adressen zusammengesetzt. Im Nachfolgenden Code-Beispiel wird dies entsprechend dargestellt. Dabei wird jeweils im ersten Register ein neues userReading mit der Darstellung der Gesamtwärmemenge angelegt.&lt;br /&gt;
&lt;br /&gt;
Wärmemenge Heizen definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_heating1_thermalenergy ModbusRegister 0 5096&lt;br /&gt;
  attr dim_heating1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_heating1_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_heating1_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_heating1_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_heating1_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_heating1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
  attr dim_heating1_thermalenergy userReadings heatingthermalenergy {\&lt;br /&gt;
                                    ((ReadingsVal(&amp;quot;dim_heating3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                     (ReadingsVal(&amp;quot;dim_heating2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                     (ReadingsVal(&amp;quot;dim_heating1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_heating2_thermalenergy ModbusRegister 0 5097&lt;br /&gt;
  attr dim_heating2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_heating2_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_heating2_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_heating2_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_heating2_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_heating2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_heating3_thermalenergy ModbusRegister 0 5098&lt;br /&gt;
  attr dim_heating3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_heating3_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_heating3_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_heating3_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_heating3_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_heating3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Wärmemenge Warmwasser definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw1_thermalenergy ModbusRegister 0 5099&lt;br /&gt;
  attr dim_dhw1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw1_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw1_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_dhw1_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_dhw1_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_dhw1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
  attr dim_dhw1_thermalenergy userReadings dhwthermalenergy {\&lt;br /&gt;
                                ((ReadingsVal(&amp;quot;dim_dhw3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                 (ReadingsVal(&amp;quot;dim_dhw2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                 (ReadingsVal(&amp;quot;dim_dhw1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_dhw2_thermalenergy ModbusRegister 0 5100&lt;br /&gt;
  attr dim_dhw2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw2_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw2_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_dhw2_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_dhw2_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_dhw2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_dhw3_thermalenergy ModbusRegister 0 5101&lt;br /&gt;
  attr dim_dhw3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw3_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw3_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_dhw3_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_dhw3_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_dhw3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Umweltenergie ====&lt;br /&gt;
Als Umweltenergie wird die zugeführte Kälteenergie aus der Umwelt (Luft/Erdreich) bezeichnet. Das Auslesen dieser Werte über die Schnittstelle ist erst ab einem neueren Softwarestand möglich. Die Differenz der gesamten Wärmemenge und der Umweltenergie entspricht in etwa der Energie des Verdichters.&lt;br /&gt;
&lt;br /&gt;
Umweltenergie/entzogene Kälteenergie definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_environment1_energy ModbusRegister 0 5127&lt;br /&gt;
  attr dim_environment1_energy IODev HeatPumpServer&lt;br /&gt;
  attr dim_environment1_energy event-on-change-reading .*&lt;br /&gt;
  attr dim_environment1_energy plcDataType INT&lt;br /&gt;
  attr dim_environment1_energy registerType Holding&lt;br /&gt;
  attr dim_environment1_energy room Dimplex&lt;br /&gt;
  attr dim_environment1_energy updateInterval 00:15:00&lt;br /&gt;
  attr dim_environment1_energy userReadings environmentenergy {\&lt;br /&gt;
                                 ((ReadingsVal(&amp;quot;dim_environment3_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                  (ReadingsVal(&amp;quot;dim_environment2_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                  (ReadingsVal(&amp;quot;dim_environment1_energy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_environment2_energy ModbusRegister 0 5128&lt;br /&gt;
  attr dim_environment2_energy IODev HeatPumpServer&lt;br /&gt;
  attr dim_environment2_energy event-on-change-reading .*&lt;br /&gt;
  attr dim_environment2_energy plcDataType INT&lt;br /&gt;
  attr dim_environment2_energy registerType Holding&lt;br /&gt;
  attr dim_environment2_energy room Dimplex&lt;br /&gt;
  attr dim_environment2_energy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_environment3_energy ModbusRegister 0 5129&lt;br /&gt;
  attr dim_environment3_energy IODev HeatPumpServer&lt;br /&gt;
  attr dim_environment3_energy event-on-change-reading .*&lt;br /&gt;
  attr dim_environment3_energy plcDataType INT&lt;br /&gt;
  attr dim_environment3_energy registerType Holding&lt;br /&gt;
  attr dim_environment3_energy room Dimplex&lt;br /&gt;
  attr dim_environment3_energy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Wärmemengen ====&lt;br /&gt;
Anlegen eines jährlichen Logfile der Wärmemengen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_thermalenergy_year FileLog ./log/filelog_dim_thermalenergy_year-%y.log dim_heating1_thermalenergy:heatingthermalenergy:.*|dim_heating1_thermalenergy:heatingthermalenergy:.*&lt;br /&gt;
attr filelog_dim_thermalenergy_year room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Meldungen ===&lt;br /&gt;
[[Bild:dimplex_rh_status_heatpump.jpg|thumb|right|Beispiel Meldungen]]&lt;br /&gt;
Eine sinnvolle Anzeige sind die Meldungen (Status, Sperre, Störung) der Wärmepumpe. Im nachfolgenden Beispiel werden die Meldungen mit dem Hilfsmodul [[readingsHistory]] dargestellt. Die Definitionen der Meldungen beziehen sich auf die im [http://www.dimplex.de/wiki Dimplex-Wiki] beschriebene L-Software. Bei abweichenden Softwareständen müssen die Register sowie die Texte angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Register Statusmeldung definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_status_heatpump ModbusRegister 0 103&lt;br /&gt;
  attr dim_status_heatpump IODev HeatPumpServer&lt;br /&gt;
  attr dim_status_heatpump event-on-change-reading .*&lt;br /&gt;
  attr dim_status_heatpump plcDataType INT&lt;br /&gt;
  attr dim_status_heatpump registerType Holding&lt;br /&gt;
  attr dim_status_heatpump room Dimplex&lt;br /&gt;
  attr dim_status_heatpump updateInterval 00:00:10&lt;br /&gt;
  attr dim_status_heatpump userReadings Status {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 1) ? &amp;quot;Aus&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 4) ? &amp;quot;Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Abtauen&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Durchflussüberwachnung&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Sperrmeldunge definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_block_heatpump ModbusRegister 0 104&lt;br /&gt;
  attr dim_block_heatpump IODev HeatPumpServer&lt;br /&gt;
  attr dim_block_heatpump event-on-change-reading .*&lt;br /&gt;
  attr dim_block_heatpump plcDataType INT&lt;br /&gt;
  attr dim_block_heatpump registerType Holding&lt;br /&gt;
  attr dim_block_heatpump room Dimplex&lt;br /&gt;
  attr dim_block_heatpump updateInterval 00:00:10&lt;br /&gt;
  attr dim_block_heatpump userReadings Sperre {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 7) ? &amp;quot;Systemkontrolle&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 9) ? &amp;quot;Pumpenvorlauf&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Mindeststandzeit&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Netzbelastung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 12) ? &amp;quot;Schaltspielsperre&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;EVU&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Störmeldungen definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_fault_heatpump ModbusRegister 0 105&lt;br /&gt;
  attr dim_fault_heatpump IODev HeatPumpServer&lt;br /&gt;
  attr dim_fault_heatpump event-on-change-reading .*&lt;br /&gt;
  attr dim_fault_heatpump plcDataType INT&lt;br /&gt;
  attr dim_fault_heatpump registerType Holding&lt;br /&gt;
  attr dim_fault_heatpump room Dimplex&lt;br /&gt;
  attr dim_fault_heatpump updateInterval 00:01:00&lt;br /&gt;
  attr dim_fault_heatpump userReadings Störung {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 6) ? &amp;quot;Elektronisches Ex.Ventil&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;Sensorik&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 19) ? &amp;quot;!Primärkreis&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 22) ? &amp;quot;!Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 23) ? &amp;quot;!Last Verdichter&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 24) ? &amp;quot;!Codierung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 25) ? &amp;quot;!Niederdruck&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 26) ? &amp;quot;!Frostschutz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 29) ? &amp;quot;!Temperatur Differenz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 31) ? &amp;quot;!Durchfluss&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Anzeige der Meldungen ====&lt;br /&gt;
readingsHistory definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define rh_dim_status_heatpump readingsHistory dim_status_heatpump:Status dim_block_heatpump:Sperre dim_fault_heatpump:Störung&lt;br /&gt;
  attr rh_dim_status_heatpump alias Status&lt;br /&gt;
  attr rh_dim_status_heatpump mapping {&#039;dim_status_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_block_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_fault_heatpump&#039; =&amp;gt; &#039;&#039;}&lt;br /&gt;
  attr rh_dim_status_heatpump nohtml 1&lt;br /&gt;
  attr rh_dim_status_heatpump room Dimplex&lt;br /&gt;
  attr rh_dim_status_heatpump rows 20&lt;br /&gt;
  attr rh_dim_status_heatpump timestampFormat %b %a %R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plotbeispiel ==&lt;br /&gt;
=== Temperaturen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:40:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set ytics nomirror&lt;br /&gt;
set y2tics &lt;br /&gt;
set grid ytics y2tics&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Temperatur (°C)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_outdoor_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_room_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_return_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_returnset_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_dhw_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_flow_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_brine_temperature.*::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;AT&#039; ls l7 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RT&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RL&#039; ls l2 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RLS&#039; ls l3 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;WWT&#039; ls l4 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;VLT&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;SOL&#039; ls l6 lw 1 with lines&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgänge ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:45:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
set ytics (&amp;quot;An&amp;quot; -1, &amp;quot;Aus&amp;quot; -2, &amp;quot;An&amp;quot; -5, &amp;quot;Aus&amp;quot; -6, &amp;quot;An&amp;quot; -9, &amp;quot;Aus&amp;quot; -10, &amp;quot;An&amp;quot; -13, &amp;quot;Aus&amp;quot; -14)&lt;br /&gt;
set y2tics (&amp;quot;An&amp;quot; 1, &amp;quot;Aus&amp;quot; 0, &amp;quot;An&amp;quot; -3, &amp;quot;Aus&amp;quot; -4, &amp;quot;An&amp;quot; -7, &amp;quot;Aus&amp;quot; -8, &amp;quot;An&amp;quot; -11, &amp;quot;Aus&amp;quot; -12)&lt;br /&gt;
set grid&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Digital&amp;quot;&lt;br /&gt;
set yrange [-16:2]&lt;br /&gt;
set y2range [-16:2]&lt;br /&gt;
&lt;br /&gt;
#FileLog 3:dim_compressor_output.*::$fld[2]=~&amp;quot;on&amp;quot;?1:0&lt;br /&gt;
#FileLog 3:dim_ventilator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-1:-2&lt;br /&gt;
#FileLog 3:dim_2heatgenerator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-3:-4&lt;br /&gt;
#FileLog 3:dim_circulationpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-5:-6&lt;br /&gt;
#FileLog 3:dim_dhwpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-7:-8&lt;br /&gt;
#FileLog 3:dim_auxiliarypump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-9:-10&lt;br /&gt;
#FileLog 3:dim_solarpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-11:-12&lt;br /&gt;
#FileLog 3:dim_flangeheater_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-13:-14&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Vd&#039; ls l7 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Ve&#039; ls l6 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;2.We&#039; ls l5 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Hub&#039; ls l4 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Wup&#039; ls l3 lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Zup&#039; ls l0 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Sol&#039; ls l2 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Flh&#039; ls l7 lw 1.5 with steps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:dimplex_hp_graph.jpg|thumb|right|Plotbeispiel]]&lt;br /&gt;
Im nebenstehenden Plotbeispiel werde die Temperaturen (Analogwerte) sowie die Ausgänge (Digitalwerte) dargestellt. Im einzelnen sind die Kurven für die&lt;br /&gt;
&lt;br /&gt;
* Aussen- (AT)&lt;br /&gt;
* Raum- (RT)&lt;br /&gt;
* Rücklauf- (RL)&lt;br /&gt;
* Rücklaufsoll- (RLS)&lt;br /&gt;
* Warmwasser- (WWT) und &lt;br /&gt;
* Vorlauftemperatur (VLT) &lt;br /&gt;
&lt;br /&gt;
sowie die Ausgänge für&lt;br /&gt;
&lt;br /&gt;
* Verdichter 1 (Vd)&lt;br /&gt;
* Ventilator (Ve)&lt;br /&gt;
* 2.Wärmeerzeuger (2We)&lt;br /&gt;
* Heizungsumwälzpumpe (Hup)&lt;br /&gt;
* Warmwasserumwälzpumpe (Wup) und&lt;br /&gt;
* Zusatzumwälzpumpe (Zup)&lt;br /&gt;
&lt;br /&gt;
enthalten.&lt;br /&gt;
&lt;br /&gt;
= Kontakt =&lt;br /&gt;
Weitere Fragen, Wünsche und Anregungen bitte im entsprechenden {{Link2Forum|Topic=33086|LinkText=Forenthread zum Wiki-Artikel &amp;quot;Dimplex Wärmepumpenmanager&amp;quot;}} zur Diskussion stellen.&lt;br /&gt;
&lt;br /&gt;
Offene Punkte:&lt;br /&gt;
- Darstellung der Werte in einer readingsGroup&lt;br /&gt;
- Zugriff auf Zeitfunktionen mit Lesen und Schreiben&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40080</id>
		<title>Dimplex Wärmepumpenmanager</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40080"/>
		<updated>2025-03-30T16:16:04Z</updated>

		<summary type="html">&lt;p&gt;TomLee: Spurensuche weshalb der Abstand entsteht&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- bitte noch die Abkürzung &amp;quot;NWPM&amp;quot; erklären (Benutzer:Ph1959de, 2015/02/02) --&amp;gt;&lt;br /&gt;
Mit der NWPM-Erweiterung ist es möglich, den Dimplex Wärmepumpenmanager in ein Hausnetzwerk einzubinden. Durch die Einbindung der NWPM-Erweiterung ist es ebenfalls möglich, die zur Verfügung gestellten Werte vom Wärmepumpenmanager mittels ModbusTCP in FHEM zu übernehmen, anzuzeigen und grafisch darzustellen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzung ==&lt;br /&gt;
Die Anbindung des Dimplex Wärmepumpenmanager an FHEM erfolgt mittels NWPM-Erweiterung und der aktuellen FHEM Installation. Weiterhin werden die zur Verfügung stehenden Module:&lt;br /&gt;
&lt;br /&gt;
* 36_ModbusTCPServer.pm &lt;br /&gt;
* 37_ModbusCoil.pm&lt;br /&gt;
* 37_ModbusRegister.pm&lt;br /&gt;
&lt;br /&gt;
genutzt. Getestet wurde der Zugriff auf einem BeagleBone Black mit der [[BeagleBone Black|hier beschriebenen]] Debian Installation.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Die oben aufgeführten Module sind notwendig und müssen nachinstalliert werden. Zum Zeitpunkt der Erstellung dieser Dokumentation (31.1.2015) sind diese noch nicht offiziell in FHEM enthalten und werden auch nicht mittels Update verteilt. Die Module werden mit dem Befehl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update all https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mb/controls_modbus.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
über die FHEM Befehlszeile installiert und anschließend&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reload 36_ModbusTCPServer.pm &lt;br /&gt;
reload 37_ModbusCoil.pm&lt;br /&gt;
reload 37_ModbusRegister.pm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
mit einem Reload geladen.&lt;br /&gt;
== Benutzung == &lt;br /&gt;
=== Anlegen der ModbusTCPServer Verbindung ===&lt;br /&gt;
Wie im nachfolgenden angegeben muss zunächst eine ModbusTCPServer Verbindung hergestellt werden. Die angegebene IP-Adresse muss durch die IP-Adresse der Wärmepumpe ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
########################################################&lt;br /&gt;
##  ModbusTCPServer definieren&lt;br /&gt;
########################################################&lt;br /&gt;
define HeatPumpServer ModbusTCPServer 192.168.1.150&lt;br /&gt;
attr HeatPumpServer verbose 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ein erfolgreicher Verbindungsaufbau wird mit einem „ok“ im State gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
=== Modbus-Register/Coil Adressen definieren ===&lt;br /&gt;
Im nachfolgendem Beispiel wird anhand der Außentemperatur die Adressdefinition erklärt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_outdoor_temperature ModbusRegister 0 1&lt;br /&gt;
  attr dim_outdoor_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_outdoor_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_outdoor_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_outdoor_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_outdoor_temperature plcDataType INT&lt;br /&gt;
  attr dim_outdoor_temperature registerType Holding&lt;br /&gt;
  attr dim_outdoor_temperature room Dimplex&lt;br /&gt;
  attr dim_outdoor_temperature stateAlias temperature&lt;br /&gt;
  attr dim_outdoor_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_outdoor_temperature updateInterval 00:10:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erklärung:&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Erläuterungen zur Adressdefinition&lt;br /&gt;
|-&lt;br /&gt;
! Attribut !! Erläuterungen&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 0 Device Adresse, in der Regel bei ModbusTCP immer 0&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 1 Register Adresse, wird unter www.dimplex.de/wiki → ModbusTCP → Spalten IP zur Verfügung gestellt&lt;br /&gt;
|-&lt;br /&gt;
| IODev              || Verwendeter und zuvor angelegter ModbusTCPServer&lt;br /&gt;
|-&lt;br /&gt;
| conversion         || eine gegebenenfalls notwendige Konvertierung des übermittelten Values&lt;br /&gt;
|-&lt;br /&gt;
| PlcDataType        || Ermögliche automatische Interpretation der ankommenden Daten&lt;br /&gt;
|-&lt;br /&gt;
| stateAlias         || es wird ein zusätzliches Reading erzeugt, um zum Beispiel das Statistic-Modul nutzen zu können, stateAlias ist eine echte Kopie von &amp;quot;state&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| updateInterval    || Intervall des Abfragezyklus (z.B. 00:10:00 Minuten)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Betriebsdaten ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Betriebsdaten. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_outdoor_temperature     || Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_flow_temperature        || Vorlauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_return_temperature      || Rücklauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_returnset_temperature   || Rücklaufsolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_room_temperature        || Raumtemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhw_temperature         || Warmwassertemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwset_temperature      || Warmwassersolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_brine_temperature       || Soletemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_high_pressure           || Hochdruck&lt;br /&gt;
|-&lt;br /&gt;
| dim_low_pressure           || Niederdruck&lt;br /&gt;
|}&lt;br /&gt;
Register Warmwassertemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw_temperature ModbusRegister 0 3&lt;br /&gt;
  attr dim_dhw_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_dhw_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_dhw_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw_temperature plcDataType INT&lt;br /&gt;
  attr dim_dhw_temperature registerType Holding&lt;br /&gt;
  attr dim_dhw_temperature room Dimplex&lt;br /&gt;
  attr dim_dhw_temperature stateAlias temperature&lt;br /&gt;
  attr dim_dhw_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_dhw_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Vorlauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flow_temperature ModbusRegister 0 5&lt;br /&gt;
  attr dim_flow_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_flow_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_flow_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_flow_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_flow_temperature plcDataType INT&lt;br /&gt;
  attr dim_flow_temperature registerType Holding&lt;br /&gt;
  attr dim_flow_temperature room Dimplex&lt;br /&gt;
  attr dim_flow_temperature stateAlias temperature&lt;br /&gt;
  attr dim_flow_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_flow_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_return_temperature ModbusRegister 0 2&lt;br /&gt;
  attr dim_return_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_return_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_return_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_return_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_return_temperature plcDataType INT&lt;br /&gt;
  attr dim_return_temperature registerType Holding&lt;br /&gt;
  attr dim_return_temperature room Dimplex&lt;br /&gt;
  attr dim_return_temperature stateAlias temperature&lt;br /&gt;
  attr dim_return_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_return_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklaufsolltemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_returnset_temperature ModbusRegister 0 53&lt;br /&gt;
  attr dim_returnset_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_returnset_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_returnset_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_returnset_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_returnset_temperature plcDataType INT&lt;br /&gt;
  attr dim_returnset_temperature registerType Holding&lt;br /&gt;
  attr dim_returnset_temperature room Dimplex&lt;br /&gt;
  attr dim_returnset_temperature stateAlias temperature&lt;br /&gt;
  attr dim_returnset_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_returnset_temperature updateInterval 00:05:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Betriebsdaten ====&lt;br /&gt;
Anlegen eines täglichen Logfile der Betriebsdaten.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_temperature FileLog ./log/filelog_dim_temperature-%W-%d.log&lt;br /&gt;
                                      dim_.*._temperature:temperature:.*|dim_.*._pressure:pressure:.*&lt;br /&gt;
  attr filelog_dim_temperature room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Statistiken ====&lt;br /&gt;
Folgender Code legt die Statistiken der Betriebsdaten an&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_statistics statistics dim_.*._temperature|dim_.*._pressure&lt;br /&gt;
  attr dim_statistics dayChangeTime 1&lt;br /&gt;
  attr dim_statistics deltaReadings temperature,pressure&lt;br /&gt;
  attr dim_statistics minAvgMaxReadings temperature,pressure&lt;br /&gt;
  attr dim_statistics room Dimplex&lt;br /&gt;
  attr dim_statistics tendencyReadings temperature,pressure&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustände ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Zustände. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_output      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_output      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_ output      || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_output || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_output  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_output         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_output   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_output    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Coil Verdichter und passenden HourCounter für Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_output ModbusCoil 0 41&lt;br /&gt;
  attr dim_compressor_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_compressor_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_compressor_output event-min-interval .*:900&lt;br /&gt;
  attr dim_compressor_output event-on-change-reading .*&lt;br /&gt;
  attr dim_compressor_output room Dimplex&lt;br /&gt;
  attr dim_compressor_output source Coil&lt;br /&gt;
  attr dim_compressor_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_compressor_output HourCounter dim_compressor_output:on dim_compressor_output:off&lt;br /&gt;
   attr hourcounter_compressor_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
   attr hourcounter_compressor_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Ventilator definieren und passenden HourCounter für Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_output ModbusCoil 0 43&lt;br /&gt;
  attr dim_ventilator_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_ventilator_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_ventilator_output event-min-interval .*:900&lt;br /&gt;
  attr dim_ventilator_output event-on-change-reading .*&lt;br /&gt;
  attr dim_ventilator_output room Dimplex&lt;br /&gt;
  attr dim_ventilator_output source Coil&lt;br /&gt;
  attr dim_ventilator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_ventilator_output HourCounter dim_ventilator_output:on dim_ventilator_output:off&lt;br /&gt;
  attr hourcounter_ventilator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_ventilator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil 2.Wärmeerzeuger definieren und passenden HourCounter für 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_output ModbusCoil 0 44&lt;br /&gt;
  attr dim_2heatgenerator_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_2heatgenerator_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_2heatgenerator_output event-min-interval .*:900&lt;br /&gt;
  attr dim_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
  attr dim_2heatgenerator_output room Dimplex&lt;br /&gt;
  attr dim_2heatgenerator_output source Coil&lt;br /&gt;
  attr dim_2heatgenerator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_2heatgenerator_output HourCounter dim_2heatgenerator_output:on dim_2heatgenerator_output:off&lt;br /&gt;
  attr hourcounter_2heatgenerator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Heizungsumwälzpumpe M13 definieren und passenden HourCounter für Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_output ModbusCoil 0 45&lt;br /&gt;
  attr dim_circulationpump_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_circulationpump_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_circulationpump_output event-min-interval .*:900&lt;br /&gt;
  attr dim_circulationpump_output event-on-change-reading .*&lt;br /&gt;
  attr dim_circulationpump_output room Dimplex&lt;br /&gt;
  attr dim_circulationpump_output source Coil&lt;br /&gt;
  attr dim_circulationpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_circulationpump_output HourCounter dim_circulationpump_output:on dim_circulationpump_output:off&lt;br /&gt;
  attr hourcounter_circulationpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_circulationpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Warmwasserpumpe M18 definieren und passenden HourCounter für Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_output ModbusCoil 0 46&lt;br /&gt;
attr dim_dhwpump_output IODev HeatPumpServer&lt;br /&gt;
attr dim_dhwpump_output disableRegisterMapping 1&lt;br /&gt;
attr dim_dhwpump_output event-min-interval .*:900&lt;br /&gt;
attr dim_dhwpump_output event-on-change-reading .*&lt;br /&gt;
attr dim_dhwpump_output room Dimplex&lt;br /&gt;
attr dim_dhwpump_output source Coil&lt;br /&gt;
attr dim_dhwpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_dhwpump_output HourCounter dim_dhwpump_output:on dim_dhwpump_output:off&lt;br /&gt;
attr hourcounter_dhwpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
attr hourcounter_dhwpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Zusatzpumpe M16 definieren und Passenden HourCounter für Zusatzpumpe M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_auxiliarypump_output ModbusCoil 0 49&lt;br /&gt;
  attr dim_auxiliarypump_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_auxiliarypump_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_auxiliarypump_output event-min-interval .*:900&lt;br /&gt;
  attr dim_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
  attr dim_auxiliarypump_output room Dimplex&lt;br /&gt;
  attr dim_auxiliarypump_output source Coil&lt;br /&gt;
  attr dim_auxiliarypump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_auxiliarypump_output HourCounter dim_auxiliarypump_output:on dim_auxiliarypump_output:off&lt;br /&gt;
   attr hourcounter_auxiliarypump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
   attr hourcounter_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Flanschheizung definieren und passenden HourCounter für Flanschheizung M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_output ModbusCoil 0 50&lt;br /&gt;
  attr dim_flangeheater_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_flangeheater_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_flangeheater_output event-min-interval .*:900&lt;br /&gt;
  attr dim_flangeheater_output event-on-change-reading .*&lt;br /&gt;
  attr dim_flangeheater_output room Dimplex&lt;br /&gt;
  attr dim_flangeheater_output source Coil&lt;br /&gt;
  attr dim_flangeheater_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_flangeheater_output HourCounter dim_flangeheater_output:on dim_flangeheater_output:off&lt;br /&gt;
  attr hourcounter_flangeheater_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_flangeheater_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Zustände ====&lt;br /&gt;
Anlegen eines wöchentlichen Logfile der Zustände:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_output_week FileLog ./log/filelog_dim_output_week-%W.log dim_.*._output.*&lt;br /&gt;
  attr filelog_dim_output_week room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Historie. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_history      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_history      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_history       || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_history || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_history  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_history         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_history   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_history    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Register Historie Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_history ModbusRegister 0 72&lt;br /&gt;
  attr dim_compressor_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_compressor_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_compressor_history event-on-change-reading .*&lt;br /&gt;
  attr dim_compressor_history plcDataType INT&lt;br /&gt;
  attr dim_compressor_history registerType Holding&lt;br /&gt;
  attr dim_compressor_history room Dimplex&lt;br /&gt;
  attr dim_compressor_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_history ModbusRegister 0 74&lt;br /&gt;
  attr dim_ventilator_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_ventilator_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_ventilator_history event-on-change-reading .*&lt;br /&gt;
  attr dim_ventilator_history plcDataType INT&lt;br /&gt;
  attr dim_ventilator_history registerType Holding&lt;br /&gt;
  attr dim_ventilator_history room Dimplex&lt;br /&gt;
  attr dim_ventilator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_history ModbusRegister 0 75&lt;br /&gt;
  attr dim_2heatgenerator_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_2heatgenerator_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_2heatgenerator_history event-on-change-reading .*&lt;br /&gt;
  attr dim_2heatgenerator_history plcDataType INT&lt;br /&gt;
  attr dim_2heatgenerator_history registerType Holding&lt;br /&gt;
  attr dim_2heatgenerator_history room Dimplex&lt;br /&gt;
  attr dim_2heatgenerator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_history ModbusRegister 0 76&lt;br /&gt;
  attr dim_circulationpump_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_circulationpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_circulationpump_history event-on-change-reading .*&lt;br /&gt;
  attr dim_circulationpump_history plcDataType INT&lt;br /&gt;
  attr dim_circulationpump_history registerType Holding&lt;br /&gt;
  attr dim_circulationpump_history room Dimplex&lt;br /&gt;
  attr dim_circulationpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_history ModbusRegister 0 77&lt;br /&gt;
  attr dim_dhwpump_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhwpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_dhwpump_history event-on-change-reading .*&lt;br /&gt;
  attr dim_dhwpump_history plcDataType INT&lt;br /&gt;
  attr dim_dhwpump_history registerType Holding&lt;br /&gt;
  attr dim_dhwpump_history room Dimplex&lt;br /&gt;
  attr dim_dhwpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Flanschheizung definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_history ModbusRegister 0 78&lt;br /&gt;
  attr dim_flangeheater_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_flangeheater_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_flangeheater_history event-on-change-reading .*&lt;br /&gt;
  attr dim_flangeheater_history plcDataType INT&lt;br /&gt;
  attr dim_flangeheater_history registerType Holding&lt;br /&gt;
  attr dim_flangeheater_history room Dimplex&lt;br /&gt;
  attr dim_flangeheater_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Logfile Historie ====&lt;br /&gt;
Anlegen eines monatlichen Logfile für die Historischen Daten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_history_month FileLog ./log/filelog_dim_history_month-%m.log dim_.*._history.*&lt;br /&gt;
  attr filelog_dim_history_month room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Wärmemengen ====&lt;br /&gt;
Laut Definition aus dem [http://www.dimplex.de/wiki Dimplex-Wiki] werden die Wärmemengen für Heizen, Warmwasser und Schwimmbad aus 3 Register-Adressen zusammengesetzt. Im Nachfolgenden Code-Beispiel wird dies entsprechend dargestellt. Dabei wird jeweils im ersten Register ein neues userReading mit der Darstellung der Gesamtwärmemenge angelegt.&lt;br /&gt;
&lt;br /&gt;
Wärmemenge Heizen definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_heating1_thermalenergy ModbusRegister 0 5096&lt;br /&gt;
  attr dim_heating1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_heating1_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_heating1_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_heating1_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_heating1_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_heating1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
  attr dim_heating1_thermalenergy userReadings heatingthermalenergy {\&lt;br /&gt;
                                    ((ReadingsVal(&amp;quot;dim_heating3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                     (ReadingsVal(&amp;quot;dim_heating2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                     (ReadingsVal(&amp;quot;dim_heating1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_heating2_thermalenergy ModbusRegister 0 5097&lt;br /&gt;
  attr dim_heating2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_heating2_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_heating2_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_heating2_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_heating2_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_heating2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_heating3_thermalenergy ModbusRegister 0 5098&lt;br /&gt;
  attr dim_heating3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_heating3_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_heating3_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_heating3_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_heating3_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_heating3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Wärmemenge Warmwasser definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw1_thermalenergy ModbusRegister 0 5099&lt;br /&gt;
  attr dim_dhw1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw1_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw1_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_dhw1_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_dhw1_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_dhw1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
  attr dim_dhw1_thermalenergy userReadings dhwthermalenergy {\&lt;br /&gt;
                                ((ReadingsVal(&amp;quot;dim_dhw3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                 (ReadingsVal(&amp;quot;dim_dhw2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                 (ReadingsVal(&amp;quot;dim_dhw1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_dhw2_thermalenergy ModbusRegister 0 5100&lt;br /&gt;
  attr dim_dhw2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw2_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw2_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_dhw2_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_dhw2_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_dhw2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_dhw3_thermalenergy ModbusRegister 0 5101&lt;br /&gt;
  attr dim_dhw3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw3_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw3_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_dhw3_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_dhw3_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_dhw3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Umweltenergie ====&lt;br /&gt;
Als Umweltenergie wird die zugeführte Kälteenergie aus der Umwelt (Luft/Erdreich) bezeichnet. Das Auslesen dieser Werte über die Schnittstelle ist erst ab einem neueren Softwarestand möglich. Die Differenz der gesamten Wärmemenge und der Umweltenergie entspricht in etwa der Energie des Verdichters.&lt;br /&gt;
&lt;br /&gt;
Umweltenergie/entzogene Kälteenergie definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_environment1_energy ModbusRegister 0 5127&lt;br /&gt;
  attr dim_environment1_energy IODev HeatPumpServer&lt;br /&gt;
  attr dim_environment1_energy event-on-change-reading .*&lt;br /&gt;
  attr dim_environment1_energy plcDataType INT&lt;br /&gt;
  attr dim_environment1_energy registerType Holding&lt;br /&gt;
  attr dim_environment1_energy room Dimplex&lt;br /&gt;
  attr dim_environment1_energy updateInterval 00:15:00&lt;br /&gt;
  attr dim_environment1_energy userReadings environmentenergy {\&lt;br /&gt;
                                 ((ReadingsVal(&amp;quot;dim_environment3_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                  (ReadingsVal(&amp;quot;dim_environment2_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                  (ReadingsVal(&amp;quot;dim_environment1_energy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_environment2_energy ModbusRegister 0 5128&lt;br /&gt;
  attr dim_environment2_energy IODev HeatPumpServer&lt;br /&gt;
  attr dim_environment2_energy event-on-change-reading .*&lt;br /&gt;
  attr dim_environment2_energy plcDataType INT&lt;br /&gt;
  attr dim_environment2_energy registerType Holding&lt;br /&gt;
  attr dim_environment2_energy room Dimplex&lt;br /&gt;
  attr dim_environment2_energy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_environment3_energy ModbusRegister 0 5129&lt;br /&gt;
  attr dim_environment3_energy IODev HeatPumpServer&lt;br /&gt;
  attr dim_environment3_energy event-on-change-reading .*&lt;br /&gt;
  attr dim_environment3_energy plcDataType INT&lt;br /&gt;
  attr dim_environment3_energy registerType Holding&lt;br /&gt;
  attr dim_environment3_energy room Dimplex&lt;br /&gt;
  attr dim_environment3_energy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Wärmemengen ====&lt;br /&gt;
Anlegen eines jährlichen Logfile der Wärmemengen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_thermalenergy_year FileLog ./log/filelog_dim_thermalenergy_year-%y.log dim_heating1_thermalenergy:heatingthermalenergy:.*|dim_heating1_thermalenergy:heatingthermalenergy:.*&lt;br /&gt;
attr filelog_dim_thermalenergy_year room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Meldungen ===&lt;br /&gt;
[[Bild:dimplex_rh_status_heatpump.jpg|thumb|right|Beispiel Meldungen]]&lt;br /&gt;
Eine sinnvolle Anzeige sind die Meldungen (Status, Sperre, Störung) der Wärmepumpe. Im nachfolgenden Beispiel werden die Meldungen mit dem Hilfsmodul [[readingsHistory]] dargestellt. Die Definitionen der Meldungen beziehen sich auf die im [http://www.dimplex.de/wiki Dimplex-Wiki] beschriebene L-Software. Bei abweichenden Softwareständen müssen die Register sowie die Texte angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Register Statusmeldung definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_status_heatpump ModbusRegister 0 103&lt;br /&gt;
  attr dim_status_heatpump IODev HeatPumpServer&lt;br /&gt;
  attr dim_status_heatpump event-on-change-reading .*&lt;br /&gt;
  attr dim_status_heatpump plcDataType INT&lt;br /&gt;
  attr dim_status_heatpump registerType Holding&lt;br /&gt;
  attr dim_status_heatpump room Dimplex&lt;br /&gt;
  attr dim_status_heatpump updateInterval 00:00:10&lt;br /&gt;
  attr dim_status_heatpump userReadings Status {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 1) ? &amp;quot;Aus&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 4) ? &amp;quot;Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Abtauen&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Durchflussüberwachnung&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Sperrmeldunge definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_block_heatpump ModbusRegister 0 104&lt;br /&gt;
  attr dim_block_heatpump IODev HeatPumpServer&lt;br /&gt;
  attr dim_block_heatpump event-on-change-reading .*&lt;br /&gt;
  attr dim_block_heatpump plcDataType INT&lt;br /&gt;
  attr dim_block_heatpump registerType Holding&lt;br /&gt;
  attr dim_block_heatpump room Dimplex&lt;br /&gt;
  attr dim_block_heatpump updateInterval 00:00:10&lt;br /&gt;
  attr dim_block_heatpump userReadings Sperre {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 7) ? &amp;quot;Systemkontrolle&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 9) ? &amp;quot;Pumpenvorlauf&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Mindeststandzeit&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Netzbelastung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 12) ? &amp;quot;Schaltspielsperre&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;EVU&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Störmeldungen definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_fault_heatpump ModbusRegister 0 105&lt;br /&gt;
  attr dim_fault_heatpump IODev HeatPumpServer&lt;br /&gt;
  attr dim_fault_heatpump event-on-change-reading .*&lt;br /&gt;
  attr dim_fault_heatpump plcDataType INT&lt;br /&gt;
  attr dim_fault_heatpump registerType Holding&lt;br /&gt;
  attr dim_fault_heatpump room Dimplex&lt;br /&gt;
  attr dim_fault_heatpump updateInterval 00:01:00&lt;br /&gt;
  attr dim_fault_heatpump userReadings Störung {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 6) ? &amp;quot;Elektronisches Ex.Ventil&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;Sensorik&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 19) ? &amp;quot;!Primärkreis&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 22) ? &amp;quot;!Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 23) ? &amp;quot;!Last Verdichter&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 24) ? &amp;quot;!Codierung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 25) ? &amp;quot;!Niederdruck&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 26) ? &amp;quot;!Frostschutz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 29) ? &amp;quot;!Temperatur Differenz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 31) ? &amp;quot;!Durchfluss&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Anzeige der Meldungen ====&lt;br /&gt;
readingsHistory definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define rh_dim_status_heatpump readingsHistory dim_status_heatpump:Status dim_block_heatpump:Sperre dim_fault_heatpump:Störung&lt;br /&gt;
  attr rh_dim_status_heatpump alias Status&lt;br /&gt;
  attr rh_dim_status_heatpump mapping {&#039;dim_status_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_block_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_fault_heatpump&#039; =&amp;gt; &#039;&#039;}&lt;br /&gt;
  attr rh_dim_status_heatpump nohtml 1&lt;br /&gt;
  attr rh_dim_status_heatpump room Dimplex&lt;br /&gt;
  attr rh_dim_status_heatpump rows 20&lt;br /&gt;
  attr rh_dim_status_heatpump timestampFormat %b %a %R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plotbeispiel ==&lt;br /&gt;
=== Temperaturen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:40:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set ytics nomirror&lt;br /&gt;
set y2tics &lt;br /&gt;
set grid ytics y2tics&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Temperatur (°C)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_outdoor_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_room_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_return_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_returnset_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_dhw_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_flow_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_brine_temperature.*::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;AT&#039; ls l7 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RT&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RL&#039; ls l2 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RLS&#039; ls l3 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;WWT&#039; ls l4 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;VLT&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;SOL&#039; ls l6 lw 1 with lines&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgänge ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:45:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
set ytics (&amp;quot;An&amp;quot; -1, &amp;quot;Aus&amp;quot; -2, &amp;quot;An&amp;quot; -5, &amp;quot;Aus&amp;quot; -6, &amp;quot;An&amp;quot; -9, &amp;quot;Aus&amp;quot; -10, &amp;quot;An&amp;quot; -13, &amp;quot;Aus&amp;quot; -14)&lt;br /&gt;
set y2tics (&amp;quot;An&amp;quot; 1, &amp;quot;Aus&amp;quot; 0, &amp;quot;An&amp;quot; -3, &amp;quot;Aus&amp;quot; -4, &amp;quot;An&amp;quot; -7, &amp;quot;Aus&amp;quot; -8, &amp;quot;An&amp;quot; -11, &amp;quot;Aus&amp;quot; -12)&lt;br /&gt;
set grid&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Digital&amp;quot;&lt;br /&gt;
set yrange [-16:2]&lt;br /&gt;
set y2range [-16:2]&lt;br /&gt;
&lt;br /&gt;
#FileLog 3:dim_compressor_output.*::$fld[2]=~&amp;quot;on&amp;quot;?1:0&lt;br /&gt;
#FileLog 3:dim_ventilator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-1:-2&lt;br /&gt;
#FileLog 3:dim_2heatgenerator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-3:-4&lt;br /&gt;
#FileLog 3:dim_circulationpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-5:-6&lt;br /&gt;
#FileLog 3:dim_dhwpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-7:-8&lt;br /&gt;
#FileLog 3:dim_auxiliarypump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-9:-10&lt;br /&gt;
#FileLog 3:dim_solarpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-11:-12&lt;br /&gt;
#FileLog 3:dim_flangeheater_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-13:-14&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Vd&#039; ls l7 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Ve&#039; ls l6 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;2.We&#039; ls l5 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Hub&#039; ls l4 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Wup&#039; ls l3 lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Zup&#039; ls l0 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Sol&#039; ls l2 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Flh&#039; ls l7 lw 1.5 with steps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:dimplex_hp_graph.jpg|thumb|right|Plotbeispiel]]&lt;br /&gt;
Im nebenstehenden Plotbeispiel werde die Temperaturen (Analogwerte) sowie die Ausgänge (Digitalwerte) dargestellt. Im einzelnen sind die Kurven für die&lt;br /&gt;
&lt;br /&gt;
* Aussen- (AT)&lt;br /&gt;
* Raum- (RT)&lt;br /&gt;
* Rücklauf- (RL)&lt;br /&gt;
* Rücklaufsoll- (RLS)&lt;br /&gt;
* Warmwasser- (WWT) und &lt;br /&gt;
* Vorlauftemperatur (VLT) &lt;br /&gt;
&lt;br /&gt;
sowie die Ausgänge für&lt;br /&gt;
&lt;br /&gt;
* Verdichter 1 (Vd)&lt;br /&gt;
* Ventilator (Ve)&lt;br /&gt;
* 2.Wärmeerzeuger (2We)&lt;br /&gt;
* Heizungsumwälzpumpe (Hup)&lt;br /&gt;
* Warmwasserumwälzpumpe (Wup) und&lt;br /&gt;
* Zusatzumwälzpumpe (Zup)&lt;br /&gt;
&lt;br /&gt;
enthalten.&lt;br /&gt;
&lt;br /&gt;
= Kontakt =&lt;br /&gt;
Weitere Fragen, Wünsche und Anregungen bitte im entsprechenden {{Link2Forum|Topic=33086|LinkText=Forenthread zum Wiki-Artikel &amp;quot;Dimplex Wärmepumpenmanager&amp;quot;}} zur Diskussion stellen.&lt;br /&gt;
&lt;br /&gt;
Offene Punkte:&lt;br /&gt;
- Darstellung der Werte in einer readingsGroup&lt;br /&gt;
- Zugriff auf Zeitfunktionen mit Lesen und Schreiben&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40079</id>
		<title>Dimplex Wärmepumpenmanager</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40079"/>
		<updated>2025-03-30T16:07:35Z</updated>

		<summary type="html">&lt;p&gt;TomLee: Raw-Code-Anpassungen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- bitte noch die Abkürzung &amp;quot;NWPM&amp;quot; erklären (Benutzer:Ph1959de, 2015/02/02) --&amp;gt;&lt;br /&gt;
Mit der NWPM-Erweiterung ist es möglich, den Dimplex Wärmepumpenmanager in ein Hausnetzwerk einzubinden. Durch die Einbindung der NWPM-Erweiterung ist es ebenfalls möglich, die zur Verfügung gestellten Werte vom Wärmepumpenmanager mittels ModbusTCP in FHEM zu übernehmen, anzuzeigen und grafisch darzustellen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzung ==&lt;br /&gt;
Die Anbindung des Dimplex Wärmepumpenmanager an FHEM erfolgt mittels NWPM-Erweiterung und der aktuellen FHEM Installation. Weiterhin werden die zur Verfügung stehenden Module:&lt;br /&gt;
&lt;br /&gt;
* 36_ModbusTCPServer.pm &lt;br /&gt;
* 37_ModbusCoil.pm&lt;br /&gt;
* 37_ModbusRegister.pm&lt;br /&gt;
&lt;br /&gt;
genutzt. Getestet wurde der Zugriff auf einem BeagleBone Black mit der [[BeagleBone Black|hier beschriebenen]] Debian Installation.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Die oben aufgeführten Module sind notwendig und müssen nachinstalliert werden. Zum Zeitpunkt der Erstellung dieser Dokumentation (31.1.2015) sind diese noch nicht offiziell in FHEM enthalten und werden auch nicht mittels Update verteilt. Die Module werden mit dem Befehl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update all https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mb/controls_modbus.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
über die FHEM Befehlszeile installiert und anschließend&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reload 36_ModbusTCPServer.pm &lt;br /&gt;
reload 37_ModbusCoil.pm&lt;br /&gt;
reload 37_ModbusRegister.pm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
mit einem Reload geladen.&lt;br /&gt;
== Benutzung == &lt;br /&gt;
=== Anlegen der ModbusTCPServer Verbindung ===&lt;br /&gt;
Wie im nachfolgenden angegeben muss zunächst eine ModbusTCPServer Verbindung hergestellt werden. Die angegebene IP-Adresse muss durch die IP-Adresse der Wärmepumpe ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
########################################################&lt;br /&gt;
##  ModbusTCPServer definieren&lt;br /&gt;
########################################################&lt;br /&gt;
define HeatPumpServer ModbusTCPServer 192.168.1.150&lt;br /&gt;
attr HeatPumpServer verbose 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ein erfolgreicher Verbindungsaufbau wird mit einem „ok“ im State gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
=== Modbus-Register/Coil Adressen definieren ===&lt;br /&gt;
Im nachfolgendem Beispiel wird anhand der Außentemperatur die Adressdefinition erklärt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_outdoor_temperature ModbusRegister 0 1&lt;br /&gt;
  attr dim_outdoor_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_outdoor_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_outdoor_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_outdoor_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_outdoor_temperature plcDataType INT&lt;br /&gt;
  attr dim_outdoor_temperature registerType Holding&lt;br /&gt;
  attr dim_outdoor_temperature room Dimplex&lt;br /&gt;
  attr dim_outdoor_temperature stateAlias temperature&lt;br /&gt;
  attr dim_outdoor_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_outdoor_temperature updateInterval 00:10:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erklärung:&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Erläuterungen zur Adressdefinition&lt;br /&gt;
|-&lt;br /&gt;
! Attribut !! Erläuterungen&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 0 Device Adresse, in der Regel bei ModbusTCP immer 0&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 1 Register Adresse, wird unter www.dimplex.de/wiki → ModbusTCP → Spalten IP zur Verfügung gestellt&lt;br /&gt;
|-&lt;br /&gt;
| IODev              || Verwendeter und zuvor angelegter ModbusTCPServer&lt;br /&gt;
|-&lt;br /&gt;
| conversion         || eine gegebenenfalls notwendige Konvertierung des übermittelten Values&lt;br /&gt;
|-&lt;br /&gt;
| PlcDataType        || Ermögliche automatische Interpretation der ankommenden Daten&lt;br /&gt;
|-&lt;br /&gt;
| stateAlias         || es wird ein zusätzliches Reading erzeugt, um zum Beispiel das Statistic-Modul nutzen zu können, stateAlias ist eine echte Kopie von &amp;quot;state&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| updateInterval    || Intervall des Abfragezyklus (z.B. 00:10:00 Minuten)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Betriebsdaten ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Betriebsdaten. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_outdoor_temperature     || Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_flow_temperature        || Vorlauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_return_temperature      || Rücklauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_returnset_temperature   || Rücklaufsolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_room_temperature        || Raumtemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhw_temperature         || Warmwassertemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwset_temperature      || Warmwassersolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_brine_temperature       || Soletemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_high_pressure           || Hochdruck&lt;br /&gt;
|-&lt;br /&gt;
| dim_low_pressure           || Niederdruck&lt;br /&gt;
|}&lt;br /&gt;
Register Warmwassertemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw_temperature ModbusRegister 0 3&lt;br /&gt;
  attr dim_dhw_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_dhw_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_dhw_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw_temperature plcDataType INT&lt;br /&gt;
  attr dim_dhw_temperature registerType Holding&lt;br /&gt;
  attr dim_dhw_temperature room Dimplex&lt;br /&gt;
  attr dim_dhw_temperature stateAlias temperature&lt;br /&gt;
  attr dim_dhw_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_dhw_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Vorlauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flow_temperature ModbusRegister 0 5&lt;br /&gt;
  attr dim_flow_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_flow_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_flow_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_flow_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_flow_temperature plcDataType INT&lt;br /&gt;
  attr dim_flow_temperature registerType Holding&lt;br /&gt;
  attr dim_flow_temperature room Dimplex&lt;br /&gt;
  attr dim_flow_temperature stateAlias temperature&lt;br /&gt;
  attr dim_flow_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_flow_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_return_temperature ModbusRegister 0 2&lt;br /&gt;
  attr dim_return_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_return_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_return_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_return_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_return_temperature plcDataType INT&lt;br /&gt;
  attr dim_return_temperature registerType Holding&lt;br /&gt;
  attr dim_return_temperature room Dimplex&lt;br /&gt;
  attr dim_return_temperature stateAlias temperature&lt;br /&gt;
  attr dim_return_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_return_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklaufsolltemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_returnset_temperature ModbusRegister 0 53&lt;br /&gt;
  attr dim_returnset_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_returnset_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_returnset_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_returnset_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_returnset_temperature plcDataType INT&lt;br /&gt;
  attr dim_returnset_temperature registerType Holding&lt;br /&gt;
  attr dim_returnset_temperature room Dimplex&lt;br /&gt;
  attr dim_returnset_temperature stateAlias temperature&lt;br /&gt;
  attr dim_returnset_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_returnset_temperature updateInterval 00:05:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Betriebsdaten ====&lt;br /&gt;
Anlegen eines täglichen Logfile der Betriebsdaten.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_temperature FileLog ./log/filelog_dim_temperature-%W-%d.log&lt;br /&gt;
                                      dim_.*._temperature:temperature:.*|dim_.*._pressure:pressure:.*&lt;br /&gt;
  attr filelog_dim_temperature room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Statistiken ====&lt;br /&gt;
Folgender Code legt die Statistiken der Betriebsdaten an&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_statistics statistics dim_.*._temperature|dim_.*._pressure&lt;br /&gt;
  attr dim_statistics dayChangeTime 1&lt;br /&gt;
  attr dim_statistics deltaReadings temperature,pressure&lt;br /&gt;
  attr dim_statistics minAvgMaxReadings temperature,pressure&lt;br /&gt;
  attr dim_statistics room Dimplex&lt;br /&gt;
  attr dim_statistics tendencyReadings temperature,pressure&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustände ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Zustände. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_output      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_output      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_ output      || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_output || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_output  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_output         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_output   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_output    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Coil Verdichter und passenden HourCounter für Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_output ModbusCoil 0 41&lt;br /&gt;
  attr dim_compressor_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_compressor_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_compressor_output event-min-interval .*:900&lt;br /&gt;
  attr dim_compressor_output event-on-change-reading .*&lt;br /&gt;
  attr dim_compressor_output room Dimplex&lt;br /&gt;
  attr dim_compressor_output source Coil&lt;br /&gt;
  attr dim_compressor_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_compressor_output HourCounter dim_compressor_output:on dim_compressor_output:off&lt;br /&gt;
   attr hourcounter_compressor_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
   attr hourcounter_compressor_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Ventilator definieren und passenden HourCounter für Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_output ModbusCoil 0 43&lt;br /&gt;
  attr dim_ventilator_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_ventilator_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_ventilator_output event-min-interval .*:900&lt;br /&gt;
  attr dim_ventilator_output event-on-change-reading .*&lt;br /&gt;
  attr dim_ventilator_output room Dimplex&lt;br /&gt;
  attr dim_ventilator_output source Coil&lt;br /&gt;
  attr dim_ventilator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_ventilator_output HourCounter dim_ventilator_output:on dim_ventilator_output:off&lt;br /&gt;
  attr hourcounter_ventilator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_ventilator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil 2.Wärmeerzeuger definieren und passenden HourCounter für 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_output ModbusCoil 0 44&lt;br /&gt;
  attr dim_2heatgenerator_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_2heatgenerator_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_2heatgenerator_output event-min-interval .*:900&lt;br /&gt;
  attr dim_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
  attr dim_2heatgenerator_output room Dimplex&lt;br /&gt;
  attr dim_2heatgenerator_output source Coil&lt;br /&gt;
  attr dim_2heatgenerator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_2heatgenerator_output HourCounter dim_2heatgenerator_output:on dim_2heatgenerator_output:off&lt;br /&gt;
  attr hourcounter_2heatgenerator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Heizungsumwälzpumpe M13 definieren und passenden HourCounter für Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_output ModbusCoil 0 45&lt;br /&gt;
  attr dim_circulationpump_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_circulationpump_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_circulationpump_output event-min-interval .*:900&lt;br /&gt;
  attr dim_circulationpump_output event-on-change-reading .*&lt;br /&gt;
  attr dim_circulationpump_output room Dimplex&lt;br /&gt;
  attr dim_circulationpump_output source Coil&lt;br /&gt;
  attr dim_circulationpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_circulationpump_output HourCounter dim_circulationpump_output:on dim_circulationpump_output:off&lt;br /&gt;
  attr hourcounter_circulationpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_circulationpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Warmwasserpumpe M18 definieren und passenden HourCounter für Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_output ModbusCoil 0 46&lt;br /&gt;
  attr dim_dhwpump_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhwpump_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_dhwpump_output event-min-interval .*:900&lt;br /&gt;
  attr dim_dhwpump_output event-on-change-reading .*&lt;br /&gt;
  attr dim_dhwpump_output room Dimplex&lt;br /&gt;
  attr dim_dhwpump_output source Coil&lt;br /&gt;
  attr dim_dhwpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
define hourcounter_dhwpump_output HourCounter dim_dhwpump_output:on dim_dhwpump_output:off&lt;br /&gt;
  attr hourcounter_dhwpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_dhwpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Zusatzpumpe M16 definieren und Passenden HourCounter für Zusatzpumpe M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_auxiliarypump_output ModbusCoil 0 49&lt;br /&gt;
  attr dim_auxiliarypump_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_auxiliarypump_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_auxiliarypump_output event-min-interval .*:900&lt;br /&gt;
  attr dim_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
  attr dim_auxiliarypump_output room Dimplex&lt;br /&gt;
  attr dim_auxiliarypump_output source Coil&lt;br /&gt;
  attr dim_auxiliarypump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_auxiliarypump_output HourCounter dim_auxiliarypump_output:on dim_auxiliarypump_output:off&lt;br /&gt;
   attr hourcounter_auxiliarypump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
   attr hourcounter_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Flanschheizung definieren und passenden HourCounter für Flanschheizung M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_output ModbusCoil 0 50&lt;br /&gt;
  attr dim_flangeheater_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_flangeheater_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_flangeheater_output event-min-interval .*:900&lt;br /&gt;
  attr dim_flangeheater_output event-on-change-reading .*&lt;br /&gt;
  attr dim_flangeheater_output room Dimplex&lt;br /&gt;
  attr dim_flangeheater_output source Coil&lt;br /&gt;
  attr dim_flangeheater_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_flangeheater_output HourCounter dim_flangeheater_output:on dim_flangeheater_output:off&lt;br /&gt;
  attr hourcounter_flangeheater_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_flangeheater_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Zustände ====&lt;br /&gt;
Anlegen eines wöchentlichen Logfile der Zustände:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_output_week FileLog ./log/filelog_dim_output_week-%W.log dim_.*._output.*&lt;br /&gt;
  attr filelog_dim_output_week room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Historie. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_history      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_history      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_history       || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_history || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_history  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_history         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_history   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_history    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Register Historie Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_history ModbusRegister 0 72&lt;br /&gt;
  attr dim_compressor_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_compressor_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_compressor_history event-on-change-reading .*&lt;br /&gt;
  attr dim_compressor_history plcDataType INT&lt;br /&gt;
  attr dim_compressor_history registerType Holding&lt;br /&gt;
  attr dim_compressor_history room Dimplex&lt;br /&gt;
  attr dim_compressor_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_history ModbusRegister 0 74&lt;br /&gt;
  attr dim_ventilator_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_ventilator_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_ventilator_history event-on-change-reading .*&lt;br /&gt;
  attr dim_ventilator_history plcDataType INT&lt;br /&gt;
  attr dim_ventilator_history registerType Holding&lt;br /&gt;
  attr dim_ventilator_history room Dimplex&lt;br /&gt;
  attr dim_ventilator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_history ModbusRegister 0 75&lt;br /&gt;
  attr dim_2heatgenerator_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_2heatgenerator_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_2heatgenerator_history event-on-change-reading .*&lt;br /&gt;
  attr dim_2heatgenerator_history plcDataType INT&lt;br /&gt;
  attr dim_2heatgenerator_history registerType Holding&lt;br /&gt;
  attr dim_2heatgenerator_history room Dimplex&lt;br /&gt;
  attr dim_2heatgenerator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_history ModbusRegister 0 76&lt;br /&gt;
  attr dim_circulationpump_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_circulationpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_circulationpump_history event-on-change-reading .*&lt;br /&gt;
  attr dim_circulationpump_history plcDataType INT&lt;br /&gt;
  attr dim_circulationpump_history registerType Holding&lt;br /&gt;
  attr dim_circulationpump_history room Dimplex&lt;br /&gt;
  attr dim_circulationpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_history ModbusRegister 0 77&lt;br /&gt;
  attr dim_dhwpump_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhwpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_dhwpump_history event-on-change-reading .*&lt;br /&gt;
  attr dim_dhwpump_history plcDataType INT&lt;br /&gt;
  attr dim_dhwpump_history registerType Holding&lt;br /&gt;
  attr dim_dhwpump_history room Dimplex&lt;br /&gt;
  attr dim_dhwpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Flanschheizung definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_history ModbusRegister 0 78&lt;br /&gt;
  attr dim_flangeheater_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_flangeheater_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_flangeheater_history event-on-change-reading .*&lt;br /&gt;
  attr dim_flangeheater_history plcDataType INT&lt;br /&gt;
  attr dim_flangeheater_history registerType Holding&lt;br /&gt;
  attr dim_flangeheater_history room Dimplex&lt;br /&gt;
  attr dim_flangeheater_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Logfile Historie ====&lt;br /&gt;
Anlegen eines monatlichen Logfile für die Historischen Daten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_history_month FileLog ./log/filelog_dim_history_month-%m.log dim_.*._history.*&lt;br /&gt;
  attr filelog_dim_history_month room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Wärmemengen ====&lt;br /&gt;
Laut Definition aus dem [http://www.dimplex.de/wiki Dimplex-Wiki] werden die Wärmemengen für Heizen, Warmwasser und Schwimmbad aus 3 Register-Adressen zusammengesetzt. Im Nachfolgenden Code-Beispiel wird dies entsprechend dargestellt. Dabei wird jeweils im ersten Register ein neues userReading mit der Darstellung der Gesamtwärmemenge angelegt.&lt;br /&gt;
&lt;br /&gt;
Wärmemenge Heizen definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_heating1_thermalenergy ModbusRegister 0 5096&lt;br /&gt;
  attr dim_heating1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_heating1_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_heating1_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_heating1_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_heating1_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_heating1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
  attr dim_heating1_thermalenergy userReadings heatingthermalenergy {\&lt;br /&gt;
                                    ((ReadingsVal(&amp;quot;dim_heating3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                     (ReadingsVal(&amp;quot;dim_heating2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                     (ReadingsVal(&amp;quot;dim_heating1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_heating2_thermalenergy ModbusRegister 0 5097&lt;br /&gt;
  attr dim_heating2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_heating2_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_heating2_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_heating2_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_heating2_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_heating2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_heating3_thermalenergy ModbusRegister 0 5098&lt;br /&gt;
  attr dim_heating3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_heating3_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_heating3_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_heating3_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_heating3_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_heating3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Wärmemenge Warmwasser definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw1_thermalenergy ModbusRegister 0 5099&lt;br /&gt;
  attr dim_dhw1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw1_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw1_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_dhw1_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_dhw1_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_dhw1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
  attr dim_dhw1_thermalenergy userReadings dhwthermalenergy {\&lt;br /&gt;
                                ((ReadingsVal(&amp;quot;dim_dhw3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                 (ReadingsVal(&amp;quot;dim_dhw2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                 (ReadingsVal(&amp;quot;dim_dhw1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_dhw2_thermalenergy ModbusRegister 0 5100&lt;br /&gt;
  attr dim_dhw2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw2_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw2_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_dhw2_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_dhw2_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_dhw2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_dhw3_thermalenergy ModbusRegister 0 5101&lt;br /&gt;
  attr dim_dhw3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw3_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw3_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_dhw3_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_dhw3_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_dhw3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Umweltenergie ====&lt;br /&gt;
Als Umweltenergie wird die zugeführte Kälteenergie aus der Umwelt (Luft/Erdreich) bezeichnet. Das Auslesen dieser Werte über die Schnittstelle ist erst ab einem neueren Softwarestand möglich. Die Differenz der gesamten Wärmemenge und der Umweltenergie entspricht in etwa der Energie des Verdichters.&lt;br /&gt;
&lt;br /&gt;
Umweltenergie/entzogene Kälteenergie definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_environment1_energy ModbusRegister 0 5127&lt;br /&gt;
  attr dim_environment1_energy IODev HeatPumpServer&lt;br /&gt;
  attr dim_environment1_energy event-on-change-reading .*&lt;br /&gt;
  attr dim_environment1_energy plcDataType INT&lt;br /&gt;
  attr dim_environment1_energy registerType Holding&lt;br /&gt;
  attr dim_environment1_energy room Dimplex&lt;br /&gt;
  attr dim_environment1_energy updateInterval 00:15:00&lt;br /&gt;
  attr dim_environment1_energy userReadings environmentenergy {\&lt;br /&gt;
                                 ((ReadingsVal(&amp;quot;dim_environment3_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                  (ReadingsVal(&amp;quot;dim_environment2_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                  (ReadingsVal(&amp;quot;dim_environment1_energy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_environment2_energy ModbusRegister 0 5128&lt;br /&gt;
  attr dim_environment2_energy IODev HeatPumpServer&lt;br /&gt;
  attr dim_environment2_energy event-on-change-reading .*&lt;br /&gt;
  attr dim_environment2_energy plcDataType INT&lt;br /&gt;
  attr dim_environment2_energy registerType Holding&lt;br /&gt;
  attr dim_environment2_energy room Dimplex&lt;br /&gt;
  attr dim_environment2_energy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_environment3_energy ModbusRegister 0 5129&lt;br /&gt;
  attr dim_environment3_energy IODev HeatPumpServer&lt;br /&gt;
  attr dim_environment3_energy event-on-change-reading .*&lt;br /&gt;
  attr dim_environment3_energy plcDataType INT&lt;br /&gt;
  attr dim_environment3_energy registerType Holding&lt;br /&gt;
  attr dim_environment3_energy room Dimplex&lt;br /&gt;
  attr dim_environment3_energy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Wärmemengen ====&lt;br /&gt;
Anlegen eines jährlichen Logfile der Wärmemengen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_thermalenergy_year FileLog ./log/filelog_dim_thermalenergy_year-%y.log dim_heating1_thermalenergy:heatingthermalenergy:.*|dim_heating1_thermalenergy:heatingthermalenergy:.*&lt;br /&gt;
attr filelog_dim_thermalenergy_year room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Meldungen ===&lt;br /&gt;
[[Bild:dimplex_rh_status_heatpump.jpg|thumb|right|Beispiel Meldungen]]&lt;br /&gt;
Eine sinnvolle Anzeige sind die Meldungen (Status, Sperre, Störung) der Wärmepumpe. Im nachfolgenden Beispiel werden die Meldungen mit dem Hilfsmodul [[readingsHistory]] dargestellt. Die Definitionen der Meldungen beziehen sich auf die im [http://www.dimplex.de/wiki Dimplex-Wiki] beschriebene L-Software. Bei abweichenden Softwareständen müssen die Register sowie die Texte angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Register Statusmeldung definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_status_heatpump ModbusRegister 0 103&lt;br /&gt;
  attr dim_status_heatpump IODev HeatPumpServer&lt;br /&gt;
  attr dim_status_heatpump event-on-change-reading .*&lt;br /&gt;
  attr dim_status_heatpump plcDataType INT&lt;br /&gt;
  attr dim_status_heatpump registerType Holding&lt;br /&gt;
  attr dim_status_heatpump room Dimplex&lt;br /&gt;
  attr dim_status_heatpump updateInterval 00:00:10&lt;br /&gt;
  attr dim_status_heatpump userReadings Status {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 1) ? &amp;quot;Aus&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 4) ? &amp;quot;Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Abtauen&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Durchflussüberwachnung&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Sperrmeldunge definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_block_heatpump ModbusRegister 0 104&lt;br /&gt;
  attr dim_block_heatpump IODev HeatPumpServer&lt;br /&gt;
  attr dim_block_heatpump event-on-change-reading .*&lt;br /&gt;
  attr dim_block_heatpump plcDataType INT&lt;br /&gt;
  attr dim_block_heatpump registerType Holding&lt;br /&gt;
  attr dim_block_heatpump room Dimplex&lt;br /&gt;
  attr dim_block_heatpump updateInterval 00:00:10&lt;br /&gt;
  attr dim_block_heatpump userReadings Sperre {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 7) ? &amp;quot;Systemkontrolle&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 9) ? &amp;quot;Pumpenvorlauf&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Mindeststandzeit&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Netzbelastung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 12) ? &amp;quot;Schaltspielsperre&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;EVU&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Störmeldungen definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_fault_heatpump ModbusRegister 0 105&lt;br /&gt;
  attr dim_fault_heatpump IODev HeatPumpServer&lt;br /&gt;
  attr dim_fault_heatpump event-on-change-reading .*&lt;br /&gt;
  attr dim_fault_heatpump plcDataType INT&lt;br /&gt;
  attr dim_fault_heatpump registerType Holding&lt;br /&gt;
  attr dim_fault_heatpump room Dimplex&lt;br /&gt;
  attr dim_fault_heatpump updateInterval 00:01:00&lt;br /&gt;
  attr dim_fault_heatpump userReadings Störung {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 6) ? &amp;quot;Elektronisches Ex.Ventil&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;Sensorik&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 19) ? &amp;quot;!Primärkreis&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 22) ? &amp;quot;!Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 23) ? &amp;quot;!Last Verdichter&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 24) ? &amp;quot;!Codierung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 25) ? &amp;quot;!Niederdruck&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 26) ? &amp;quot;!Frostschutz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 29) ? &amp;quot;!Temperatur Differenz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 31) ? &amp;quot;!Durchfluss&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Anzeige der Meldungen ====&lt;br /&gt;
readingsHistory definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define rh_dim_status_heatpump readingsHistory dim_status_heatpump:Status dim_block_heatpump:Sperre dim_fault_heatpump:Störung&lt;br /&gt;
  attr rh_dim_status_heatpump alias Status&lt;br /&gt;
  attr rh_dim_status_heatpump mapping {&#039;dim_status_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_block_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_fault_heatpump&#039; =&amp;gt; &#039;&#039;}&lt;br /&gt;
  attr rh_dim_status_heatpump nohtml 1&lt;br /&gt;
  attr rh_dim_status_heatpump room Dimplex&lt;br /&gt;
  attr rh_dim_status_heatpump rows 20&lt;br /&gt;
  attr rh_dim_status_heatpump timestampFormat %b %a %R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plotbeispiel ==&lt;br /&gt;
=== Temperaturen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:40:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set ytics nomirror&lt;br /&gt;
set y2tics &lt;br /&gt;
set grid ytics y2tics&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Temperatur (°C)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_outdoor_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_room_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_return_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_returnset_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_dhw_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_flow_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_brine_temperature.*::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;AT&#039; ls l7 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RT&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RL&#039; ls l2 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RLS&#039; ls l3 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;WWT&#039; ls l4 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;VLT&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;SOL&#039; ls l6 lw 1 with lines&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgänge ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:45:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
set ytics (&amp;quot;An&amp;quot; -1, &amp;quot;Aus&amp;quot; -2, &amp;quot;An&amp;quot; -5, &amp;quot;Aus&amp;quot; -6, &amp;quot;An&amp;quot; -9, &amp;quot;Aus&amp;quot; -10, &amp;quot;An&amp;quot; -13, &amp;quot;Aus&amp;quot; -14)&lt;br /&gt;
set y2tics (&amp;quot;An&amp;quot; 1, &amp;quot;Aus&amp;quot; 0, &amp;quot;An&amp;quot; -3, &amp;quot;Aus&amp;quot; -4, &amp;quot;An&amp;quot; -7, &amp;quot;Aus&amp;quot; -8, &amp;quot;An&amp;quot; -11, &amp;quot;Aus&amp;quot; -12)&lt;br /&gt;
set grid&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Digital&amp;quot;&lt;br /&gt;
set yrange [-16:2]&lt;br /&gt;
set y2range [-16:2]&lt;br /&gt;
&lt;br /&gt;
#FileLog 3:dim_compressor_output.*::$fld[2]=~&amp;quot;on&amp;quot;?1:0&lt;br /&gt;
#FileLog 3:dim_ventilator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-1:-2&lt;br /&gt;
#FileLog 3:dim_2heatgenerator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-3:-4&lt;br /&gt;
#FileLog 3:dim_circulationpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-5:-6&lt;br /&gt;
#FileLog 3:dim_dhwpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-7:-8&lt;br /&gt;
#FileLog 3:dim_auxiliarypump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-9:-10&lt;br /&gt;
#FileLog 3:dim_solarpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-11:-12&lt;br /&gt;
#FileLog 3:dim_flangeheater_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-13:-14&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Vd&#039; ls l7 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Ve&#039; ls l6 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;2.We&#039; ls l5 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Hub&#039; ls l4 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Wup&#039; ls l3 lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Zup&#039; ls l0 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Sol&#039; ls l2 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Flh&#039; ls l7 lw 1.5 with steps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:dimplex_hp_graph.jpg|thumb|right|Plotbeispiel]]&lt;br /&gt;
Im nebenstehenden Plotbeispiel werde die Temperaturen (Analogwerte) sowie die Ausgänge (Digitalwerte) dargestellt. Im einzelnen sind die Kurven für die&lt;br /&gt;
&lt;br /&gt;
* Aussen- (AT)&lt;br /&gt;
* Raum- (RT)&lt;br /&gt;
* Rücklauf- (RL)&lt;br /&gt;
* Rücklaufsoll- (RLS)&lt;br /&gt;
* Warmwasser- (WWT) und &lt;br /&gt;
* Vorlauftemperatur (VLT) &lt;br /&gt;
&lt;br /&gt;
sowie die Ausgänge für&lt;br /&gt;
&lt;br /&gt;
* Verdichter 1 (Vd)&lt;br /&gt;
* Ventilator (Ve)&lt;br /&gt;
* 2.Wärmeerzeuger (2We)&lt;br /&gt;
* Heizungsumwälzpumpe (Hup)&lt;br /&gt;
* Warmwasserumwälzpumpe (Wup) und&lt;br /&gt;
* Zusatzumwälzpumpe (Zup)&lt;br /&gt;
&lt;br /&gt;
enthalten.&lt;br /&gt;
&lt;br /&gt;
= Kontakt =&lt;br /&gt;
Weitere Fragen, Wünsche und Anregungen bitte im entsprechenden {{Link2Forum|Topic=33086|LinkText=Forenthread zum Wiki-Artikel &amp;quot;Dimplex Wärmepumpenmanager&amp;quot;}} zur Diskussion stellen.&lt;br /&gt;
&lt;br /&gt;
Offene Punkte:&lt;br /&gt;
- Darstellung der Werte in einer readingsGroup&lt;br /&gt;
- Zugriff auf Zeitfunktionen mit Lesen und Schreiben&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40078</id>
		<title>Dimplex Wärmepumpenmanager</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Dimplex_W%C3%A4rmepumpenmanager&amp;diff=40078"/>
		<updated>2025-03-30T13:55:16Z</updated>

		<summary type="html">&lt;p&gt;TomLee: Kommentare aus den Codebeispielen entfernt. Raw-Code Anpassungen.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- bitte noch die Abkürzung &amp;quot;NWPM&amp;quot; erklären (Benutzer:Ph1959de, 2015/02/02) --&amp;gt;&lt;br /&gt;
Mit der NWPM-Erweiterung ist es möglich, den Dimplex Wärmepumpenmanager in ein Hausnetzwerk einzubinden. Durch die Einbindung der NWPM-Erweiterung ist es ebenfalls möglich, die zur Verfügung gestellten Werte vom Wärmepumpenmanager mittels ModbusTCP in FHEM zu übernehmen, anzuzeigen und grafisch darzustellen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzung ==&lt;br /&gt;
Die Anbindung des Dimplex Wärmepumpenmanager an FHEM erfolgt mittels NWPM-Erweiterung und der aktuellen FHEM Installation. Weiterhin werden die zur Verfügung stehenden Module:&lt;br /&gt;
&lt;br /&gt;
* 36_ModbusTCPServer.pm &lt;br /&gt;
* 37_ModbusCoil.pm&lt;br /&gt;
* 37_ModbusRegister.pm&lt;br /&gt;
&lt;br /&gt;
genutzt. Getestet wurde der Zugriff auf einem BeagleBone Black mit der [[BeagleBone Black|hier beschriebenen]] Debian Installation.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Die oben aufgeführten Module sind notwendig und müssen nachinstalliert werden. Zum Zeitpunkt der Erstellung dieser Dokumentation (31.1.2015) sind diese noch nicht offiziell in FHEM enthalten und werden auch nicht mittels Update verteilt. Die Module werden mit dem Befehl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update all https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mb/controls_modbus.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
über die FHEM Befehlszeile installiert und anschließend&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reload 36_ModbusTCPServer.pm &lt;br /&gt;
reload 37_ModbusCoil.pm&lt;br /&gt;
reload 37_ModbusRegister.pm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
mit einem Reload geladen.&lt;br /&gt;
== Benutzung == &lt;br /&gt;
=== Anlegen der ModbusTCPServer Verbindung ===&lt;br /&gt;
Wie im nachfolgenden angegeben muss zunächst eine ModbusTCPServer Verbindung hergestellt werden. Die angegebene IP-Adresse muss durch die IP-Adresse der Wärmepumpe ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
########################################################&lt;br /&gt;
##  ModbusTCPServer definieren&lt;br /&gt;
########################################################&lt;br /&gt;
define HeatPumpServer ModbusTCPServer 192.168.1.150&lt;br /&gt;
attr HeatPumpServer verbose 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ein erfolgreicher Verbindungsaufbau wird mit einem „ok“ im State gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
=== Modbus-Register/Coil Adressen definieren ===&lt;br /&gt;
Im nachfolgendem Beispiel wird anhand der Außentemperatur die Adressdefinition erklärt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_outdoor_temperature ModbusRegister 0 1&lt;br /&gt;
  attr dim_outdoor_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_outdoor_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_outdoor_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_outdoor_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_outdoor_temperature plcDataType INT&lt;br /&gt;
  attr dim_outdoor_temperature registerType Holding&lt;br /&gt;
  attr dim_outdoor_temperature room Dimplex&lt;br /&gt;
  attr dim_outdoor_temperature stateAlias temperature&lt;br /&gt;
  attr dim_outdoor_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_outdoor_temperature updateInterval 00:10:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erklärung:&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Erläuterungen zur Adressdefinition&lt;br /&gt;
|-&lt;br /&gt;
! Attribut !! Erläuterungen&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 0 Device Adresse, in der Regel bei ModbusTCP immer 0&lt;br /&gt;
|-&lt;br /&gt;
| ModbusRegister 0 1 || 1 Register Adresse, wird unter www.dimplex.de/wiki → ModbusTCP → Spalten IP zur Verfügung gestellt&lt;br /&gt;
|-&lt;br /&gt;
| IODev              || Verwendeter und zuvor angelegter ModbusTCPServer&lt;br /&gt;
|-&lt;br /&gt;
| conversion         || eine gegebenenfalls notwendige Konvertierung des übermittelten Values&lt;br /&gt;
|-&lt;br /&gt;
| PlcDataType        || Ermögliche automatische Interpretation der ankommenden Daten&lt;br /&gt;
|-&lt;br /&gt;
| stateAlias         || es wird ein zusätzliches Reading erzeugt, um zum Beispiel das Statistic-Modul nutzen zu können, stateAlias ist eine echte Kopie von &amp;quot;state&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| updateInterval    || Intervall des Abfragezyklus (z.B. 00:10:00 Minuten)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Betriebsdaten ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Betriebsdaten. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_outdoor_temperature     || Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_flow_temperature        || Vorlauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_return_temperature      || Rücklauftemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_returnset_temperature   || Rücklaufsolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_room_temperature        || Raumtemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhw_temperature         || Warmwassertemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwset_temperature      || Warmwassersolltemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_brine_temperature       || Soletemperatur&lt;br /&gt;
|-&lt;br /&gt;
| dim_high_pressure           || Hochdruck&lt;br /&gt;
|-&lt;br /&gt;
| dim_low_pressure           || Niederdruck&lt;br /&gt;
|}&lt;br /&gt;
Register Warmwassertemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw_temperature ModbusRegister 0 3&lt;br /&gt;
  attr dim_dhw_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_dhw_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_dhw_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw_temperature plcDataType INT&lt;br /&gt;
  attr dim_dhw_temperature registerType Holding&lt;br /&gt;
  attr dim_dhw_temperature room Dimplex&lt;br /&gt;
  attr dim_dhw_temperature stateAlias temperature&lt;br /&gt;
  attr dim_dhw_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_dhw_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Vorlauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flow_temperature ModbusRegister 0 5&lt;br /&gt;
  attr dim_flow_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_flow_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_flow_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_flow_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_flow_temperature plcDataType INT&lt;br /&gt;
  attr dim_flow_temperature registerType Holding&lt;br /&gt;
  attr dim_flow_temperature room Dimplex&lt;br /&gt;
  attr dim_flow_temperature stateAlias temperature&lt;br /&gt;
  attr dim_flow_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_flow_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklauftemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_return_temperature ModbusRegister 0 2&lt;br /&gt;
  attr dim_return_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_return_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_return_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_return_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_return_temperature plcDataType INT&lt;br /&gt;
  attr dim_return_temperature registerType Holding&lt;br /&gt;
  attr dim_return_temperature room Dimplex&lt;br /&gt;
  attr dim_return_temperature stateAlias temperature&lt;br /&gt;
  attr dim_return_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_return_temperature updateInterval 00:01:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Rücklaufsolltemperatur definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_returnset_temperature ModbusRegister 0 53&lt;br /&gt;
  attr dim_returnset_temperature IODev HeatPumpServer&lt;br /&gt;
  attr dim_returnset_temperature conversion 0.1:0&lt;br /&gt;
  attr dim_returnset_temperature event-min-interval .*:900&lt;br /&gt;
  attr dim_returnset_temperature event-on-change-reading .*&lt;br /&gt;
  attr dim_returnset_temperature plcDataType INT&lt;br /&gt;
  attr dim_returnset_temperature registerType Holding&lt;br /&gt;
  attr dim_returnset_temperature room Dimplex&lt;br /&gt;
  attr dim_returnset_temperature stateAlias temperature&lt;br /&gt;
  attr dim_returnset_temperature stateFormat {sprintf(&amp;quot;%0.1f&amp;quot;, ReadingsVal($name,&amp;quot;state&amp;quot;,0))}&lt;br /&gt;
  attr dim_returnset_temperature updateInterval 00:05:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Betriebsdaten ====&lt;br /&gt;
Anlegen eines täglichen Logfile der Betriebsdaten.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_temperature FileLog ./log/filelog_dim_temperature-%W-%d.log&lt;br /&gt;
                                      dim_.*._temperature:temperature:.*|dim_.*._pressure:pressure:.*&lt;br /&gt;
  attr filelog_dim_temperature room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Statistiken ====&lt;br /&gt;
Folgender Code legt die Statistiken der Betriebsdaten an&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_statistics statistics dim_.*._temperature|dim_.*._pressure&lt;br /&gt;
  attr dim_statistics dayChangeTime 1&lt;br /&gt;
  attr dim_statistics deltaReadings temperature,pressure&lt;br /&gt;
  attr dim_statistics minAvgMaxReadings temperature,pressure&lt;br /&gt;
  attr dim_statistics room Dimplex&lt;br /&gt;
  attr dim_statistics tendencyReadings temperature,pressure&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustände ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Zustände. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_output      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_output      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_ output      || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_output || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_output  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_output         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_output   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_output    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Coil Verdichter und passenden HourCounter für Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_output ModbusCoil 0 41&lt;br /&gt;
  attr dim_compressor_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_compressor_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_compressor_output event-min-interval .*:900&lt;br /&gt;
  attr dim_compressor_output event-on-change-reading .*&lt;br /&gt;
  attr dim_compressor_output room Dimplex&lt;br /&gt;
  attr dim_compressor_output source Coil&lt;br /&gt;
  attr dim_compressor_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_compressor_output HourCounter dim_compressor_output:on dim_compressor_output:off&lt;br /&gt;
   attr hourcounter_compressor_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
   attr hourcounter_compressor_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Ventilator definieren und passenden HourCounter für Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_output ModbusCoil 0 43&lt;br /&gt;
  attr dim_ventilator_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_ventilator_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_ventilator_output event-min-interval .*:900&lt;br /&gt;
  attr dim_ventilator_output event-on-change-reading .*&lt;br /&gt;
  attr dim_ventilator_output room Dimplex&lt;br /&gt;
  attr dim_ventilator_output source Coil&lt;br /&gt;
  attr dim_ventilator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_ventilator_output HourCounter dim_ventilator_output:on dim_ventilator_output:off&lt;br /&gt;
  attr hourcounter_ventilator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_ventilator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil 2.Wärmeerzeuger definieren und passenden HourCounter für 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_output ModbusCoil 0 44&lt;br /&gt;
  attr dim_2heatgenerator_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_2heatgenerator_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_2heatgenerator_output event-min-interval .*:900&lt;br /&gt;
  attr dim_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
  attr dim_2heatgenerator_output room Dimplex&lt;br /&gt;
  attr dim_2heatgenerator_output source Coil&lt;br /&gt;
  attr dim_2heatgenerator_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_2heatgenerator_output HourCounter dim_2heatgenerator_output:on dim_2heatgenerator_output:off&lt;br /&gt;
  attr hourcounter_2heatgenerator_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_2heatgenerator_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Heizungsumwälzpumpe M13 definieren und passenden HourCounter für Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_output ModbusCoil 0 45&lt;br /&gt;
  attr dim_circulationpump_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_circulationpump_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_circulationpump_output event-min-interval .*:900&lt;br /&gt;
  attr dim_circulationpump_output event-on-change-reading .*&lt;br /&gt;
  attr dim_circulationpump_output room Dimplex&lt;br /&gt;
  attr dim_circulationpump_output source Coil&lt;br /&gt;
  attr dim_circulationpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_circulationpump_output HourCounter dim_circulationpump_output:on dim_circulationpump_output:off&lt;br /&gt;
  attr hourcounter_circulationpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_circulationpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Warmwasserpumpe M18 definieren und passenden HourCounter für Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_output ModbusCoil 0 46&lt;br /&gt;
  attr dim_dhwpump_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhwpump_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_dhwpump_output event-min-interval .*:900&lt;br /&gt;
  attr dim_dhwpump_output event-on-change-reading .*&lt;br /&gt;
  attr dim_dhwpump_output room Dimplex&lt;br /&gt;
  attr dim_dhwpump_output source Coil&lt;br /&gt;
  attr dim_dhwpump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
define hourcounter_dhwpump_output HourCounter dim_dhwpump_output:on dim_dhwpump_output:off&lt;br /&gt;
  attr hourcounter_dhwpump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_dhwpump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Zusatzpumpe M16 definieren und Passenden HourCounter für Zusatzpumpe M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_auxiliarypump_output ModbusCoil 0 49&lt;br /&gt;
  attr dim_auxiliarypump_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_auxiliarypump_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_auxiliarypump_output event-min-interval .*:900&lt;br /&gt;
  attr dim_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
  attr dim_auxiliarypump_output room Dimplex&lt;br /&gt;
  attr dim_auxiliarypump_output source Coil&lt;br /&gt;
  attr dim_auxiliarypump_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_auxiliarypump_output HourCounter dim_auxiliarypump_output:on dim_auxiliarypump_output:off&lt;br /&gt;
   attr hourcounter_auxiliarypump_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
   attr hourcounter_auxiliarypump_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;Coil Flanschheizung definieren und passenden HourCounter für Flanschheizung M16 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_output ModbusCoil 0 50&lt;br /&gt;
  attr dim_flangeheater_output IODev HeatPumpServer&lt;br /&gt;
  attr dim_flangeheater_output disableRegisterMapping 1&lt;br /&gt;
  attr dim_flangeheater_output event-min-interval .*:900&lt;br /&gt;
  attr dim_flangeheater_output event-on-change-reading .*&lt;br /&gt;
  attr dim_flangeheater_output room Dimplex&lt;br /&gt;
  attr dim_flangeheater_output source Coil&lt;br /&gt;
  attr dim_flangeheater_output updateInterval 00:01:00&lt;br /&gt;
&lt;br /&gt;
define hourcounter_flangeheater_output HourCounter dim_flangeheater_output:on dim_flangeheater_output:off&lt;br /&gt;
  attr hourcounter_flangeheater_output event-min-interval tick.*:0,.*:3600&lt;br /&gt;
  attr hourcounter_flangeheater_output event-on-change-reading .*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Zustände ====&lt;br /&gt;
Anlegen eines wöchentlichen Logfile der Zustände:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_output_week FileLog ./log/filelog_dim_output_week-%W.log dim_.*._output.*&lt;br /&gt;
  attr filelog_dim_output_week room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Historie ===&lt;br /&gt;
Vorschlag der Namensvergabe für die Historie. Eine sinnvolle Namensvergabe erleichtert später das Anlegen weiterer Definitionen von zum Beispiel Logfiles, Statistiken oder auch [[readingsGroup]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| dim_compressor_history      || Verdichter&lt;br /&gt;
|-&lt;br /&gt;
| dim_ventilator_history      || Ventilator&lt;br /&gt;
|-&lt;br /&gt;
| dim_brinepump_history       || Solepumpe&lt;br /&gt;
|-&lt;br /&gt;
| dim_circulationpump_history || Heizungsumwälzpumpe M13&lt;br /&gt;
|-&lt;br /&gt;
| dim_2heatgenerator_history  || 2.Wärmeerzeuger&lt;br /&gt;
|-&lt;br /&gt;
| dim_dhwpump_history         || Warmwasserpumpe M18&lt;br /&gt;
|-&lt;br /&gt;
| dim_auxiliarypump_history   || Zusatzpumpe M16&lt;br /&gt;
|-&lt;br /&gt;
| dim_flangeheater_history    || Flanschheizung&lt;br /&gt;
|}&lt;br /&gt;
Register Historie Verdichter definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_compressor_history ModbusRegister 0 72&lt;br /&gt;
  attr dim_compressor_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_compressor_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_compressor_history event-on-change-reading .*&lt;br /&gt;
  attr dim_compressor_history plcDataType INT&lt;br /&gt;
  attr dim_compressor_history registerType Holding&lt;br /&gt;
  attr dim_compressor_history room Dimplex&lt;br /&gt;
  attr dim_compressor_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Ventilator definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_ventilator_history ModbusRegister 0 74&lt;br /&gt;
  attr dim_ventilator_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_ventilator_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_ventilator_history event-on-change-reading .*&lt;br /&gt;
  attr dim_ventilator_history plcDataType INT&lt;br /&gt;
  attr dim_ventilator_history registerType Holding&lt;br /&gt;
  attr dim_ventilator_history room Dimplex&lt;br /&gt;
  attr dim_ventilator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie 2.Wärmeerzeuger definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_2heatgenerator_history ModbusRegister 0 75&lt;br /&gt;
  attr dim_2heatgenerator_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_2heatgenerator_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_2heatgenerator_history event-on-change-reading .*&lt;br /&gt;
  attr dim_2heatgenerator_history plcDataType INT&lt;br /&gt;
  attr dim_2heatgenerator_history registerType Holding&lt;br /&gt;
  attr dim_2heatgenerator_history room Dimplex&lt;br /&gt;
  attr dim_2heatgenerator_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Heizungsumwälzpumpe M13 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_circulationpump_history ModbusRegister 0 76&lt;br /&gt;
  attr dim_circulationpump_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_circulationpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_circulationpump_history event-on-change-reading .*&lt;br /&gt;
  attr dim_circulationpump_history plcDataType INT&lt;br /&gt;
  attr dim_circulationpump_history registerType Holding&lt;br /&gt;
  attr dim_circulationpump_history room Dimplex&lt;br /&gt;
  attr dim_circulationpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Warmwasserpumpe M18 definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhwpump_history ModbusRegister 0 77&lt;br /&gt;
  attr dim_dhwpump_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhwpump_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_dhwpump_history event-on-change-reading .*&lt;br /&gt;
  attr dim_dhwpump_history plcDataType INT&lt;br /&gt;
  attr dim_dhwpump_history registerType Holding&lt;br /&gt;
  attr dim_dhwpump_history room Dimplex&lt;br /&gt;
  attr dim_dhwpump_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Historie Flanschheizung definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_flangeheater_history ModbusRegister 0 78&lt;br /&gt;
  attr dim_flangeheater_history IODev HeatPumpServer&lt;br /&gt;
  attr dim_flangeheater_history alignUpdateInterval 00:01:00&lt;br /&gt;
  attr dim_flangeheater_history event-on-change-reading .*&lt;br /&gt;
  attr dim_flangeheater_history plcDataType INT&lt;br /&gt;
  attr dim_flangeheater_history registerType Holding&lt;br /&gt;
  attr dim_flangeheater_history room Dimplex&lt;br /&gt;
  attr dim_flangeheater_history updateInterval 01:00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Logfile Historie ====&lt;br /&gt;
Anlegen eines monatlichen Logfile für die Historischen Daten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_history_month FileLog ./log/filelog_dim_history_month-%m.log dim_.*._history.*&lt;br /&gt;
  attr filelog_dim_history_month room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Wärmemengen ====&lt;br /&gt;
Laut Definition aus dem [http://www.dimplex.de/wiki Dimplex-Wiki] werden die Wärmemengen für Heizen, Warmwasser und Schwimmbad aus 3 Register-Adressen zusammengesetzt. Im Nachfolgenden Code-Beispiel wird dies entsprechend dargestellt. Dabei wird jeweils im ersten Register ein neues userReading mit der Darstellung der Gesamtwärmemenge angelegt.&lt;br /&gt;
&lt;br /&gt;
Wärmemenge Heizen definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_heating1_thermalenergy ModbusRegister 0 5096&lt;br /&gt;
  attr dim_heating1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_heating1_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_heating1_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_heating1_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_heating1_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_heating1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
  attr dim_heating1_thermalenergy userReadings heatingthermalenergy {\&lt;br /&gt;
                                    ((ReadingsVal(&amp;quot;dim_heating3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                     (ReadingsVal(&amp;quot;dim_heating2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                     (ReadingsVal(&amp;quot;dim_heating1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_heating2_thermalenergy ModbusRegister 0 5097&lt;br /&gt;
  attr dim_heating2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_heating2_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_heating2_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_heating2_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_heating2_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_heating2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_heating3_thermalenergy ModbusRegister 0 5098&lt;br /&gt;
  attr dim_heating3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_heating3_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_heating3_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_heating3_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_heating3_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_heating3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;Wärmemenge Warmwasser definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_dhw1_thermalenergy ModbusRegister 0 5099&lt;br /&gt;
  attr dim_dhw1_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw1_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw1_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_dhw1_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_dhw1_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_dhw1_thermalenergy updateInterval 00:15:00&lt;br /&gt;
  attr dim_dhw1_thermalenergy userReadings dhwthermalenergy {\&lt;br /&gt;
                                ((ReadingsVal(&amp;quot;dim_dhw3_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                 (ReadingsVal(&amp;quot;dim_dhw2_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                 (ReadingsVal(&amp;quot;dim_dhw1_thermalenergy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_dhw2_thermalenergy ModbusRegister 0 5100&lt;br /&gt;
  attr dim_dhw2_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw2_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw2_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_dhw2_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_dhw2_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_dhw2_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_dhw3_thermalenergy ModbusRegister 0 5101&lt;br /&gt;
  attr dim_dhw3_thermalenergy IODev HeatPumpServer&lt;br /&gt;
  attr dim_dhw3_thermalenergy event-on-change-reading .*&lt;br /&gt;
  attr dim_dhw3_thermalenergy plcDataType INT&lt;br /&gt;
  attr dim_dhw3_thermalenergy registerType Holding&lt;br /&gt;
  attr dim_dhw3_thermalenergy room Dimplex&lt;br /&gt;
  attr dim_dhw3_thermalenergy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Umweltenergie ====&lt;br /&gt;
Als Umweltenergie wird die zugeführte Kälteenergie aus der Umwelt (Luft/Erdreich) bezeichnet. Das Auslesen dieser Werte über die Schnittstelle ist erst ab einem neueren Softwarestand möglich. Die Differenz der gesamten Wärmemenge und der Umweltenergie entspricht in etwa der Energie des Verdichters.&lt;br /&gt;
&lt;br /&gt;
Umweltenergie/entzogene Kälteenergie definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_environment1_energy ModbusRegister 0 5127&lt;br /&gt;
  attr dim_environment1_energy IODev HeatPumpServer&lt;br /&gt;
  attr dim_environment1_energy event-on-change-reading .*&lt;br /&gt;
  attr dim_environment1_energy plcDataType INT&lt;br /&gt;
  attr dim_environment1_energy registerType Holding&lt;br /&gt;
  attr dim_environment1_energy room Dimplex&lt;br /&gt;
  attr dim_environment1_energy updateInterval 00:15:00&lt;br /&gt;
  attr dim_environment1_energy userReadings environmentenergy {\&lt;br /&gt;
                                 ((ReadingsVal(&amp;quot;dim_environment3_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*100000000)+\&lt;br /&gt;
                                  (ReadingsVal(&amp;quot;dim_environment2_energy&amp;quot;,&amp;quot;state&amp;quot;,0)*10000)+\&lt;br /&gt;
                                  (ReadingsVal(&amp;quot;dim_environment1_energy&amp;quot;,&amp;quot;state&amp;quot;,0)))}&lt;br /&gt;
&lt;br /&gt;
define dim_environment2_energy ModbusRegister 0 5128&lt;br /&gt;
  attr dim_environment2_energy IODev HeatPumpServer&lt;br /&gt;
  attr dim_environment2_energy event-on-change-reading .*&lt;br /&gt;
  attr dim_environment2_energy plcDataType INT&lt;br /&gt;
  attr dim_environment2_energy registerType Holding&lt;br /&gt;
  attr dim_environment2_energy room Dimplex&lt;br /&gt;
  attr dim_environment2_energy updateInterval 00:15:00&lt;br /&gt;
&lt;br /&gt;
define dim_environment3_energy ModbusRegister 0 5129&lt;br /&gt;
  attr dim_environment3_energy IODev HeatPumpServer&lt;br /&gt;
  attr dim_environment3_energy event-on-change-reading .*&lt;br /&gt;
  attr dim_environment3_energy plcDataType INT&lt;br /&gt;
  attr dim_environment3_energy registerType Holding&lt;br /&gt;
  attr dim_environment3_energy room Dimplex&lt;br /&gt;
  attr dim_environment3_energy updateInterval 00:15:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Logfile Wärmemengen ====&lt;br /&gt;
Anlegen eines jährlichen Logfile der Wärmemengen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define filelog_dim_thermalenergy_year FileLog ./log/filelog_dim_thermalenergy_year-%y.log&lt;br /&gt;
                                              dim_heating1_thermalenergy:heatingthermalenergy:.*|&lt;br /&gt;
                                              dim_dhw1_thermalenergy:dhwthermalenergy:.*|&lt;br /&gt;
                                              dim_heating1_thermalenergy:heatingthermalenergy:.*&lt;br /&gt;
  attr filelog_dim_thermalenergy_year room Dimplex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Meldungen ===&lt;br /&gt;
[[Bild:dimplex_rh_status_heatpump.jpg|thumb|right|Beispiel Meldungen]]&lt;br /&gt;
Eine sinnvolle Anzeige sind die Meldungen (Status, Sperre, Störung) der Wärmepumpe. Im nachfolgenden Beispiel werden die Meldungen mit dem Hilfsmodul [[readingsHistory]] dargestellt. Die Definitionen der Meldungen beziehen sich auf die im [http://www.dimplex.de/wiki Dimplex-Wiki] beschriebene L-Software. Bei abweichenden Softwareständen müssen die Register sowie die Texte angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Register Statusmeldung definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_status_heatpump ModbusRegister 0 103&lt;br /&gt;
  attr dim_status_heatpump IODev HeatPumpServer&lt;br /&gt;
  attr dim_status_heatpump event-on-change-reading .*&lt;br /&gt;
  attr dim_status_heatpump plcDataType INT&lt;br /&gt;
  attr dim_status_heatpump registerType Holding&lt;br /&gt;
  attr dim_status_heatpump room Dimplex&lt;br /&gt;
  attr dim_status_heatpump updateInterval 00:00:10&lt;br /&gt;
  attr dim_status_heatpump userReadings Status {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 1) ? &amp;quot;Aus&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 4) ? &amp;quot;Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Abtauen&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Durchflussüberwachnung&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Sperrmeldunge definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_block_heatpump ModbusRegister 0 104&lt;br /&gt;
  attr dim_block_heatpump IODev HeatPumpServer&lt;br /&gt;
  attr dim_block_heatpump event-on-change-reading .*&lt;br /&gt;
  attr dim_block_heatpump plcDataType INT&lt;br /&gt;
  attr dim_block_heatpump registerType Holding&lt;br /&gt;
  attr dim_block_heatpump room Dimplex&lt;br /&gt;
  attr dim_block_heatpump updateInterval 00:00:10&lt;br /&gt;
  attr dim_block_heatpump userReadings Sperre {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 7) ? &amp;quot;Systemkontrolle&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 9) ? &amp;quot;Pumpenvorlauf&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 10) ? &amp;quot;Mindeststandzeit&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 11) ? &amp;quot;Netzbelastung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 12) ? &amp;quot;Schaltspielsperre&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;EVU&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;Register Störmeldungen definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define dim_fault_heatpump ModbusRegister 0 105&lt;br /&gt;
  attr dim_fault_heatpump IODev HeatPumpServer&lt;br /&gt;
  attr dim_fault_heatpump event-on-change-reading .*&lt;br /&gt;
  attr dim_fault_heatpump plcDataType INT&lt;br /&gt;
  attr dim_fault_heatpump registerType Holding&lt;br /&gt;
  attr dim_fault_heatpump room Dimplex&lt;br /&gt;
  attr dim_fault_heatpump updateInterval 00:01:00&lt;br /&gt;
  attr dim_fault_heatpump userReadings Störung {\&lt;br /&gt;
((ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 0) ? &amp;quot;&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 6) ? &amp;quot;Elektronisches Ex.Ventil&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 15) ? &amp;quot;Sensorik&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 19) ? &amp;quot;!Primärkreis&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 22) ? &amp;quot;!Warmwasser&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 23) ? &amp;quot;!Last Verdichter&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 24) ? &amp;quot;!Codierung&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 25) ? &amp;quot;!Niederdruck&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 26) ? &amp;quot;!Frostschutz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 29) ? &amp;quot;!Temperatur Differenz&amp;quot;:\&lt;br /&gt;
(ReadingsVal($name,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) == 31) ? &amp;quot;!Durchfluss&amp;quot;:&amp;quot;&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Anzeige der Meldungen ====&lt;br /&gt;
readingsHistory definieren:&amp;lt;pre&amp;gt;&lt;br /&gt;
define rh_dim_status_heatpump readingsHistory dim_status_heatpump:Status dim_block_heatpump:Sperre dim_fault_heatpump:Störung&lt;br /&gt;
  attr rh_dim_status_heatpump alias Status&lt;br /&gt;
  attr rh_dim_status_heatpump mapping {&#039;dim_status_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_block_heatpump&#039; =&amp;gt; &#039;&#039;, &#039;dim_fault_heatpump&#039; =&amp;gt; &#039;&#039;}&lt;br /&gt;
  attr rh_dim_status_heatpump nohtml 1&lt;br /&gt;
  attr rh_dim_status_heatpump room Dimplex&lt;br /&gt;
  attr rh_dim_status_heatpump rows 20&lt;br /&gt;
  attr rh_dim_status_heatpump timestampFormat %b %a %R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plotbeispiel ==&lt;br /&gt;
=== Temperaturen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:40:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set ytics nomirror&lt;br /&gt;
set y2tics &lt;br /&gt;
set grid ytics y2tics&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Temperatur (°C)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_outdoor_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_room_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_return_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_returnset_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_dhw_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_flow_temperature.*::&lt;br /&gt;
#filelog_dim_temperature_week 4:dim_brine_temperature.*::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;AT&#039; ls l7 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RT&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RL&#039; ls l2 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;RLS&#039; ls l3 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;WWT&#039; ls l4 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;VLT&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;SOL&#039; ls l6 lw 1 with lines&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgänge ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2015-05-11 21:45:00&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
set ytics (&amp;quot;An&amp;quot; -1, &amp;quot;Aus&amp;quot; -2, &amp;quot;An&amp;quot; -5, &amp;quot;Aus&amp;quot; -6, &amp;quot;An&amp;quot; -9, &amp;quot;Aus&amp;quot; -10, &amp;quot;An&amp;quot; -13, &amp;quot;Aus&amp;quot; -14)&lt;br /&gt;
set y2tics (&amp;quot;An&amp;quot; 1, &amp;quot;Aus&amp;quot; 0, &amp;quot;An&amp;quot; -3, &amp;quot;Aus&amp;quot; -4, &amp;quot;An&amp;quot; -7, &amp;quot;Aus&amp;quot; -8, &amp;quot;An&amp;quot; -11, &amp;quot;Aus&amp;quot; -12)&lt;br /&gt;
set grid&lt;br /&gt;
set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Digital&amp;quot;&lt;br /&gt;
set yrange [-16:2]&lt;br /&gt;
set y2range [-16:2]&lt;br /&gt;
&lt;br /&gt;
#FileLog 3:dim_compressor_output.*::$fld[2]=~&amp;quot;on&amp;quot;?1:0&lt;br /&gt;
#FileLog 3:dim_ventilator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-1:-2&lt;br /&gt;
#FileLog 3:dim_2heatgenerator_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-3:-4&lt;br /&gt;
#FileLog 3:dim_circulationpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-5:-6&lt;br /&gt;
#FileLog 3:dim_dhwpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-7:-8&lt;br /&gt;
#FileLog 3:dim_auxiliarypump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-9:-10&lt;br /&gt;
#FileLog 3:dim_solarpump_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-11:-12&lt;br /&gt;
#FileLog 3:dim_flangeheater_output.*::$fld[2]=~&amp;quot;on&amp;quot;?-13:-14&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Vd&#039; ls l7 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Ve&#039; ls l6 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;2.We&#039; ls l5 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Hub&#039; ls l4 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Wup&#039; ls l3 lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Zup&#039; ls l0 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Sol&#039; ls l2 lw 1.5 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Flh&#039; ls l7 lw 1.5 with steps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:dimplex_hp_graph.jpg|thumb|right|Plotbeispiel]]&lt;br /&gt;
Im nebenstehenden Plotbeispiel werde die Temperaturen (Analogwerte) sowie die Ausgänge (Digitalwerte) dargestellt. Im einzelnen sind die Kurven für die&lt;br /&gt;
&lt;br /&gt;
* Aussen- (AT)&lt;br /&gt;
* Raum- (RT)&lt;br /&gt;
* Rücklauf- (RL)&lt;br /&gt;
* Rücklaufsoll- (RLS)&lt;br /&gt;
* Warmwasser- (WWT) und &lt;br /&gt;
* Vorlauftemperatur (VLT) &lt;br /&gt;
&lt;br /&gt;
sowie die Ausgänge für&lt;br /&gt;
&lt;br /&gt;
* Verdichter 1 (Vd)&lt;br /&gt;
* Ventilator (Ve)&lt;br /&gt;
* 2.Wärmeerzeuger (2We)&lt;br /&gt;
* Heizungsumwälzpumpe (Hup)&lt;br /&gt;
* Warmwasserumwälzpumpe (Wup) und&lt;br /&gt;
* Zusatzumwälzpumpe (Zup)&lt;br /&gt;
&lt;br /&gt;
enthalten.&lt;br /&gt;
&lt;br /&gt;
= Kontakt =&lt;br /&gt;
Weitere Fragen, Wünsche und Anregungen bitte im entsprechenden {{Link2Forum|Topic=33086|LinkText=Forenthread zum Wiki-Artikel &amp;quot;Dimplex Wärmepumpenmanager&amp;quot;}} zur Diskussion stellen.&lt;br /&gt;
&lt;br /&gt;
Offene Punkte:&lt;br /&gt;
- Darstellung der Werte in einer readingsGroup&lt;br /&gt;
- Zugriff auf Zeitfunktionen mit Lesen und Schreiben&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ble2mqtt&amp;diff=40034</id>
		<title>Ble2mqtt</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ble2mqtt&amp;diff=40034"/>
		<updated>2025-02-28T18:20:58Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Einbindung in FHEM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:ble2mqtt}} &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anwesenheitserkennung von Bluetooth-Geräten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModFTopic=127173&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModTechName=ble2mqtt&lt;br /&gt;
|ModOwner={{Link2FU|5068|PatrickR}}&lt;br /&gt;
}}&lt;br /&gt;
[[ble2mqtt]] ist ein Script, das den Anwesenheitsstatus eines oder mehrerer Bluetooth Low Energy Geräte überprüfen und das Ergebnis an einen MQTT Broker schicken kann.&lt;br /&gt;
&lt;br /&gt;
Es verwendet dazu die Linux Tools &#039;&#039;bluetoothctl&#039;&#039; und &#039;&#039;gatttool&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
ble2mqtt ist in Perl geschrieben und wurde von {{Link2FU|5068|PatrickR}} erstellt. Weitere Informationen finden sich in diesem {{Link2Forum|Topic=127173|LinkText=Forums-Thema}}. Fragen dazu bitte in den Bereich {{Link2Forum|Area=Unterstützende Dienste}}.&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
* Debian od. Raspberry Pi OS&lt;br /&gt;
* Bluetooth Empfänger&lt;br /&gt;
&lt;br /&gt;
==Parameter==&lt;br /&gt;
Beim Start von ble2mqtt können folgende Parameter angegeben werden:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter!!Beschreibung!!Standardwert!!Beispiel!!Optional&lt;br /&gt;
|-&lt;br /&gt;
| --mqttserver&lt;br /&gt;
|Die Adresse des MQTT Brokers inklusive Port&lt;br /&gt;
|&lt;br /&gt;
| --mqttserver mqtt.example.org:1883&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
| --mqttfingerprint&lt;br /&gt;
|Der Fingerprint des für die TLS-verschlüsselte Kommunikation mit dem MQTT Broker verwendeten Zertifikates&lt;br /&gt;
|&lt;br /&gt;
| --mqttfingerprint bfe5d244a821194230f1479fe2f8f7bbcd2a8cb8&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
| --mqtttopic&lt;br /&gt;
| An welches MQTT-Topic das Tool die Informationen schicken soll.&lt;br /&gt;
|ble2mqtt&lt;br /&gt;
| --mqtttopic ble2mqtt/Wohnzimmer&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
| --mqttuser&lt;br /&gt;
|Der Benutzernamen, unter dem die Verbindung zum Broker hergestellt werden soll&lt;br /&gt;
|&lt;br /&gt;
| --mqttuser ble2mqtt&lt;br /&gt;
|ja bzw. abhängig vom Broker&lt;br /&gt;
|-&lt;br /&gt;
| --mqttpass&lt;br /&gt;
|Das zum Benutzernamen gehörende Passwort&lt;br /&gt;
|&lt;br /&gt;
| --mqttpass verysecret3&lt;br /&gt;
|ja bzw. abhängig vom Broker&lt;br /&gt;
|-&lt;br /&gt;
| --retain&lt;br /&gt;
|Versendet die Nachrichten present und lastseen als retained.&lt;br /&gt;
|0&lt;br /&gt;
| --retain&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
| --daemonize&lt;br /&gt;
|Wenn ble2mqtt im Hintergrund (als Daemon) ausgeführt werden soll&lt;br /&gt;
|0&lt;br /&gt;
| --daemonize&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
| --loglevel&lt;br /&gt;
|Wie und was genau protokolliert werden soll. Mögliche Loglevel sind LOG_CRIT, LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO, LOG_DEBUG.&lt;br /&gt;
|LOG_INFO&lt;br /&gt;
| --loglevel LOG_ERR&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
| --logtarget&lt;br /&gt;
|Wohin gelogged werden soll. Mögliche Optionen sind &#039;&#039;syslog&#039;&#039; und &#039;&#039;stdout&#039;&#039;.&lt;br /&gt;
|syslog&lt;br /&gt;
| --logtarget stdout&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
| --absentinterval&lt;br /&gt;
|Anzahl an Sekunden, nach denen das Gerät als abwesend bezeichnet werden soll. Mindestwert ist 30.&lt;br /&gt;
|60&lt;br /&gt;
| --absentinterval 120&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
| --rssithreshold&lt;br /&gt;
|Ab welcher Abweichung des RSSI Wertes ein Update getriggert werden soll. Mindestwert ist 5.&lt;br /&gt;
|10&lt;br /&gt;
| --rssithreshold 8&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
| --watchdogthreshold&lt;br /&gt;
|Ab welchem Zeitraum in Sekunden nach Empfangen des letzten BT-Signals ble2mqtt neu gestartet werden soll. Mindestwert ist 30. Der Wert 0 bedeutet deaktiviert, also nie.&lt;br /&gt;
|0&lt;br /&gt;
| --watchdogthreshold 30&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
| --debug&lt;br /&gt;
|Kann nur gemeinsam mit --daemonize verwendet werden, um Logeinträge auf stdout auszugeben. Je höher die Nummer, desto mehr Output.&lt;br /&gt;
|0&lt;br /&gt;
| --daemonize --debug 4&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
| --mac&lt;br /&gt;
|Filtert mittels Regex nach MAC-Adressen der von ble2mqtt zu beachtenden BLE-Geräte. Alle anderen Geräte werden ignoriert.&lt;br /&gt;
|&lt;br /&gt;
| --mac &#039;(11:22:33:44:55:66|77:88:99:00:AA:BB)&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
| --batterymaxage&lt;br /&gt;
|Zeit in Stunden, nach denen ein Batterie-Wert als veraltet angesehen und aktualisiert wird. Der Wert 0 deaktiviert den Batterie-Check.&lt;br /&gt;
|48&lt;br /&gt;
| --batterymaxage 6&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
| --forcebattery&lt;br /&gt;
|Nur in Kombination mit --mac. Erzwingt einen Batterie-Check, auch wenn das battery-service am Gerät nicht erkannt wird.&lt;br /&gt;
|0&lt;br /&gt;
| --forcebattery&lt;br /&gt;
|ja&lt;br /&gt;
|}&lt;br /&gt;
===Beispiele===&lt;br /&gt;
* Broker verlangt Username/Passwort; es sollen keine Batterie-Werte ausgelesen werden&lt;br /&gt;
 ble2mqtt --mqttserver mqtt.example.org:1883 --mqttuser ble2mqtt --mqttpass verysecret3 --batterymaxage 0&lt;br /&gt;
&lt;br /&gt;
* Broker verlangt keine Authentifizierung; es soll nach zwei G-Tags gesucht werden; definiertes MQTT-Topic; Batteriewerte benötigt&lt;br /&gt;
 ble2mqtt --mqttserver mqtt.example.org:1883 --mqtttopic ble2mqtt/Wohnzimmer --mac &#039;(11:22:33:44:55:66|77:88:99:00:AA:BB)&#039;&lt;br /&gt;
&lt;br /&gt;
* Broker verlangt keine Authentifizierung; Geräte sollen nach 45s ohne Kontakt als abwesend angezeigt werden; MQTT Nachrichten sollen gespeichert bleiben&lt;br /&gt;
 ble2mqtt --mqttserver mqtt.example.org:1883 --absentinterval 45 --retain&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
Zur Installation muss das ble2mqtt-Script auf den Server kopiert werden und es müssen diverse Linux- und Perl-Pakete installiert werden. Das Script findet ihr im [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ble2mqttd Contrib-Verzeichnis] von FHEM.&lt;br /&gt;
&lt;br /&gt;
Zuerst das Script nach /usr/local/bin kopieren, um beim Aufruf in der Bash nicht immer den ganzen Pfad voranstellen zu müssen.&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo cp -a ble2mqttd /usr/local/bin/&amp;lt;/code&amp;gt;&lt;br /&gt;
Danach das Script noch als ausführbar markieren&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo chmod +x /usr/local/bin/ble2mqttd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Benötigte Linux Pakete===&lt;br /&gt;
Die benötigten Pakete können ganz einfach mit &#039;&#039;apt&#039;&#039; installiert werden. Dabei werden auch mögliche Abhängigkeiten automatisch installiert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install -y libssl-dev libio-socket-ssl-perl libreadonly-perl libtest-expect-perl libnet-ssleay-perl libnet-server-perl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Benötigte Perl-Module===&lt;br /&gt;
Es wird das Modul &#039;&#039;Net::MQTT::Simple&#039;&#039; (&#039;&#039;libnet-mqtt-simple-perl&#039;&#039;) benötigt. Das ist - Stand 08.11.2023 - noch nicht in den Stable-Repositories von Debian verfügbar und muss daher mittels &#039;&#039;cpan&#039;&#039; installiert werden. Voraussetzung dafür ist das Modul &#039;&#039;CPAN::DistnameInfo&#039;&#039;, welches zuerst installiert werden muss.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
 sudo cpan CPAN::DistnameInfo&lt;br /&gt;
 sudo cpan Net::MQTT::Simple&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Sobald &#039;&#039;libnet-mqtt-simple-perl&#039;&#039; verfügbar ist, kann dieses statt der Perl-Module wie ein normales Linux-Paket installiert werden.&lt;br /&gt;
&lt;br /&gt;
===Erster Test===&lt;br /&gt;
Mit einem einfachen Aufruf von &#039;&#039;&#039;ble2mqtt&#039;&#039;&#039; kann getestet werden, ob alle benötigten Module und Pakete vorhanden sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
 sudo /usr/local/bin/ble2mqttd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Erstellen einens Systemd-Daemons===&lt;br /&gt;
Damit &#039;&#039;&#039;ble2mqtt&#039;&#039;&#039; bei jedem Systemstart automatisch gestartet wird, muss ein Systemd-Daemon erstellt werden. Das wird gemacht, in dem eine neue Textdatei mit folgendem Inhalt angelegt und der Daemon dann aktiviert wird.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Das Kommando, mit welchen Parametern ble2mqtt gestartet wird, muss natürlich individuell angepasst werden!}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/systemd/system/ble2mqttd.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ble2mqttd&lt;br /&gt;
After=bluetooth.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
Restart=always&lt;br /&gt;
ExecStart=/usr/local/bin/ble2mqttd --mqttserver mqtt.example.com:1883 --mqtttopic ble2mqtt/wohnzimmer --mac &#039;(11:22:33:44:55:66|77:88:99:00:AA:BB)&#039; --absentinterval 30 --mqttuser &amp;lt;username&amp;gt; --mqttpass &amp;lt;password&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl enable ble2mqttd.service&lt;br /&gt;
 sudo systemctl start ble2mqttd.service&lt;br /&gt;
&lt;br /&gt;
==Einbindung in FHEM==&lt;br /&gt;
Da ble2mqtt alle Informationen an einen [[MQTT]]-Broker sendet, können diese Informationen ganz einfach als [[MQTT2_DEVICE]] in FHEM eingebunden werden. Wie dabei vorgegangen werden kann, unterscheidet sich je nach Anwendungsbereich und den eigenen Vorlieben.&lt;br /&gt;
&lt;br /&gt;
Als Beispiel sie hier die Anwesenheitserkennung mittels BT-Tags angeführt.&lt;br /&gt;
&lt;br /&gt;
===Anwesenheitserkennung mittels BT-Tags===&lt;br /&gt;
[[File:ble2mqtt.png|thumb|Readings eines Devices, dass mit diesem Code erstellt wurde]]&lt;br /&gt;
Der folgende Code geht davon aus, dass es mehrere ble2mqtt-Instanzen gibt und ein BT-Tag mit der MAC-Adresse AA:BB:CC:DD:EE:FF erkannt werden soll.&lt;br /&gt;
&lt;br /&gt;
Die verschiedenen ble2mqtt-Instanzen schicken ihre Nachrichten in unterschiedliche Topics.&lt;br /&gt;
Für jede Instanz ein eigenes Topic:&lt;br /&gt;
*ble2mqtt/wohnzimmer&lt;br /&gt;
*ble2mqtt/schlafzimmer&lt;br /&gt;
*ble2mqtt/kueche&lt;br /&gt;
Im Attribut &#039;&#039;devicetopic&#039;&#039; werden diese Topics dann gemeinsam ausgewertet. Das funktioniert, in dem der Name des Subtopics einfach durch den Regex-Ausdruck &#039;&#039;.*&#039;&#039; ersetzt wird.&lt;br /&gt;
&lt;br /&gt;
Bedeutet aber auch, dass die Informationen - wenn gewünscht - wieder in unterschiedliche Readings zerlegt werden müssen. Um z.B. schnell zu erkennen, in welchem Raum der BT-Tag gerade liegt. Das passiert hier z.B. bei den Nachrichten für &#039;&#039;rssi&#039;&#039; und &#039;&#039;presence&#039;&#039;. Daraus resultieren dann eigene Readings für jedes MQTT-Subtopic.&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;raumübergreifende&amp;quot; Reading &#039;&#039;presence&#039;&#039; wird anhand der des Alters in Sekunden der letzten lastseen-Nachricht gesteuert. Die lastseen-Nachricht wird immer gesendet, wenn der Scanvorgang von ble2mqtt das gewünschte Gerät findet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod ble2mqttGTag MQTT2_DEVICE FHEM&lt;br /&gt;
attr ble2mqttGTag devicetopic ble2mqtt/.*/AA_BB_CC_DD_EE_FF&lt;br /&gt;
attr ble2mqttGTag event-on-change-reading .*&lt;br /&gt;
attr ble2mqttGTag readingList ble2mqtt/.*/heartbeat:.* heartbeat\&lt;br /&gt;
$DEVICETOPIC/rssi:.* {my $room=(split m{[/]}x,$TOPIC)[1];; my $roomMax=$room;; my $rssiMax=$EVENT;; my @readings = grep { $_ =~ m{\Arssi_(?!$room).*}x } keys %{$defs{&amp;quot;$NAME&amp;quot;}-&amp;gt;{READINGS}};; for (@readings) {my $rssiTmp=ReadingsVal($NAME,$_,&#039;-100&#039;);; my $roomTmp=(split m{[_]}x,$_)[1];; if(($rssiMax gt $rssiTmp)&amp;amp;&amp;amp;(ReadingsVal($NAME,&amp;quot;presence_&amp;quot;.$roomTmp,&#039;absent&#039;) eq &#039;present&#039;)) {$rssiMax=$rssiTmp;; $roomMax=$roomTmp}};; {rssi=&amp;gt;$rssiMax,room=&amp;gt;$roomMax,&amp;quot;rssi_$room&amp;quot;=&amp;gt;$EVENT}}\&lt;br /&gt;
$DEVICETOPIC/lastseen:.* {lastseen=&amp;gt;strftime &amp;quot;%Y-%m-%d %H:%M:%S&amp;quot;, localtime($EVENT)}\&lt;br /&gt;
$DEVICETOPIC/present:.* {my $roomAct=(split m{[/]}x,$TOPIC)[1];; my $rssi=ReadingsVal($NAME,&amp;quot;rssi_&amp;quot;.$roomAct,&#039;-100&#039;);; my $presenceAct=$EVENT?&#039;present&#039;:&#039;absent&#039;;; my $room=$EVENT ? $roomAct:&#039;&#039;;; my @readings = grep { $_ =~ m{\Apresence_(?!$roomAct).*}x } keys %{$defs{$NAME}-&amp;gt;{READINGS}};; for (@readings) {if(ReadingsVal($NAME,$_,&#039;absent&#039;) eq &#039;present&#039;) {my $roomTmp=(split m{[_]}x,$_)[1];; my $rssiTmp=ReadingsVal($NAME,&amp;quot;rssi_&amp;quot;.$roomTmp,&#039;-100&#039;);; if($rssi gt $rssiTmp){$room=$roomTmp;; $rssi=$rssiTmp}}};; {&amp;quot;presence_$roomAct&amp;quot;=&amp;gt;$presenceAct, room=&amp;gt;$room}}\&lt;br /&gt;
ble2mqtt/.*/state:.* state\&lt;br /&gt;
$DEVICETOPIC/battery:.* batteryLevel&lt;br /&gt;
attr ble2mqttGTag userReadings presence {if (ReadingsAge($NAME,&amp;quot;lastseen&amp;quot;,0)&amp;gt;60) {return &amp;quot;absent&amp;quot;;;}else{return &amp;quot;present&amp;quot;;;}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Import_von_Code_Snippets|↑Raw Code]]&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis ist unter anderem ein Reading &#039;&#039;presence&#039;&#039; mit den Zuständen &#039;&#039;absent&#039;&#039; und &#039;&#039;present&#039;&#039;. Es kann somit ganz einfach als &amp;quot;presenceDevice&amp;quot; in einem [[ROOMMATE]]-Device verwendet werden:&lt;br /&gt;
 attr rr_Franz rr_presenceDevices ble2mqttGTag&lt;br /&gt;
&lt;br /&gt;
[[Category:MQTT]][[Category:Anwesenheitserkennung]][[Category:FHEM Utilities]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=39756</id>
		<title>Sonos2mqtt</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=39756"/>
		<updated>2024-12-21T14:02:14Z</updated>

		<summary type="html">&lt;p&gt;TomLee: kleine Rechtschreibkorrekturen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundeinrichtung ==&lt;br /&gt;
Die Grundeinrichtung ist bereits im Artikel [[MQTT2-Module - Praxisbeispiele#Sonos2Mqtt|MQTT2-Module - Praxisbeispiele]] beschrieben. Hier soll es um die praktische Verwendung und Erweiterung gehen. &lt;br /&gt;
&lt;br /&gt;
Für alle Erweiterungen wird versucht vorhandene Devices in FHEM zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Viele Dinge werden derzeit noch entwickelt und können frei gestaltet werden - der Vorteil von generischen FHEM Devices.&lt;br /&gt;
&lt;br /&gt;
== Tipps zur Verwendung ==&lt;br /&gt;
Die automatische Konfiguration setzt den alias entsprechend dem im Sonos vergeben Namen . Die langen MQTT2_RINCON_ Namen sind unhandlich und schlecht lesbar. Man kann Player mit einem devspec ansprechen, das simpelste ist:&lt;br /&gt;
:&amp;lt;code&amp;gt;set alias=Büro play&amp;lt;/code&amp;gt;&lt;br /&gt;
Oder alle Player&lt;br /&gt;
:&amp;lt;code&amp;gt;set model=sonos2mqtt_speaker leaveGroup&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration der Player ==&lt;br /&gt;
Mit dem Template sonos_bridge_comfort wird aus dem contrib Ordner eine Datei 99_sonos2mqttUtils.pm nachgeladen und aktiviert. Darin befindet sich der wesentliche Code, die sonos2mqtt Geräte selbst enthalten nur rudimentäre Aufrufe. &lt;br /&gt;
&lt;br /&gt;
Selbstverständlich kann man diese Datei jederzeit selbst gestalten (FHEM Menu:Edit Files) aber man sollte beachten, dass eine erneute Anwendung des Templates die Datei überschreibt.&lt;br /&gt;
&lt;br /&gt;
Man kann auch jederzeit diese Datei aus dem SVN neu laden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{ Svn_GetFile(&amp;quot;contrib/AttrTemplate/99_sonos2mqttUtils.pm&amp;quot;, &amp;quot;FHEM/99_sonos2mqttUtils.pm&amp;quot;, sub(){ CommandReload(undef, &amp;quot;99_sonos2mqttUtils&amp;quot;) }) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Hauptroutine ist sonos2mqtt die mit zwei Parametern aufgerufen wird. &amp;lt;code&amp;gt;{sonos2mqtt($NAME,$EVENT)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Optik des Players wird mit der Routine &amp;lt;code&amp;gt;sonos2mqtt_devStateIcon&amp;lt;/code&amp;gt; bestimmt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Player mittels &amp;lt;code&amp;gt;attr a:model=sonos2mqtt_speaker webCmd volume&amp;lt;/code&amp;gt; mit einem Slider in der Übersicht ausstatten.&lt;br /&gt;
&lt;br /&gt;
Ändert man die Sonoslandschaft, kann man auch alles einreißen und neu erzeugen lassen. Zunächst alles löschen (für die FHEM Kommandozeile):&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{fhem(&amp;quot;delete a:model=sonos2mqtt_speaker;;delete FileLog_MQTT2_RINCON.*&amp;quot;);;qx(rm ./log/MQTT2_RINCON_*);;return &amp;quot;&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Danach muss man sonos2mqtt einfach neu starten: pm2 start ... bzw den docker container neu starten.&lt;br /&gt;
&lt;br /&gt;
== Befehle nachrüsten ==&lt;br /&gt;
Um Befehle in der setList / getList / readingList  nachzurüsten gibt es die Routine &amp;lt;code&amp;gt;sonos2mqtt_mod_list(devspec,attrName,line)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Vorhandene Zeilen werden ersetzt. Identifiziert wird nur der erste Teil bis zum &amp;quot;:&amp;quot;. Beispiel für die Kommandozeile: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_bridge&#039;,&#039;readingList&#039;,&#039;sonos/RINCON_([0-9A-Z]+)/Reply:.* Reply&#039;)}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Sprachausgabe ==&lt;br /&gt;
Man hat zwei Möglichkeiten, dies umzusetzen: &lt;br /&gt;
# Text2Speech FHEM intern&lt;br /&gt;
# Mit dem sonos text to speech Server https://svrooij.io/sonos2mqtt/&lt;br /&gt;
&lt;br /&gt;
=== Text2Speech Variante einrichten ===&lt;br /&gt;
Zwei zusätzliche Geräte sind notwendig:&lt;br /&gt;
* [[Text2Speech]] im Servermodus, erzeugt mp3 Dateien im cache Verzeichnis und legt einen Link im Reading httpName ab.&lt;br /&gt;
* Ein HTTP Server stellt die Dateien im gleichen Verzeichnis bereit&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Für die vollständige Funktion und Installation von Text2Speech ist die Commandref zu beachten! Für das unten im Beispiel verwendete Feature UseMP3Wrap muss das Tool mp3wrap installiert werden (z.B. &amp;lt;code&amp;gt;apt install mp3wrap&amp;lt;/code&amp;gt;). Dies ist bei längeren Texten und bei der Verwendung von eingebetteten festen Sounds existenziell!&lt;br /&gt;
&lt;br /&gt;
Für die Funktion ist wichtig, dass das Sonos System den Host im Link zur Datei richtig auflösen kann. Deshalb wird der Hostname und Port des Servers im Reading host des TTS Device als Name oder IP Adresse abgelegt! Dies kann entweder mit dem hier gezeigten Befehl oder vollständig manuell erfolgen. Für FHEM innerhalb Docker muss man die Adresse des Docker Host angeben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod SonosTTS Text2Speech none&lt;br /&gt;
attr SonosTTS TTS_UseMP3Wrap 1&lt;br /&gt;
attr SonosTTS TTS_Language Deutsch&lt;br /&gt;
attr SonosTTS userReadings httpName:lastFilename.* {&#039;http://&#039;.ReadingsVal($name,&#039;host&#039;,&#039;set host:port first&#039;).&#039;/fhem/&#039;.ReadingsVal($name,&#039;lastFilename&#039;,&#039;&#039;)}&lt;br /&gt;
attr SonosTTS TTS_CacheFileDir cache&lt;br /&gt;
setreading SonosTTS host {(qx(hostname -s|tr -d &#039;\n&#039;).&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host {((split(&#039; &#039;, qx(hostname -I)))[0].&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host &amp;lt;hostname&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Sprachausgabe Befehl im Player Device läuft in 3 Schritten:&lt;br /&gt;
# mit dem TTS Gerät wird die mp3 Datei erzeugt,&lt;br /&gt;
# mit dem sleep wird auf die Fertigstellung gewartet,&lt;br /&gt;
# die Datei wird mit &amp;lt;code&amp;gt;set Player notify volume uri&amp;lt;/code&amp;gt; abgespielt.&lt;br /&gt;
Durch den &amp;quot;sonos2mqtt notify&amp;quot; Befehl wird die laufende Umgebung wiederhergestellt.&lt;br /&gt;
* Wird der Sprachbefehl an den Gruppenmaster gesendet wird die mp3 Datei in der gesamten Gruppe gespielt. &lt;br /&gt;
* Wird der Sprachbefehl an ein Mitglied einer Gruppe gesendet (nicht den Master) wird die Gruppe aufgetrennt und später wieder hergestellt.&lt;br /&gt;
Es sind zwei Befehle zur Sprachausgabe eingebaut: &lt;br /&gt;
&lt;br /&gt;
=== sayText Befehl ===&lt;br /&gt;
Dieser Befehl orientiert sich an den FHEM [[DevelopmentGuidelinesAV|DevelopmentGuidelines]] und sammelt &amp;quot;gleichzeitig&amp;quot; eintreffende Sprachnachrichten, damit nichts verloren geht. Informationen im Forum dazu in {{Link2Forum|Topic=111711|Message=1100112|LinkText=diesem Beitrag}}.&lt;br /&gt;
&lt;br /&gt;
Die Lautstärke wird separat in SonosTTS gesetzt: &amp;lt;code&amp;gt;setreading SonosTTS vol 15&amp;lt;/code&amp;gt;,  ebenso die Sprache (einmalig bei der Einrichtung oder bei Bedarf zwischendurch) &amp;lt;code&amp;gt;attr SonosTTS TTS_Language Deutsch&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Hinweis: Der Befehl &amp;lt;code&amp;gt;set SonosTTS volume xx&amp;lt;/code&amp;gt; hat im Servermodus des Devices keine Wirkung!&#039;&#039;&lt;br /&gt;
=== Speak Befehl ===&lt;br /&gt;
Dieser Befehl ist ähnlich wie der in der FHEM-Sonos Umgebung:&lt;br /&gt;
:&amp;lt;code&amp;gt;set Player speak &amp;lt;volume&amp;gt; text&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verwendet man diesen Syntax (mit Sprache und Stimme am Anfang), wird automatisch der speak Befehl an die sonos-tts abgesetzt. Die sonos-tts muss man separat installieren/integrieren!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set EG.KU.Sonos speak de-DE Vicki 25 Test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man keine laufenden Sendung unterbrechen sondern einfach eine Ansage machen und danach etwas starten, kann man so vorgehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set SonosTTS tts Hier steht die Ansage;sleep SonosTTS:playing:.0 ; set alias=PlayerAlias playUri [SonosTTS:httpName]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Volume Befehl ===&lt;br /&gt;
Der Befehl akzeptiert einen zweiten Wert als Startwert d.h. set volume 25 10 setzt sofort auf 10 und startet dann fading auf 25. Ein zweiter Wert -1 erzeugt ein fading vom aktuellen Wert auf den angegebenen.&lt;br /&gt;
&lt;br /&gt;
==== Spiele feste Sounds ====&lt;br /&gt;
Generell kann man feste mp3 Dateien (Klingeltöne, Klänge usw.) auch im cache Verzeichnis ablegen und direkt mit dem Link starten. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Soundquellen im Internet, ist der gewünschte Sound dabei, kann man ihn innerhalb FHEM herunterladen und an Ort und Stelle platzieren. (Beispiel ohne und mit Umbennung)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;wget -qP ./cache https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;quot;wget -qO ./cache/KlingelTon.mp3 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vergewissern ob der gewünschte Sound auch da ist: {qx(ls -lha ./cache)}&lt;br /&gt;
&lt;br /&gt;
Mit set magic kann man dabei einfach Teile aus anderen Readings holen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro notify 25 {(&#039;http://[SonosTTS:host]/fhem/cache/KlingelTon.mp3&#039;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann auch den setter im Gerät erweitern &amp;lt;code&amp;gt;{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,q(playSound:textField ....))}&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
playSound:textField {my $tts=&amp;quot;SonosTTS&amp;quot;;my ($cmd,$vol,$file)=split(&#039; &#039;, $EVENT,3);$file=($file=~m/.*\.mp3$/)?&amp;quot;$file&amp;quot;:&amp;quot;$file.mp3&amp;quot;;fhem(&amp;quot;set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/$file&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Damit sind dann dieser Syntax möglich:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon.mp3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder ohne Dateiendung (wird auf .mp3 gesetzt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SonosBridge ===&lt;br /&gt;
Die SonsoBridge enthält bereits ein paar zentrale Funktionen und Readings, z.B. wird beim Laden der Favoritenliste ein Reading favlist und grouplist erzeugt, welches zur Erweiterung der Player mit Auswahllisten dienen kann.&lt;br /&gt;
&lt;br /&gt;
=== Player mit Favoritenliste und Gruppenliste ausstatten ===&lt;br /&gt;
Wenn nicht schon geschehen muss man jetzt die Favoriten zum ersten Mal einlesen: &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
get SonosBridge Favorites&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nachdem die SonosBridge &amp;quot;aufgerüstet&amp;quot; ist, kann man allen Playern die Favoritenliste zum Auswählen eintragen. Beide Zeile sind für die FHEM Kommandozeile und verwenden die Routine aus der 99_sonos2mqttUtils.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,&#039;joinGroup:&#039;.ReadingsVal((devspec2array(&#039;a:model=sonos2mqtt_bridge&#039;))[0],&#039;grouplist&#039;,&#039;&#039;).q( {sonos2mqtt($NAME,$EVENT)}))}&lt;br /&gt;
{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,&#039;playFav:&#039;.ReadingsVal((devspec2array(&#039;a:model=sonos2mqtt_bridge&#039;))[0],&#039;favlist&#039;,&#039;&#039;).q( {sonos2mqtt($NAME,$EVENT)}))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann den playFav Befehl auch im set Befehl mit einem Teil des Favoriten Namen verwenden. Enthält die Favoritenliste z.B. Radio Leipzig würde der auch mit diesem Befehl angesteuert werden:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Bad playFav leipzig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Listen der Favoriten Radios und Playlist erstellen ===&lt;br /&gt;
Im Sonos System kann man an (mindestens) drei Stellen Favoriten hinterlegen: Sonos-Favoriten, Sonos-Playlisten, TuneIn: Meine Radiosender&lt;br /&gt;
&lt;br /&gt;
Diese drei Listen kann man einlesen und für die einfache Suche und Auswahl verwenden. Der play Befehl akzeptiert dazu zwei weitere Parameter und sucht in den entsprechenden Listen.&lt;br /&gt;
&lt;br /&gt;
Diese play Befehle starten nicht sofort, sondern erst nach einem folgenden set ... play. Damit kann man etwas vorbereiten und gezielt starten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Favorite Deutschlandfunk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Radio HitRadio&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Playlist Meine Hits&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sonos-Favoriten-, TuneIn: Meine Radiosender- und Sonos-Playlisten dazu vom Sonos System einmalig (bzw. bei Veränderungen) einlesen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
get SonosBridge Reply Playlists;sleep SonosBridge:Reply.*;setreading SonosBridge Playlists [SonosBridge:Reply]&lt;br /&gt;
get SonosBridge Reply Favorites;sleep SonosBridge:Reply.*;setreading SonosBridge Favorites [SonosBridge:Reply]&lt;br /&gt;
get SonosBridge Reply Radios;sleep SonosBridge:Reply.*;setreading SonosBridge Radios [SonosBridge:Reply]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel für ein Guten Morgen Radio:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set alias=BadWanne,alias=Kueche joinGroup Bad;&lt;br /&gt;
set alias=BadWanne,alias=Bad volume 13 6;&lt;br /&gt;
set alias=Bad play Favorite Deutschlandfunk.Kultur.RP;&lt;br /&gt;
set alias=Kueche volume 18 8;&lt;br /&gt;
sleep 0.2;set alias=Bad play&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Radioliste durchtasten ===&lt;br /&gt;
Will man eine Liste von bestimmten Radiostationen mit einem Taster &amp;quot;durchtasten&amp;quot; kann man das wie folgt tun:&lt;br /&gt;
&lt;br /&gt;
Das oben erwähnte &amp;lt;code&amp;gt;99_sonos2mqttUtils.pm&amp;lt;/code&amp;gt; (ab 6.1.2023) schreibt die Radios aus dem Reading &amp;lt;code&amp;gt;Favoriten&amp;lt;/code&amp;gt; in das userReading &amp;lt;code&amp;gt;favlist&amp;lt;/code&amp;gt; im SonosBridge Device und aktualisiert das auch.&lt;br /&gt;
&lt;br /&gt;
==== Der Befehl zum weiterschalten ====&lt;br /&gt;
Jedes Mal wenn dieser Befehl ausgeführt wird, wird der nächste &amp;quot;Radio-Favorit&amp;quot; (aus dem userReading &amp;lt;code&amp;gt;favlist&amp;lt;/code&amp;gt; des SonosBridge Devices) gestartet.&lt;br /&gt;
&lt;br /&gt;
Erfolgt die Ausgabe eines Radiosender, wird bei einem &amp;lt;code&amp;gt;set &#039;&#039;sonos2mqtt_speaker&#039;&#039; next&amp;lt;/code&amp;gt; auf den nächsten Sender in dieser Liste geschaltet und der &amp;lt;code&amp;gt;transportState&amp;lt;/code&amp;gt; beibehalten.&lt;br /&gt;
&lt;br /&gt;
==== Name der Radiostation vor dem Umschalten ansagen ====&lt;br /&gt;
Will man vor dem Radiostart noch die Ansage des Senders haben, geht das zwar auch mit dem &amp;lt;code&amp;gt;speak&amp;lt;/code&amp;gt; Befehl, die direkte Ausgabe ohne Restore der Umgebung (sonos2mqtt notify) ist aber effektiver.&lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen wir die Events einschränken: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr model=sonos2mqtt_speaker event-on-change-reading .*&lt;br /&gt;
{my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $r=Each($dev,ReadingsVal($dev,&#039;favlist&#039;,&#039;&#039;));;my $play = (devspec2array(&#039;alias=Büro&#039;))[0];;my $tts=&amp;quot;SonosTTS&amp;quot;;;fhem(&amp;quot;set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $play playUri [$tts:httpName];;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED;;set $play playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Kurze Erklärung zum Code &lt;br /&gt;
* ermittelt den nächsten Radiosender in der Liste: &amp;lt;code&amp;gt;my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $r=Each($dev,ReadingsVal($dev,&#039;favlist&#039;,&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;))&amp;lt;/code&amp;gt; &lt;br /&gt;
* ermitteln des Namens des &amp;lt;code&amp;gt;&#039;&#039;sonos2mqtt_speaker&#039;&#039;&amp;lt;/code&amp;gt; Devices anhand des &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt; Attributes: &amp;lt;code&amp;gt;my $play = (devspec2array(&#039;alias=Büro&#039;))[0]&amp;lt;/code&amp;gt;&lt;br /&gt;
* erzeugt die Ansage &amp;quot;Es folgt SenderXY&amp;quot;: &amp;lt;code&amp;gt;my $tts=&amp;quot;SonosTTS&amp;quot;;;fhem(&amp;quot;set $tts tts Es folgt $r&amp;lt;/code&amp;gt;&lt;br /&gt;
* wenn die mp3 Datei fertig erzeugt ist: &amp;lt;code&amp;gt;sleep $tts:playing:.0&amp;lt;/code&amp;gt;, wird sie mit dem Befehl playUri an den oben ermittelten &amp;lt;code&amp;gt;&#039;&#039;sonos2mqtt_speaker&#039;&#039;&amp;lt;/code&amp;gt; gesendet: &amp;lt;code&amp;gt;set $play playUri [$tts:httpName]&amp;lt;/code&amp;gt;&lt;br /&gt;
* es wird eine Eventfolge abgewartet -&amp;gt; play / PLAYING / STOPPED: &amp;lt;code&amp;gt;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED&amp;lt;/code&amp;gt;&lt;br /&gt;
* danach wird der Radiosender gestartet: &amp;lt;code&amp;gt;set $play playFav $r&amp;lt;/code&amp;gt;&lt;br /&gt;
Der Code ist so einfach und relativ &amp;quot;steif&amp;quot; für die Kommandozeile. Man kann das auch in einen Setter packen (&amp;lt;code&amp;gt;set &#039;&#039;sonos2mqtt_speaker&#039;&#039; toggleRadio&amp;lt;/code&amp;gt;). Dazu den Text unten in das Attribut &amp;lt;code&amp;gt;setList&amp;lt;/code&amp;gt; des &amp;lt;code&amp;gt;&#039;&#039;sonos2mqtt_speaker&#039;&#039;&amp;lt;/code&amp;gt; Devices hinzufügen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
toggleRadio:noArg {my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];my $r=Each($dev,ReadingsVal($dev,&#039;favlist&#039;,&#039;&#039;));my $tts=&amp;quot;SonosTTS&amp;quot;;fhem(&amp;quot;set $tts tts Es folgt $r;sleep $tts:playing:.0;set $NAME playUri [$tts:httpName];sleep $NAME:play;sleep $NAME:PLAYING;sleep $NAME:STOPPED;set $NAME playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dokumentationen und weitere Entwicklungen ==&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
Erweiterung um Alarmhandling siehe [https://forum.fhem.de/index.php/topic,111711.msg1162031.html#msg1162031 Forum]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=39677</id>
		<title>MQTT2-Module - Praxisbeispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=39677"/>
		<updated>2024-11-15T14:15:30Z</updated>

		<summary type="html">&lt;p&gt;TomLee: Beispiel ergänzt: numerische Werte runden&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung: MQTT bzw. MQTT2 in FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht&amp;lt;ref&amp;gt;Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden&amp;lt;/ref&amp;gt;. MQTT2_DEVICE unterstützt u.a. auch die &#039;&#039;setExtensions&#039;&#039; direkt, also z.B. &#039;&#039;on-for-timer&amp;lt;ref&amp;gt;Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die &#039;&#039;split&#039;&#039;-Varianten der attrTemplate-Einrichtung zu verwenden.&amp;lt;/ref&amp;gt;&#039;&#039; sowie &#039;&#039;[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]&#039;&#039;&amp;lt;ref&amp;gt;Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muss dies dort per Attribut eingeschaltet werden&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Einstellungen und Hinweise ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für [[autocreate]] in Verbindung mit MQTT2_SERVER &#039;&#039;&#039;zwingend&#039;&#039;&#039; jeder über MQTT kommunizierende Client eine ClientID angeben muss. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch &amp;quot;Wegwerf&amp;quot;-ClientID&#039;s. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit &#039;&#039;&#039;MQTT2_SERVER als Server (&amp;quot;Broker&amp;quot;)&#039;&#039;&#039;, für diesen sollte dabei &#039;&#039;autocreate&#039;&#039; &#039;&#039;&#039;nicht deaktiviert&#039;&#039;&#039; sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden&amp;lt;ref&amp;gt;Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) ebenfalls aktiv ist.&amp;lt;/ref&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Beispiel&amp;lt;ref&amp;gt;MQTT2_SERVER verwendet als default-Einstellung für &#039;&#039;autocreate&#039;&#039; &#039;&#039;simple&#039;&#039;, ohne dass ein entsprechendes Attribut gesetzt werden müsste. Die Einstellung &#039;&#039;complex&#039;&#039; empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 define MQTT2_FHEM_Server MQTT2_SERVER 1883 global&lt;br /&gt;
&lt;br /&gt;
Falls der MQTT Broker mit Hilfe von [[allowed]] abgesichert wurde, muss in den Geräten ebenfalls User bzw. Passwort eingetragen werden, damit eine MQTT Kommunikation möglich ist.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muss ggf. die &amp;quot;\&amp;quot; entfernen!}}&lt;br /&gt;
&lt;br /&gt;
=== MQTT-Einstellungen in den Geräten ===&lt;br /&gt;
Die Beispiele gehen davon aus, dass die einzubindenden Geräte &#039;&#039;&#039;&#039;&#039;mit den default-Einstellungen&#039;&#039;&#039;&#039;&#039; für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere &#039;&#039;&#039;keine Veränderungen der topic-Pfade&#039;&#039;&#039; vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen.  }}&lt;br /&gt;
&lt;br /&gt;
=== auto-Konfigurations-features ===&lt;br /&gt;
Viele firmwares und Dienste bieten Möglichkeiten an, einer Controller-Software (insbesondere homeassistant) Hilfsdaten zur automatisierten Konfiguration bereitzustellen. Da FHEM diese Daten nicht zu ihrem ursprünglichen Zweck verwenden kann, werden hierdurch lediglich zusätzliche Readings erzeugt, mit denen man als User in der Regel wenig anfangen kann. Es wird daher empfohlen, derartige features &#039;&#039;&#039;abzuschalten&#039;&#039;&#039;. Wo dies nicht möglich ist, sollte man eine passende [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp]] setzen bzw. diese passend erweitern!&lt;br /&gt;
&lt;br /&gt;
=== Schritt für Schritt ===&lt;br /&gt;
Hier werden in der Regel fertige Konfigurationen für häufige Anwendungsfälle (beispielhaft) dargestellt. In [[MQTT2_DEVICE - Schritt für Schritt]] ist etwas mehr über die Vorgehensweise bei der Zusammenstellung der verschiedenen Attribute und deren Zusammenwirken zu erfahren.&lt;br /&gt;
&lt;br /&gt;
== zigbee2mqtt ==&lt;br /&gt;
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]&lt;br /&gt;
[https://www.zigbee2mqtt.io zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.&lt;br /&gt;
&lt;br /&gt;
Einzelheiten zur Vorgehensweise sind auf der Detailseite [[Zigbee2mqtt|zigbee2mqtt]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Tasmota ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. &lt;br /&gt;
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter &#039;&#039;&amp;lt;nowiki&amp;gt;topic = %topic% (tasmota)&amp;lt;/nowiki&amp;gt;&#039;&#039; ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem  Eingabefeld für &#039;&#039;&amp;quot;client ...&amp;quot;&#039;&#039;, siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
=== MQTT2_DEVICE ===&lt;br /&gt;
Dieses sollte bei aktiviertem &#039;&#039;autocreate&#039;&#039; am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen - Schalter ===&lt;br /&gt;
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD IODev m2server&lt;br /&gt;
 attr MQTT2_DVES_9B01BD devStateIcon on:FS20.on:off off:FS20.off:on&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr MQTT2_DVES_9B01BD room MQTT2_DEVICE&lt;br /&gt;
 attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\&lt;br /&gt;
    off cmnd/DVES_9B01BD/POWER off\&lt;br /&gt;
    reboot cmnd/DVES_9B01BD/Restart 1&lt;br /&gt;
 attr MQTT2_DVES_9B01BD webCmd on:off:reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen - Dimmer ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Dieses Beispiel ist nur bedingt zur Nachahmung zu empfehlen: Prinzipiell kann man Readings und setter in MQTT2_DEVICE fast nach Belieben benennen. Wählt man allerdings &amp;lt;i&amp;gt;FHEM-typische&amp;lt;/i&amp;gt; Namen, kann dies sehr zur Vereinfachung beitragen. Z.B. wird eine Sprachssteuerung bei einem Dimmer üblicherweise automatisch korrekt eingestellt werden, wenn der für die Helligkeit zuständige setter z.B. &amp;lt;i&amp;gt;pct&amp;lt;/i&amp;gt; (oder &amp;lt;i&amp;gt;brightness&amp;lt;/i&amp;gt;) heißt, oder eine abzufragende Temperatur &amp;lt;i&amp;gt;temperature&amp;lt;/i&amp;gt;. Entsprechendes gilt im Rahmen von &amp;lt;i&amp;gt;devspec-Abfragen&amp;lt;/i&amp;gt;.}}Bei einem Dimmer sind einige zusätzliche Anpassungen vorzunehmen. Ein Dimmer wird über &#039;&#039;&#039;POWER&#039;&#039;&#039; geschaltet und über &#039;&#039;&#039;Dimmer&#039;&#039;&#039; gedimmt. Damit das funktioniert, müssen ein stateFormat und devStateIcon zusammenarbeiten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr MQTT2_DVES_2DF34D devStateIcon 10\d.*:dim100%@orange:off 1\d.*:dim12%@orange:off 2\d.*:dim18%@orange:off 3\d.*:dim31%@orange:off 4\d.*:dim43%@orange:off 5\d.*:dim50%@orange:off 6\d.*:dim62%@orange:off 7\d.*:dim68%@orange:off 8\d.*:dim81%@orange:off 9\d.*:dim93%@orange:off 0:FS20.off:on .*:FS20.off@orange:off&lt;br /&gt;
 attr MQTT2_DVES_2DF34D stateFormat {if(ReadingsVal($name,&amp;quot;POWER&amp;quot;,0)eq&amp;quot;off&amp;quot;){0}else{ReadingsVal($name,&amp;quot;Dimmer&amp;quot;,0)}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nun kann man über das Icon ein- und ausschalten und der Zustand des Dimmers wird korrekt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Es fehlt noch ein Slider, um auch dimmen zu können. Zusätzlich muss setList noch um Dimmer erweitert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 attr MQTT2_DVES_2DF34D setList on cmnd/dimmer/POWER on\&lt;br /&gt;
 off cmnd/dimmer/POWER off\&lt;br /&gt;
 Dimmer cmnd/dimmer/Dimmer&lt;br /&gt;
 attr MQTT2_DVES_2DF34D webCmd Dimmer&lt;br /&gt;
 attr MQTT2_DVES_2DF34D widgetOverride Dimmer:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
===== Allgemeines =====&lt;br /&gt;
Für gängige Tasmota-Geräte stehen &#039;&#039;templates&#039;&#039; bereit, mit denen sich diese schnell konfigurieren lassen. &lt;br /&gt;
Beachten Sie dazu den Abschnitt &#039;&#039;attrTemplate&#039;&#039; in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}&lt;br /&gt;
&lt;br /&gt;
===== Kein passendes attrTemplate vorhanden? =====&lt;br /&gt;
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das &amp;quot;&#039;&#039;tasmota_basic&#039;&#039;&amp;quot; anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults &amp;quot;ON&amp;quot; bzw. &amp;quot;OFF&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Allerdings stellt dieses das &#039;&#039;autocreate&#039;&#039; an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das &#039;&#039;autocreate&#039;&#039;-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im &#039;&#039;jsonMap&#039;&#039;-Attribut nur die Angabe &amp;quot;&#039;&#039;POWER1:state&#039;&#039;&amp;quot; zu belassen.&lt;br /&gt;
&lt;br /&gt;
=== on-for-timer ===&lt;br /&gt;
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen &#039;&#039;setter&#039;&#039; in der &#039;&#039;setList&#039;&#039; werden die &#039;&#039;&#039;SetExtensions&#039;&#039;&#039; verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:&lt;br /&gt;
&lt;br /&gt;
==== delay ==== &lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (Attributeingabe via FHEMWEB!):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1*10; &#039;cmnd/DVES_575127/Backlog POWER1 1; delay &#039;.$duration.&#039;; POWER1 0&#039;}&lt;br /&gt;
&lt;br /&gt;
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe [https://tasmota.github.io/docs/Commands/#delay Commands - Tasmota Delay]), also 6 Minuten.&lt;br /&gt;
&lt;br /&gt;
====pulseTime ====&lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (s.o.):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1 &amp;lt; 11.2 ? $EVTPART1*10 : $EVTPART1+100; &#039;CMNDTOPIC/Backlog pulseTime1 &#039;.$duration.&#039;; POWER1 1&#039;}&lt;br /&gt;
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit &#039;&#039;delay&#039;&#039;. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren &amp;quot;normalen&amp;quot; Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites &#039;&#039;save&#039;&#039; nur bis zum nächsten reboot des Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Da nach dem ersten pulseTime setzten, diese immer benutzt wird, kann man mit einem kleine Workaround das Device normal arbeiten lassen. Dafür wird bei jedem anderem Befehl, aus der PulseTime, der Timer deaktiviert.&lt;br /&gt;
Hierfür machen wir uns zu nutzen, dass man mehrere Befehle gleichzeitig an Tasmota senden kann (backlog). Ob diese Lösung auch mit anderen MQTT Firmwares funktioniert, kann ich nicht sagen. Es wurde lediglich mit Tasmota getestet.&lt;br /&gt;
Wir senden also, bevor wir den eigentlich Tasmota Befehl zum Ein- oder Ausschalten schicken, einen Befehl zum deaktivieren des Timers: &amp;quot;pulseTime 0&amp;quot;&lt;br /&gt;
Hier ein Beispiel: (das entsprechende device &amp;quot;DEV_611F3E&amp;quot; muss gegen das eigene ersetzt werden)&lt;br /&gt;
 off:noArg    cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 0&lt;br /&gt;
 on:noArg     cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 1 &lt;br /&gt;
 toggle:noArg cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 2&lt;br /&gt;
&lt;br /&gt;
=== zigbee2tasmota ===&lt;br /&gt;
[https://tasmota.github.io/docs/Zigbee/ zigbee2tasmota] ist eine Erweiterung der Tasmota-firmware für Microcontroller, insbesondere dem ESP8266 (und ESP32)(link), über die einige ZigBee-Chipsätze (insbesondere TI CC2530) als [[ZigBee#Koordinator_.28ZigBee_coordinator.2C_ZC.29|Coordinator]] eingebunden werden können, um ein ZigBee-Netzwerk aufzubauen.&lt;br /&gt;
{{Hinweis|Stand 08/2020 war die Einbindung anderer Chipsätze erst in einem Alpha-Stadium; die Zahl der über einen CC2530 einbindbaren ZigBee-Geräte ist daher derzeit relativ begrenzt (ca. 16)!}}&lt;br /&gt;
Auch für diese Lösung stehen einige &#039;&#039;attrTemplate&#039;&#039; zur Verfügung. Nähere Informationen hierzu sind dem Artikel [[Zigbee2Tasmota-MQTT]] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
== ESPurna ==&lt;br /&gt;
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool&#039;sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als &amp;quot;on&amp;quot; oder &amp;quot;off&amp;quot; oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.&lt;br /&gt;
&lt;br /&gt;
== Shelly ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.&lt;br /&gt;
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen weitere Geräte angelegt und konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Standardmäßig senden die Shelly-Geräte ihren kompletten Status alle 30 Sekunden. Dies kann man über den Parameter &#039;&#039;mqtt_update_period&#039;&#039; in den &#039;&#039;settings&#039;&#039; ändern, allerdings ist dieser nur über die HTTP-Schnittstelle des Shelly verfügbar. Um diese Statusupdates abzustellen, kann über den Browser folgender Befehl verwendet werden:&lt;br /&gt;
 http://&amp;lt;ip-des-shelly&amp;gt;/settings?mqtt_update_period=0, &lt;br /&gt;
Soweit bekannt, werden dann nur statische updates ausgeschaltet, z.B. für das Relay bzw. angeschlossene Taster oder Schalter; insbesondere Verbrauchswerte werden dennoch aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Shelly1 ===&lt;br /&gt;
&lt;br /&gt;
=== Shellybulb ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate  angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
 Internals:&lt;br /&gt;
   CFGFN     &lt;br /&gt;
   CID        shellybulb_3CC533&lt;br /&gt;
   DEF        shellybulb_3CC533&lt;br /&gt;
   DEVICETOPIC MQTT2_shellybulb_3CC533&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   NAME       MQTT2_shellybulb_3CC533&lt;br /&gt;
   NR         246&lt;br /&gt;
   STATE      ???&lt;br /&gt;
   TYPE       MQTT2_DEVICE&lt;br /&gt;
   READINGS:&lt;br /&gt;
     2018-12-12 19:28:08   status_blue     0&lt;br /&gt;
     2018-12-12 19:28:08   status_brightness 61&lt;br /&gt;
     2018-12-12 19:28:08   status_effect   0&lt;br /&gt;
     2018-12-12 19:28:08   status_gain     26&lt;br /&gt;
     2018-12-12 19:28:08   status_green    0&lt;br /&gt;
     2018-12-12 19:28:08   status_ison     true&lt;br /&gt;
     2018-12-12 19:28:08   status_mode     color&lt;br /&gt;
     2018-12-12 19:28:08   status_red      255&lt;br /&gt;
     2018-12-12 19:28:08   status_temp     3250&lt;br /&gt;
     2018-12-12 19:28:08   status_white    0&lt;br /&gt;
 Attributes:&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, &#039;status_&#039;) }&lt;br /&gt;
   room       MQTT2_DEVICE&lt;br /&gt;
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate &amp;quot;shellybulb&amp;quot; auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly Plug S ===&lt;br /&gt;
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb &amp;gt; 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:&lt;br /&gt;
  attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state =&amp;gt; $EVTPART0&amp;lt;100?&amp;quot;off&amp;quot;:&amp;quot;on&amp;quot; } }&lt;br /&gt;
Der Status des MQTT2 Devices zeigt dann bei &amp;lt;100W &amp;quot;off&amp;quot; und sonst &amp;quot;on&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
=== HTTP-Commands ===&lt;br /&gt;
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.&lt;br /&gt;
&lt;br /&gt;
== Shelly Gen2 ==&lt;br /&gt;
=== Vorbereitung ===&lt;br /&gt;
Shelly mit dem WLAN verbinden, entweder über die Shelly APP oder per Laptop auf den Offenen AP des Shelly verbinden und dann übers WebUI des Shelly mit dem Heimischen WLAN verbinden. Über die APP geht dies meist etwas einfach und schneller, besonders wenn man mehrere Shelly Geräte hinzufügen möchte. Durch die BT Unterstützung der Gen2 Geräte, klappt dies meist auch deutlich schneller und zuverlässiger als noch bei Gen 1 Geräten. &lt;br /&gt;
Nachdem der Shelly mit dem WLAN verbunden ist, sollte die Firmware überprüft und gegebenenfalls aktualisiert werden (Stand Anfang 2022 scheint die firmware noch nicht voll ausgereift gewesen zu sein, da dass insbesondere die MQTT-Schnittstelle immer wieder überarbeitet wurde). Bitte KEINE BETA Versionen installieren, wenn nicht dazu aufgefordert wurde.&lt;br /&gt;
Nach dem, durch das Update ausgelösten, Neustart kurz Prüfen ob die Uhrzeit passt, wenn trotz richtiger Zeitzone die Uhrzeit nicht stimmt hilft ein weiterer Neustart.&lt;br /&gt;
Nun auf Networks| Internet (leider in APP und WebUI unterschiedlich), hier auf MQTT und die Einstellungen für den verwendeten MQTT Server treffen. Diese Einstellungen werden auch wieder durch Neustart übernommen.&lt;br /&gt;
=== Shelly Plus 1 ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shelly erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod MQTT2_shellyplus1_441793a34044 MQTT2_DEVICE shellyplus1_441793a34044&lt;br /&gt;
attr MQTT2_shellyplus1_441793a34044 readingList shellyplus1_441793a34044:shellyplus1-441793a34044/online:.* online\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/status/mqtt:.* { json2nameValue($EVENT) }\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/events/rpc:.* { json2nameValue($EVENT) }\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/status/sys:.* { json2nameValue($EVENT) }\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/status/switch_0:.* { json2nameValue($EVENT) }&lt;br /&gt;
attr MQTT2_shellyplus1_441793a34044 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 IODev m2s&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 available_updates_beta_version 0.10.0-beta6&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 cfg_rev 7&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 connected true&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 dst shellyplus1-441793a34044/events&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_free 237568&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_size 458752&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 id 0&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 mac 441793A34044&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 method NotifyStatus&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 online true&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 output false&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_mqtt_connected true&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_id 0&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_output false&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_source WS_in&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tC 39.88&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tF 103.78&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 params_sys_available_updates_beta_version 0.10.0-beta6&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_ts 1646474952.66&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_rssi -57&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_ssid WLAN-Alex&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_sta_ip 192.168.177.167&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_status got ip&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_free 179764&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_size 249456&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 restart_required false&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 source WS_in&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 src shellyplus1-441793a34044&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tC 39.9&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tF 103.9&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 time 11:08&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 unixtime 1646474911&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 uptime 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über die set Anweisung unterhalb der Device Übersicht können wir ein attrTemplate wählen; shellyPlus_1&lt;br /&gt;
Es erscheint eine kurze Übersicht was im Template enthalten ist, dieses befindet sich noch im Aufbau und wird aktuell von der Community aufgebaut und weiterentwickelt. Mit einem Klick auf „set“ laden wir das Template und übernehmen die Einstellungen für den Shelly Plus 1.&lt;br /&gt;
Damit ist der Shelly bereit, im Status wird neben dem Namen auch der Onlinestatus des Shellys (grüner | roter Punkt) so wie eine Lampe mit Toggle (on | off) Funktion und die Temperatur des Shellys angezeigt. Darüber hinaus verschwindet die Lampe und wird durch einen klickbaren Hinweis ersetzt, wenn ein Neustart des Shellys nötig ist.&lt;br /&gt;
&lt;br /&gt;
=== Tipps ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=So nimmt man bei Verwendung eines normalen Schalters (eine Stellung EIN eine AUS) gerne den „Flip“ Mode – damit wird der Shelly IMMER umgeschaltet, egal in welche Stellung der Schalter sich bewegt („Kreuzschaltung“). Diese Einstellungen trifft man grundlegend im WebUI des Shelly (oder  APP) unter „Channel settings“.&lt;br /&gt;
Für den „Flip“ müssen wir die Grundeinstellung des „Power on default“ auch ändern (gleiche Seite) - persönlich wähle ich „Restore last“, also: nach Stromausfall wird der letzte Zustand wieder hergestellt; grundsätzlich gehen alle Modi außer „Match input“.&lt;br /&gt;
}}&lt;br /&gt;
Das aktuelle Template wurde um die Funktion erweitert, den Button Mode umzuschalten. In den meisten Fällen legt man sich auf eine Schaltmethode fest, welche zum Hardware Setup passt.&lt;br /&gt;
&lt;br /&gt;
Manchmal will man aber vielleicht den Hardware Schalter deaktivieren, nennen wir es „Kindersicherung“. Bei Shelly heißt das „detached“.&lt;br /&gt;
Diese Funktion wurde ins Template als „in_mode“ Übernommen. Mögliche set Befehle sind „flip“, „detached“ „toggle“. Bedingung zur Verwendung ist: „relay power on default“ darf NICHT „Match input“ sein. Sollte Follow statt Flip bevorzugt werden, müsste entsprechende Zeile in der setList von „flip“ auf „follow“ angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Der Befehlt lässt sich mit dem webCmd in_mode auch schnell zugänglich in die Übersicht vom Shelly setzen, so erhält man neben dem Status ein Dropdown mit flip detached  und toggle zum schnellen umschalten. Mit webCmdLabel kann man noch einen Namen für das Dropdown setzen.&lt;br /&gt;
&lt;br /&gt;
== OpenMQTTGateway ==&lt;br /&gt;
Um verschiedene Systeme wie BLE usw. auf MQTT zu bringen bietet sich [https://github.com/1technophile/OpenMQTTGateway OpenMQTTGateway] an, z.B. wird für das Auslesen vieler BLE-Seonsoren lediglich ein ESP32-Board ohne Zusatzhardware (ab ca. 5,- Euro in Fernost erhältlich) benötigt, auf das dann eine vorkompilierte firmware geflasht wird (hierfür wird ein USB-seriell-Wandler benötigt).&lt;br /&gt;
&lt;br /&gt;
Nähere Details sind im Artikel [[OpenMQTTGateway]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== 8-Port-Ethernet Board ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse&lt;br /&gt;
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
In diesem {{Link2Forum|Topic=107536|Message=1016379|LinkText=Forenbeitrag}} bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.&lt;br /&gt;
&lt;br /&gt;
== Milight-Bridge ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von &#039;&#039;openmili&#039;&#039; eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel. Allerdings lassen sich manche MiLight-Geräte nicht an die Bridge anlernen, und es werden auch nicht alle Fernbedienungs-Typen voll unterstützt.&lt;br /&gt;
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway&amp;lt;ref&amp;gt;Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist und die zu steuernden Leuchtmittel mit dem Hub bereits verbunden (gepairt) sind bzw. entsprechende Fernbedienungs-Signale empfangen werden können (bei vorhandenem pairing eines Leuchtmittels an die Fernbedienung).&lt;br /&gt;
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen am MiLight-Hub ===&lt;br /&gt;
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.&lt;br /&gt;
Die Einstellungen für &#039;&#039;MQTT topic pattern&#039;&#039; usw. können auf den default-Werten&amp;lt;ref&amp;gt;Diese sind: &amp;lt;br&amp;gt;&#039;&#039;milight/:device_id/:device_type/:group_id&#039;&#039; für &amp;quot;topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/updates/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;update topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/states/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;state topic pattern&amp;quot;. Der Autor hat derzeit folgende Infotypen zum Senden markiert: &amp;quot;status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color&amp;quot; (enthält eventuell zu viele Angaben. Bei einem Eventhandler muss man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).&amp;lt;/ref&amp;gt; belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (&#039;&#039;MQTT Client Status Topic&#039;&#039;), tragen Sie &#039;&#039;milight/LWT&#039;&#039; ein und aktivieren &#039;&#039;Detailed&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Devices ===&lt;br /&gt;
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]&lt;br /&gt;
==== Bridge ====&lt;br /&gt;
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:&lt;br /&gt;
 defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses Device wird nun das &#039;&#039;template&#039;&#039; &#039;&#039;&#039;esp_milight_hub_bridge&#039;&#039;&#039; angewandt.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Leuchtmittel ====&lt;br /&gt;
&lt;br /&gt;
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:&lt;br /&gt;
 defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Devices werden genauso erstellt. &lt;br /&gt;
&lt;br /&gt;
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template &#039;&#039;X_01a_esp_milight_hub_make_rgbw_group&#039;&#039; verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt &#039;&#039;&#039;eine Kopie&#039;&#039;&#039;, die dann modifiziert wird. Diese Kopie ist unter dem Namen &#039;&#039;milight_&amp;lt;RemoteID&amp;gt;_0&#039;&#039; im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele:&lt;br /&gt;
Beispiel für ein RGB-CCT-Device:&lt;br /&gt;
 defmod Licht_Wz_all MQTT2_DEVICE&lt;br /&gt;
 attr Licht_Wz_all IODev MQTT2_Broker&lt;br /&gt;
 attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/&lt;br /&gt;
 attr Licht_Wz_all group Licht&lt;br /&gt;
 attr Licht_Wz_all icon light_control&lt;br /&gt;
 attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 &lt;br /&gt;
 attr Licht_Wz_all room Wohnzimmer&lt;br /&gt;
 attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
 off milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
 level milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 next_mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_up milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 device_id milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 effect milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 commands milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr Licht_Wz_all sortby 1&lt;br /&gt;
 attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue&lt;br /&gt;
 attr Licht_Wz_all webCmdLabel command\ &lt;br /&gt;
 :brightness:saturation\&lt;br /&gt;
 :color_temp:hue&lt;br /&gt;
==== Ein Leuchtmittel, mehrere Fernbedienungen ====&lt;br /&gt;
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen &amp;quot;hört&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }&lt;br /&gt;
&lt;br /&gt;
==== Fernbedienung als Input-Device nutzen ====&lt;br /&gt;
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.&lt;br /&gt;
Um hier nur Differenz-Meldungen direkt an die betreffende myUtils-Funktion zu übergeben und doppelte Events zu verhindern, sollte hier die readingList so angepasst werden, dass nur Messages aus dem &amp;quot;updates&amp;quot;-Zweig ausgewertet werden: &lt;br /&gt;
 defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0&lt;br /&gt;
 attr MiLight_RC1_0 readingList milight/states/0xABCD/fut089/[0-8]:.* {}&lt;br /&gt;
 milight/updates/0xABCD/fut089/0:.* { FHEM::attrT_MiLight_Utils::MPDcontrol(&#039;myMPD&#039;,$EVENT, &#039;Yamaha_Main&#039;) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/1:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW(&#039;Licht_Stehlampe_links&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/2:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW(&#039;Licht_Stehlampe_rechts&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/3:.* { FHEM::attrT_MiLight_Utils::four_Lights_matrix($EVENT, &#039;Licht_WoZi_Vorn_Aussen&#039;, &#039;Licht_WoZi_Vorn_Mitte&#039;, &#039;Licht_WoZi_Hinten_Aussen&#039;, &#039;Licht_WoZi_Hinten_Mitte&#039;) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/4:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Jalousie_WZ&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/5:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Rollladen_WZ_SSO&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/6:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Rollladen_WZ_SSW&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/7:.* {}\&lt;br /&gt;
 milight/updates/0x5D47/fut089/8:.* {}&lt;br /&gt;
 attr MiLight_RC_WZ stateFormat CommandSet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== eBus ==&lt;br /&gt;
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition am eBus ===&lt;br /&gt;
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.&lt;br /&gt;
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. &#039;&#039;ebusd/%circuit/%name&#039;&#039;.&lt;br /&gt;
 --accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name&lt;br /&gt;
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic &#039;&#039;ebusd&#039;&#039; verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit &#039;&#039;ebus...&#039;&#039; zu beginnen!}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition  in FHEM ===&lt;br /&gt;
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem &#039;&#039;&#039;&#039;&#039;vor&#039;&#039;&#039;&#039;&#039; den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der &#039;&#039;readingList&#039;&#039; enthalten, die vom ebus stammen. Da wir die &#039;&#039;readingList&#039;&#039; anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche &#039;&#039;readingList&#039;&#039;-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-&amp;quot;Sammeldevices&amp;quot; genutzt werden, und dessen &#039;&#039;CID&#039;&#039; auf &#039;&#039;ebusd&#039;&#039; geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der &#039;&#039;readingList&#039;&#039; des &amp;quot;Sammeldevices&amp;quot; gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. &lt;br /&gt;
&lt;br /&gt;
Sind die Vorbereitungen abgeschlossen, aktivieren wir &#039;&#039;autocreate&#039;&#039; wieder, allerdings wählen wir als autocreate-Methode &#039;&#039;complex&#039;&#039; aus, da der eBus-Dämon teilweise&amp;lt;ref&amp;gt;Dies betrifft vorrangig die Statusmeldungen&amp;lt;/ref&amp;gt; eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt&amp;lt;ref&amp;gt;Bei Verwendung des MQTT2_CLIENT wird dann die &#039;&#039;readingList&#039;&#039; am bereits definierten MQTT2_DEVICE aus der Kopie des &amp;quot;Sammeldevice&amp;quot; automatisch wieder erstellt bzw. gefüllt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;ebus-Bridge&amp;quot; ====&lt;br /&gt;
Auf das von &#039;&#039;autocreate&#039;&#039; erstellte MQTT2_DEVICE wird nunmehr das template &#039;&#039;eBus_daemon_splitter&#039;&#039; angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. &lt;br /&gt;
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen &#039;&#039;uptime&#039;&#039;, alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;attrTemplate&#039;&#039; läd eine weitere &#039;&#039;attrTemplate&#039;&#039;-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. &lt;br /&gt;
==== &amp;quot;ebusd_bai&amp;quot; und weitere Geräte ====&lt;br /&gt;
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}&lt;br /&gt;
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens &#039;&#039;MQTT2_ebus_bai&#039;&#039; angelegt worden sein.&lt;br /&gt;
&lt;br /&gt;
== Sonos2Mqtt ==&lt;br /&gt;
Aus einem Versuch heraus ist ein {{Link2Forum|Topic=111711|LinkText=kleines Projekt}} geworden: Die Sonos Umgebung mit Hilfe von sonos2mqtt als generisches MQTT2_DEVICE komfortabel in FHEM einzubinden.&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von ein paar Templates ist die grundlegende Einbindung in FHEM nach einer kleinen Installation auf Systemebene schnell erledigt. Es läuft derzeit noch zahlreiche Entwicklung und Ideenfindung, die Fortschritte sind live im Thread oder [[Sonos2mqtt|konsolidiert im Wiki]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Setup im System ===&lt;br /&gt;
Für dies Funktion wird der nodejs Server [https://github.com/svrooij/sonos2mqtt sonos2mqtt] benötigt. Entweder installiert man den lokal, irgendwo im Netzwerk oder nutzt den [[MQTT2-Module - Praxisbeispiele#Verwendung des Docker Containers|Docker Container.]]&lt;br /&gt;
&lt;br /&gt;
Der nodejs Server sonos2mqtt kann aus Sicht von FHEM irgendwo im Netzwerk stehen - aber er muss im gleichen Netzwerk wie die Sonosplayer stehen. Das UPNP Sonosnetzwerk funktioniert nicht über Netzwerksegmente hinweg.&lt;br /&gt;
&lt;br /&gt;
Eine Beschreibung aller Startparameter für sonos2mqtt findet man [https://svrooij.github.io/sonos2mqtt in der offiziellen Doku].&lt;br /&gt;
&lt;br /&gt;
Erreicht der nodejs Server sonos2mqtt den MQTT Server nicht über - default: localhost, Port 1883, keine Anmeldung&amp;quot; - muss der Parameter --mqtt  gesetzt werden! &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800&amp;lt;/code&amp;gt;            # alles gesetzt&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://192.168.0.3:1800&amp;lt;/code&amp;gt;                                                                 # IP Adresse und Port gesetzt, keine Anmeldung am MQTT Server&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://192.168.0.3&amp;lt;/code&amp;gt;                                                                           # IP Adresse gesetzt, Port ist Standard 1883&lt;br /&gt;
&lt;br /&gt;
Erfolgt der Start mit pm2, werden die Parameter mit einem &#039;&#039;zusätzlichen&#039;&#039; doppelten Bindestrich (--) hinter dem nodejs Modul übergeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
pm2 start sonos2mqtt -- --mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lokales Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: nodejs und pm2 ist installiert und für alle Benutzer verfügbar. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo npm install -g sonos2mqtt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Je nach Entwicklungsstand sind auch Betaversionen verfügbar. Für aktuelle Betaversionen wird dieser Zusatz beim Setup verwendet. -&amp;gt; sonosmqtt@3.1.0-beta.1&lt;br /&gt;
&lt;br /&gt;
Wird der sonos2mqtt Server auf einer anderen Maschine eingerichtet, ist der Start entsprechend diesem Absatz [[MQTT2-Module - Praxisbeispiele#Autostart von sonos2mqtt im System mit pm2 .28Alternative.29|Autostart von Sonos2mqtt im System mit pm2]] einzurichten.&lt;br /&gt;
&lt;br /&gt;
=== Setup in FHEM ===&lt;br /&gt;
Man definiert lediglich ein Bridge Device, der Rest wird automatisch erledigt.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: &lt;br /&gt;
* autocreate im System ist aktiv. &lt;br /&gt;
* Der verwendete MQTT2_SERVER steht auf &#039;&#039;&#039;autocreate simple&#039;&#039;&#039; (default/Standard).&lt;br /&gt;
* Templates aktuell - FHEM uptodate oder bei Bedarf in der FHEM Kommandozeile aktualisieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ Svn_GetFile(&amp;quot;FHEM/lib/AttrTemplate/mqtt2.template&amp;quot;, &amp;quot;FHEM/lib/AttrTemplate/mqtt2.template&amp;quot;, sub(){ AttrTemplate_Initialize() }) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bei der Anwendung des Templates für die Bridge wird das Attribut devicetopic ausgelesen oder auf default sonos gesetzt! &lt;br /&gt;
&lt;br /&gt;
Wird ein anderer Devicetopic verwendet, muss der bei der Anlage der Bridge gesetzt werden!&lt;br /&gt;
&lt;br /&gt;
Diese Zeilen einzeln in der FHEM Kommandozeile oder als Block in der Raw Definition. &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define SonosBridge MQTT2_DEVICE&lt;br /&gt;
attr SonosBridge room MQTT2_DEVICE&lt;br /&gt;
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Template sonos2mqtt_bridge_comfort:&lt;br /&gt;
* setzt das Template sonos2mqtt_bridge auf das Device,&lt;br /&gt;
* lädt die Datei 99_sonos2mqttUtils.pm aus dem contrib Ordner nach,&lt;br /&gt;
* definiert ein notify, dies erledigt im weiteren Betrieb die automatische Konfiguration der automatisch erzeugten MQTT2_DEVICEs. &lt;br /&gt;
** mit dem Template sonos2mqtt_speaker (das Template kann auch manuell auf vorhandene Player angewendet werden, die automatische Erzeugung der Player wird aber empfohlen)&lt;br /&gt;
** Ermittelt Detailinformation des jeweiligen Players (vor allem IP Adresse und Modelnumber)&lt;br /&gt;
** Lädt die Sonosgeräte Icons von den UPNP Devices herunter&lt;br /&gt;
** erweitert das setList input Kommando um den TV Eingang (HDMI, spdif) bzw. Line_IN Eingang falls vorhanden (Modelnumber)&lt;br /&gt;
* Die Player werden automatisch einzeln erzeugt wenn sie mqtt Nachrichten senden (Play/Stop) oder (alle sofort) wenn der sonos2mqtt Server gestartet wird. &lt;br /&gt;
&lt;br /&gt;
==== Wozu dient die Bridge? ====&lt;br /&gt;
Sie stellt ein paar wesentliche Funktionen zu Verfügung&lt;br /&gt;
# Auffangen von nicht benötigten MQTT Nachrichten.&lt;br /&gt;
# Erzeugung/Weiterleitung von Nachrichten für die einzelnen Player - damit auch die Erzeugung von separaten Playern nach dem Schema MQTT2_RINCON12345678901234567.&lt;br /&gt;
# Statusanzeige sonos2mqtt als Reading connected (0 offline, 1 connected, 2 Player connected).&lt;br /&gt;
Sie kann zusätzlich als zentrales Device verwendet werden, um die Sonos Umgebung abzubilden, z.B. Readings für Favoriten  u.ä.&lt;br /&gt;
&lt;br /&gt;
==== Start sonos2mqtt lokal ====&lt;br /&gt;
Der Start / Stop des sonos2mqtt Servers innerhalb von FHEM ist nur lokal simpel möglich. Ist der Server irgendwo im Netzwerk oder im Docker Container, muss man andere Möglichkeiten finden. Der Neustart aus FHEM ist zwar praktisch, aber nicht erforderlich. &lt;br /&gt;
&lt;br /&gt;
Wird eine existierenden Sonos Landschaft inhaltlich verändert (Player dazu/weg), muss der Server neu gestartet werden. Werden Player temporär abgeschaltet, merkt das der Server nach einer Zeit selbst, oder man forciert dies mit einem CheckSubscription an der Bridge.&lt;br /&gt;
&lt;br /&gt;
Soll das Modul sonos2mqtt mit seinen default Einstellungen gestartet werden, genügt dieser kurze Befehl (in der FHEM Kommandozeile):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;pm2 start sonos2mqtt&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Tipp: Verwendet man anstatt &amp;quot;Befehl&amp;quot; den Syntax {qx(Befehl)} in der FHEM Kommandozeile, wirkt der Befehl zwar blockierend aber die Ausgabe erfolgt im Browser und nicht im Logfile. Mit dem Parameter -s erfolgt keine Ausgabe.&lt;br /&gt;
&lt;br /&gt;
==== Autostart von sonos2mqtt mit FHEM ====&lt;br /&gt;
Der Code startet sowohl das sonso2mqtt Modul sofort und implementiert ein notify für den zukünftigen automatischen Start beim Start von FHEM.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start &amp;quot;pm2 -s start sonos2mqtt&amp;quot;&lt;br /&gt;
trigger n_pm2_sonos start&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Autostart von sonos2mqtt im System mit pm2 (Alternative) ===&lt;br /&gt;
Der obige Code startet das sonos2mqtt nodejs Modul mit pm2 beim Start von FHEM. Sollte das nicht funktionieren oder nicht ins gesamte Konzept passen (weil z.B. mehrere nodejs Module geladen werden) kann der automatische Start direkt im System erfolgen. Zunächst dafür das oben eventuell schon definierte notify löschen!&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
delete n_pm2_sonos&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Start des Modul muss nicht mit erhöhten Rechten geschehen! Im Terminal folgendes eingeben (unter dem angemeldeten Benutzer wird sonos2mqtt später immer gestartet):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pm2 start sonos2mqtt&lt;br /&gt;
pm2 startup&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der letzte Befehl &amp;quot;redet&amp;quot;, d.h. es gibt eine Ausgabe in der Art:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[PM2] To setup the Startup Script, copy/paste the following command:&lt;br /&gt;
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man tut einfach genau das, was dasteht: die letzte Zeile kopieren und wieder einfügen und ausführen. Danach muss man die Konfiguration von pm2 noch sichern:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pm2 save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verwendung des Docker Containers ===&lt;br /&gt;
Ergänzend zur [https://svrooij.io/sonos2mqtt/getting-started.html#run-sonos2mqtt-in-docker Original Doku:]&lt;br /&gt;
&lt;br /&gt;
Beim Container findet die Konfiguration der Verbindung zum FHEM in den Environment Variablen statt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
environment:&lt;br /&gt;
  - SONOS2MQTT_DEVICE=192.168.56.207 # hier muss einer der Sonos Lautsprecher stehen&lt;br /&gt;
  - SONOS2MQTT_MQTT=mqtt://192.168.56.121:1883 # mqtt2_server FHEM, erweiterter Syntax siehe oben&lt;br /&gt;
  - SONOS_LISTENER_HOST=192.168.56.121 # Docker host IP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sonos2mqtt mit mehr Komfort ===&lt;br /&gt;
Im Wiki Artikel [[Sonos2mqtt]] geht es weiter.&lt;br /&gt;
&lt;br /&gt;
== Owntracks GPS Tracking in FHEM über MQTT - Cloud ==&lt;br /&gt;
Das hier gezeiget Beispiel verwendet eine MQTT Instanz im Internet, die mit einem MQTT2_CLIENT angebunden wird. Da wenig Traffic benötigt wird, genügt z.B. eine kostenfreie Instanz z.B. bei myqtthub (Stand. Dezember 2020)&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man einen MQTT2_SERVER auch direkt verfügbar machen, wenn man sich sicher ist was man da tut! Siehe {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}}. Das Bridge Device wird dabei genau so benötigt, nur der IODev ist dann der MQTT2_SERVER.&lt;br /&gt;
&lt;br /&gt;
=== owntracks auf dem Smartphone konfigurieren ===&lt;br /&gt;
Menü / Einstellung / Verbindung &lt;br /&gt;
&lt;br /&gt;
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):&lt;br /&gt;
* Modus -&amp;gt; MQTT&lt;br /&gt;
* Hostname  -&amp;gt; &lt;br /&gt;
** Hostnamen: host.cloud.com &lt;br /&gt;
** Port: 8883 &lt;br /&gt;
** ClientID: ID vom Provider &lt;br /&gt;
** WebSockets (nicht nutzen)&lt;br /&gt;
* Identifikation -&amp;gt; &lt;br /&gt;
** Benutzername: user-name &lt;br /&gt;
** Passwort: user-password &lt;br /&gt;
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)&lt;br /&gt;
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte)&lt;br /&gt;
* Sicherheit -&amp;gt; &lt;br /&gt;
** TLS aktivieren&lt;br /&gt;
=== Definition in FHEM ===&lt;br /&gt;
Der MQTT2_CLIENT wird so eingerichtet, man braucht eine andere ClientID als auf dem Smartphone! Stimmt alles sollte das Gerät sofort open anzeigen.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MQTT2_CLIENT einrichten, autocreate simpel&lt;br /&gt;
define mqtt2Cloud MQTT2_CLIENT host.cloud.com:8883&lt;br /&gt;
attr mqtt2Cloud SSL 1&lt;br /&gt;
attr mqtt2Cloud autocreate simple&lt;br /&gt;
attr mqtt2Cloud clientId fhem1&lt;br /&gt;
attr mqtt2Cloud room MQTT2_IO&lt;br /&gt;
attr mqtt2Cloud username user-name&lt;br /&gt;
set mqtt2Cloud password user-password&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die automatische Erzeugung der Trackergeräte in FHEM richtig man zuerst ein Bridge Device ein:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define MQTT2_Cloud_bridge MQTT2_DEVICE&lt;br /&gt;
attr MQTT2_Cloud_bridge IODev mqtt2Cloud&lt;br /&gt;
attr MQTT2_Cloud_bridge autocreate 1&lt;br /&gt;
attr MQTT2_Cloud_bridge room MQTT2_DEVICE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dies wird entweder mit dem Template allgemein  konfiguriert&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set MQTT2_Cloud_bridge attrTemplate MQTT2_CLIENT_general_bridge&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;oder manuell nur für owntracks eingerichtet&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr MQTT2_Cloud_bridge bridgeRegexp owntracks/[^/]+/([^/:]+).* &amp;quot;owntracks_$1&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;MQTT2 Geräte für owntracks werden jetzt automatisch mit dem Namen MQTT2_owntracks_&amp;lt;GeräteID&amp;gt; erzeugt. Diese werden einfach mit dem Template owntracks_device fertig konfiguriert. Bei einem IOS Gerät kann man danach noch das Template owntracks_device_IOS als Erweiterung anwenden.&lt;br /&gt;
&lt;br /&gt;
==== Anwesenheitserkennung ====&lt;br /&gt;
Die Anwesenheit kann im owntracks Device direkt für die selbst definierten Plätze abgelesen werden: entweder steht im reading place der jeweilige Ort oder away. Um hier noch eine gewisse Einheitlichkeit in der Verwendung zu bekommen kann man ein PRESENCE Device verwenden: &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define OT_Mi6 PRESENCE event MQTT2_owntracks_mi6:place:.away MQTT2_owntracks_mi6:place:.&amp;lt;Home&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Im Move Modus erfolgt die Erkennung sehr schnell und damit einige Sekunden eher als eine BT Erkennung im Haus - der Akkuverbrauch steigt enorm. Im Significant Modus kann es schon mal ein paar Minuten dauern - ein relevanter Akku Verbrauch ist nicht erkennbar.&lt;br /&gt;
&lt;br /&gt;
== Owntracks GPS Tracking in FHEM direkt an den eigenen Fhem-Server ==&lt;br /&gt;
Dieses Beispiel beschreibt den direkten MQTT2 Zugang wobei das IODev dann der MQTT2_SERVER ist. Hierzu bitte {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}} lesen.&lt;br /&gt;
&lt;br /&gt;
=== SSL - Zertifikate fuer fhem erstellen. ===&lt;br /&gt;
Zunächst erstellen wir fuer den MQTT - Server CA zertifizierte SSL Zertifikate. Diese sind identisch mit den SSL - Zertifikaten, welche man evtl. schon fuer den SSL - Zugang seines FHEMWEB - Device erstellt hat. &lt;br /&gt;
&lt;br /&gt;
Hat man den FHEMWEB schon mit eiem SSL Zertifikat (http&#039;&#039;&#039;&amp;lt;u&amp;gt;s&amp;lt;/u&amp;gt;&#039;&#039;&#039;://) abgesichert, muss man daraus nur noch den .p12 - Container erstellen. &lt;br /&gt;
&lt;br /&gt;
Hat man den FHEMWEB noch nicht abgesichert (http://), dann wir es höchste Zeit! &lt;br /&gt;
&lt;br /&gt;
Für die Erstellung dieser SSL Zertifikate folgt dem Wiki-Beitrag [[FHEM mit HTTPS SSL-Zertifikat und eine eigene Zertifizierungsstelle]]. &lt;br /&gt;
&lt;br /&gt;
Die darin beschriebenen Dateien, das cacert.pem sowie den server.p12 - Container müsst ihr nun an euer Mobiltelefon senden.&lt;br /&gt;
&lt;br /&gt;
=== Definition in FHEM ===&lt;br /&gt;
Der MQTT2_Server wird wie folgt eingerichtet.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define myMQTT2Server_extern MQTT2_SERVER IPV6:1884 global&lt;br /&gt;
attr MQTTBroker_extern SSL 1&lt;br /&gt;
attr MQTTBroker_extern autocreate complex&lt;br /&gt;
attr MQTTBroker_extern event-on-change-reading .*&lt;br /&gt;
attr MQTTBroker_extern group MQTT2&lt;br /&gt;
attr MQTTBroker_extern icon mqtt_broker&lt;br /&gt;
attr MQTTBroker_extern room MQTT2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der MQTT2_Server wird zusätzlich über &amp;quot;allowed&amp;quot; abgesichert:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define allowed_MQTT2Server_extern allowed&lt;br /&gt;
attr allowed_MQTT2Server_extern DbLogExclude .*&lt;br /&gt;
attr allowed_MQTT2Server_extern group MQTT2&lt;br /&gt;
attr allowed_MQTT2Server_extern room  MQTT2&lt;br /&gt;
attr allowed_MQTT2Server_extern validFor myMQTT2Server_extern&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Jetzt vergeben wir noch einen Usernamen und ein Passwort für dieses &amp;quot;allowed&amp;quot; - Device&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set allowed_MQTT2Server_extern basicAuth MyMQTT2Username MyMQTT2Password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Denkt bitte daran einen eigenen Usernamen und ein eigenes langes, kompliziertes Passwort zu verwenden. Vorsicht bei Sonderzeichen!&lt;br /&gt;
&lt;br /&gt;
=== Port-Freigaben im Router ===&lt;br /&gt;
An dieser Stelle müssen wir den Port 1884 in den Internet - Freigaben eures Routers freigeben.&lt;br /&gt;
&lt;br /&gt;
Bei der Fritz!Box wird dies beispielsweise unter Internet -&amp;gt; Freigaben -&amp;gt; Port-Freigaben gemacht. Die Details hierzu entnehmt bitte der Bedienungsanleitung eures Routers.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist dabei, das ihr das Protokol &amp;quot;TCP&amp;quot; verwendet und der Port 1884 extern nach Port 1884 intern an die IP - Adresse des jeweiligen fhem-Servers übermittelt wird.&lt;br /&gt;
&lt;br /&gt;
=== owntracks auf dem Smartphone konfigurieren ===&lt;br /&gt;
Menü / Einstellung / Verbindung &lt;br /&gt;
&lt;br /&gt;
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):&lt;br /&gt;
* Modus -&amp;gt; MQTT&lt;br /&gt;
* Hostname  -&amp;gt; &lt;br /&gt;
** Hostnamen: subdomain.dyndns.com &lt;br /&gt;
** Port: 1884 &lt;br /&gt;
** ClientID: Vorname_Nachname &lt;br /&gt;
** WebSockets (nicht nutzen)&lt;br /&gt;
* Identifikation -&amp;gt; &lt;br /&gt;
** Benutzername: MyMQTT2Username &lt;br /&gt;
** Passwort: MyMQTT2Password &lt;br /&gt;
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)&lt;br /&gt;
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte. Empfehlung: Die Initialien verwenden.)&lt;br /&gt;
* Sicherheit -&amp;gt; &lt;br /&gt;
** TLS aktivieren&lt;br /&gt;
** CA-Zertifikat: cacert.pem&lt;br /&gt;
** Client-Zertifikat: server.p12&lt;br /&gt;
** Passwort fuer Client-Zertifikat: Passwort für den server.p12 - Container&lt;br /&gt;
&lt;br /&gt;
Wenn alles richtig gemacht wurde, dann erstellt das myMQTT2Server_extern - Device automatisch ein neues Device für jede owntracks-App, die sich an dem myMQTT2Server_extern - Device meldet.&lt;br /&gt;
&lt;br /&gt;
Übrigens: Will man seine gesamte Familie ebenfalls über owntracks tracken, so muss man in den jeweiligen APPs nur die Werte für ClientID, GeräteID und TrackerID individuell gestalten. &lt;br /&gt;
&lt;br /&gt;
An den fhem- Einstellungen müssen keine weiteren Änderungen vorgenommen werden.&lt;br /&gt;
== Allgemeine Hinweise ==&lt;br /&gt;
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===&lt;br /&gt;
Nutzt man das rawEvents-Attribut am MQTT2-IO&amp;lt;ref&amp;gt;z.B. &amp;lt;code&amp;gt;attr MQTT2_FHEM_Server rawEvents .*&amp;lt;/code&amp;gt;, der regex-Filter kann wie üblich angepasst werden&amp;lt;/ref&amp;gt;, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.&lt;br /&gt;
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit &amp;lt;code&amp;gt;attr mqtt2_server verbose 5&amp;lt;/code&amp;gt; auch alles ins FHEM-Log schreiben lassen.&lt;br /&gt;
&lt;br /&gt;
=== autocreate funktioniert anscheinend nicht? ===&lt;br /&gt;
In der Regel wird bei neu eingehenden MQTT-Messages über &#039;&#039;autocreate&#039;&#039; ein neues Device erstellt, wenn Nachrichten von einem bisher unbekannten Gerät kommen. Geschieht dies nicht, sollten folgende Punkte geprüft werden:&lt;br /&gt;
# (nur bei MQTT2_SERVER:) Der Client muss eine ClientID angeben, diese darf nicht den defaults von &#039;&#039;mosquito_sub&#039;&#039; entsprechen.&lt;br /&gt;
# Ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) muss vorhanden und aktiv sein.&lt;br /&gt;
# &#039;&#039;autocreate&#039;&#039; am IO muss eingeschaltet sein, was für MQTT2_SERVER bedeutet, dass es nicht auf &amp;quot;0&amp;quot; stehen darf (hier ist dann &#039;&#039;simple&#039;&#039; die aktive Voreinstellung), für MQTT2_CLIENT sollte ebenfalls &#039;&#039;simple&#039;&#039; verwendet werden; dies muss hier allerdings explizit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Wird dann immer noch kein Device erstellt, gibt es in aller Regel ein Device, das bereits einen entsprechenden Eintrag in der readingList enthält, oder es sind keine Nachrichten eingegangen. Überprüfen Sie daher dann ggf. die Einstellungen am Client-Gerät (z.B. im Web-Interface des Shelly oder Tasmota-geflashten ESP8266).&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;autocreate&#039;&#039; am Device schließlich bestimmt, ob die &#039;&#039;readingsList&#039;&#039; erweitert werden darf, wenn Informationen über bisher nicht über die readingList abgedeckte Topics empfangen werden und vom MQTT2-IO als zu diesem Device/ClientID gehörend identifiziert wurden.&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Die per attrTemplate jeweils erzeugten Konfigurationen sind Einrichtungsbeispiele, die v.a. eine in sich konsistenze Zusammenstellung der verschiedenen Attribute enthalten. Es steht jedem User frei, diese Ausgangsbasis dann nach seinem Belieben zu ändern. Spätere Änderungen des verwendeten attrTemplate wirken sich nicht automatisch auf die durch frühere Versionen oder den User nachkonfigurierte Geräte aus! Da es vorkommen kann, dass sich die per MQTT übermittelten Daten und Topics ändern, wenn z.B. eine firmware aktualisiert wurden, kann dies Anpassungen am jeweiligen Template erforderlich machen. Grundsätzlich sollen die per attrTemplate für MQTT2_DEVICE verfügbaren attrTemplate jeweils für die aktuellste verfügbare stabile firmware-Version passen.}}&lt;br /&gt;
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; genutzt werden. &lt;br /&gt;
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate: Es werden nicht alle templates angezeigt ===&lt;br /&gt;
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate und Sprachsteuerung ===&lt;br /&gt;
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; dem betreffenden Hauptartikel zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
=== bridgeRegexp ===&lt;br /&gt;
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch &#039;&#039;&#039;&#039;&#039;einem&#039;&#039;&#039;&#039;&#039; &#039;&#039;MQTT2_DEVICE&#039;&#039; zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. In dem nebenstehenden Schaubild wären dies die Geräte &#039;&#039;A&#039;&#039; bis &#039;&#039;D&#039;&#039;. Das &#039;&#039;&#039;Attribut&#039;&#039;&#039; &#039;&#039;bridgeRegexp&#039;&#039; kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem &#039;&#039;&#039;anderen Device&#039;&#039;&#039; (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als &#039;&#039;newClientId&#039;&#039; hinterlegte Angabe verwendet. In nebenstehendem Schaubild ist dies exemplarisch für die Gerätegruppe &#039;&#039;D&#039;&#039; mit dem &#039;&#039;bridge&#039;&#039;-Device &#039;&#039;D&#039;&#039; und dessen &#039;&#039;Satelliten&#039;&#039; &#039;&#039;D1&#039;&#039; bis &#039;&#039;D4&#039;&#039; dargestellt.&lt;br /&gt;
Dementsprechend sind in den hier aufgeführten Beispielen &#039;&#039;bridgeRegexp&#039;&#039;-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren, wie z.B. für über hier dargestellten &#039;&#039;zigbee2mqtt&#039;&#039; oder &#039;&#039;zigbee2tasmota&#039;&#039;. Ein Sonderfall hierbei ist das template &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem &#039;&#039;mosquitto&#039;&#039;-Server und würden sonst alle ein und demselben MQTT2_DEVICE zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Ständig neue Devices? ===&lt;br /&gt;
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:&lt;br /&gt;
==== Vergabe einer ClientID ====&lt;br /&gt;
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). &lt;br /&gt;
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID&#039;s. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.&lt;br /&gt;
&lt;br /&gt;
==== Löschen der ClientID aus der readingList usw. ====&lt;br /&gt;
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den &#039;&#039;default&#039;&#039; &amp;quot;sonoff&amp;quot; zu ändern).&lt;br /&gt;
Beispielsweise wäre &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt; zu ändern in &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt;&lt;br /&gt;
Die über &#039;&#039;attrTemplate&#039;&#039; verfügbaren Konfigurationen verwenden in der Regel keine ClientID&#039;s bzw. entfernen diese.&lt;br /&gt;
&lt;br /&gt;
=== Wildcards in readingList und setList ===&lt;br /&gt;
Auch in readingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;readingList&#039;&#039; werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise durch einen &amp;quot;/&amp;quot;) kann man so schreiben: &amp;quot;[^/]+&amp;quot; (entspricht: &amp;quot;Mindestens ein Zeichen, das kein Schrägstrich ist&amp;quot;). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;setList&#039;&#039; gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht &amp;quot;+&amp;quot; für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es &amp;quot;Gruppen-Topics&amp;quot;, auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.&lt;br /&gt;
&lt;br /&gt;
=== Die JSON-Daten sollen ausnahmsweise nicht ausgepackt werden ===&lt;br /&gt;
In manchen Fällen ist das automatische Auspacken der JSON-Payload nicht erwünscht. In diesen Fällen kann man einfach den gewünschten Reading-Namen in die readingList eintragen, statt der Anweisung, den JSON an json2NameValue() zu übergeben. Aus&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* { json2nameValue($EVENT) }\&lt;br /&gt;
owntracks/clouduser/mi6/waypoints:.* { json2nameValue($EVENT) }\&lt;br /&gt;
owntracks/clouduser/mi6/event:.* { json2nameValue($EVENT) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
wird dann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* json_mi6\&lt;br /&gt;
owntracks/clouduser/mi6/waypoints:.* json_waypoints\&lt;br /&gt;
owntracks/clouduser/mi6/event:.* json_event&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erforderlichenfalls kann man die Einträge auch doppelt erstellen, um sowohl den JSON wie auch die ausgepackten Readings zu erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Die JSON-Daten vor dem auspacken manipulieren ===&lt;br /&gt;
Aus diversen Gründen kann es zweckmäßig sein, einen bestimmten Wert der JSON-Payload zu ignorieren.&lt;br /&gt;
Z.B. sendet ein Client statt eines Messwertes die Info &amp;quot;bad&amp;quot;. Dieser Fehlerwert soll aus der JSON-Payload &amp;quot;ausgefiltert&amp;quot; werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr DEVICE readingList &amp;lt;your topic&amp;gt;:.* { my $rets = json2nameValue($EVENT,&#039;&#039;,$JSONMAP);; my %cleaned = map { $_,$rets-&amp;gt;{$_} } grep { &#039;bad&#039; ne $rets-&amp;gt;{$_} } keys %{$rets};; return \%cleaned }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Numerische Werte zuvor runden :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr DEVICE readingList &amp;lt;your topic&amp;gt;:.* { my $h=json2nameValue($EVENT,&#039;XXX&#039;);; map { $h-&amp;gt;{$_}=round($h-&amp;gt;{$_}) if(looks_like_number($h-&amp;gt;{$_})) } keys %{$h};; $h }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Einfache Payload ====&lt;br /&gt;
Einen Wert mappen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr DEVICE readingList &amp;lt;your topic&amp;gt;:.* {my %h=(0=&amp;gt;&#039;SofortLaden&#039;,1=&amp;gt;&#039;MinPV&#039;,2=&amp;gt;&#039;NurPV&#039;,3=&amp;gt;&#039;Stop&#039;,4=&amp;gt;&#039;Standby&#039;);; return {ChargeMode=&amp;gt;$h{$EVENT}}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unnötige Konfigurationsinformationen verwerfen ===&lt;br /&gt;
Siehe Einleitung und den [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp-Abschnitt zu MQTT2_CLIENT]].&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Themen ===&lt;br /&gt;
==== Verbinden mehrerer FHEM-Instanzen über MQTT ====&lt;br /&gt;
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeugen kann. So kann man z.B. Messdaten eines Systems über ein &#039;&#039;notify&#039;&#039; iVm. einer einfachen &#039;&#039;publish&#039;&#039;-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.&lt;br /&gt;
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten &#039;&#039;bridgeRegexp&#039;&#039; automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:&lt;br /&gt;
 attr MQTT2_myMqttServer bridgeRegexp \&lt;br /&gt;
   SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* &amp;quot;mgb2_$1&amp;quot;&lt;br /&gt;
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema &#039;&#039;SmartHome/MqttGenericBridge2/&amp;lt;Device-Name&amp;gt;/&amp;lt;Reading-Name&amp;gt;&#039;&#039; versendet.&lt;br /&gt;
&lt;br /&gt;
==== Umstellung von MQTT_DEVICE (und Derivaten wie XiaomiMQTTDevice) zu MQTT2_DEVICE ====&lt;br /&gt;
Wer beabsichtigt, von der Implementierung MQTT+MQTT_DEVICE zu MQTT2-IO und MQTT2_DEVICE zu wechseln, sollte einige Punkte beachten. Viele diesbezügliche Fragen sind vor allem in  {{Link2Forum|Topic=103762|LinkText=diesem Foren-Thread}}&lt;br /&gt;
&lt;br /&gt;
näher erläutert.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}&lt;br /&gt;
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}&lt;br /&gt;
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}&lt;br /&gt;
* {{Link2Forum|Topic=116162|LinkText=Der MQTT-Workshop für MQTT2-Module}}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Notify&amp;diff=38341</id>
		<title>Notify</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Notify&amp;diff=38341"/>
		<updated>2023-04-29T15:04:49Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Syntax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:notify}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Ausführung von Anweisung(en) als Reaktion auf Ereignisse&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=notify&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=91_notify.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
{{Hinweis|Weitere grundlegende Informationen/Beispiele zu notify enthält [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM]}}&lt;br /&gt;
Das Hilfsmodul notify dient dazu [[Ereignis|Ereignisse]] über ein Suchmuster zu erkennen und bei einem Treffer eine Aktion auszulösen. Mit &#039;&#039;notify&#039;&#039; und anderen [[Eventhandler|Eventhandlern]] &amp;lt;ref&amp;gt;hierzu gehören u.a. auch [[DOIF]], [[THRESHOLD]] und [[watchdog]]&amp;lt;/ref&amp;gt; ist es möglich, Logikfunktionen im FHEM abzubilden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039; &lt;br /&gt;
* Wird das Licht in der Küche eingeschaltet, soll FHEM dort auch das Radio einschalten. &lt;br /&gt;
* Bei Druck auf einen Taster soll die Umwälzpumpe für das Warmwasser eingeschaltet werden. &lt;br /&gt;
* Erweiterte Möglichkeiten: Aber nur, wenn das Radio aus ist bzw. die Temperatur im Rücklauf des Warmwassers unterhalb einer bestimmten Schwelle liegt&amp;lt;ref&amp;gt;vgl. hierzu z.B. {{Link2CmdRef|Anker=devspec|Label=FILTER}} und [[if-condition]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; notify &amp;lt;Suchmuster&amp;gt; &amp;lt;command&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;[[Regulärer Ausdruck|Suchmuster]]&#039;&#039;  (häufig als Regexp = regular expression = regulärer Ausdruck bezeichnet) ist sehr wichtig: Es ist entweder der Name des auslösenden (&amp;quot;triggernden&amp;quot;) Gerätes oder die Kombination aus Gerät und auslösendem Ereignis (Event) &amp;lt;code&amp;gt;Gerätename:Event&amp;lt;/code&amp;gt;. Die Events kann man dem [[Event_monitor|Event-Monitor]] entnehmen. Wenn dort z.B. &amp;lt;code&amp;gt;Rollo1&amp;lt;/code&amp;gt; steht, dann reagiert &#039;&#039;notify&#039;&#039; auf &amp;lt;code&amp;gt;Rollo1 on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Rollo1 off&amp;lt;/code&amp;gt; usw.&lt;br /&gt;
&lt;br /&gt;
Wenn man mehrere Suchmuster kombinieren möchte, kann man diese in Klammer schreiben, als Trenner wird dann Pipe (|) genutzt: &amp;lt;code&amp;gt;(Rollo1|Rollo2|Steckdose5)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auch die Verwendung von Platzhaltern ist möglich&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;code&amp;gt;Rollo.&amp;lt;/code&amp;gt; → das notify reagiert auf alles was mit Rollo und &#039;&#039;&#039;einem&#039;&#039;&#039; weiteren beliebigen Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg&lt;br /&gt;
* &amp;lt;code&amp;gt;Rollo.*&amp;lt;/code&amp;gt; → notify reagiert auf alles das mit Rollo beginnt&lt;br /&gt;
* &amp;lt;code&amp;gt;.*isch&amp;lt;/code&amp;gt; → auf alles das mit isch aufhört (Tisch, Fisch)&lt;br /&gt;
* &amp;lt;code&amp;gt;Schalter(1|2|3)&amp;lt;/code&amp;gt; → hört auf Schalter1, Schalter2 und Schalter3&lt;br /&gt;
* &amp;lt;code&amp;gt;dimmer:pct:.(100|7[6-9]|[89][0-9])&amp;lt;/code&amp;gt;  → reagiert, wenn pct einen Wert über 75 annimmt.&lt;br /&gt;
&lt;br /&gt;
Suchmuster/Regex kann man im Internet beispielsweise auf [http://regexpal.com/| http://regexpal.com/] testen.&lt;br /&gt;
&lt;br /&gt;
Es gibt seit Juli 2020 eine Perlfunktion notifyRegexpCheck zum Testen, wie FHEM über das Suchmuster &amp;quot;denkt&amp;quot; - siehe {{Link2Forum|Topic=111938|Message=1074202|LinkText=diesen Beitrag}} im Forum.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Das &#039;&#039;&#039;Suchmuster&#039;&#039;&#039; wird notify-intern um das Zeichen ^ (beginnt mit) und das Zeichen $ (endet mit) ergänzt&amp;lt;ref&amp;gt;Der Eventhandler [[DOIF]] verwendet die in Perl übliche Syntax für reguläre Ausdrücke als DOIF-Suchmuster.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Deshalb darf das Suchmuster nicht mit einem üblichen [[Regulärer Ausdruck|&#039;&#039;&#039;Regulären Ausdruck&#039;&#039;&#039;]], wie er in Perl&amp;lt;ref&amp;gt;https://perldoc.perl.org/perlre.html&amp;lt;/ref&amp;gt; verwendet wird, gleichgesetzt werden, da die Ergänzung zu einem grundsätzlich unterschiedlichen Verhalten führt, siehe nachstehendes Beispiel.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel für das unterschiedliche Verhalten von &#039;&#039;Suchmuster&#039;&#039; und &#039;&#039;regulären Ausdruck&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für einen &#039;&#039;&#039;regulären Audruck&#039;&#039;&#039; gilt: Wenn  der reguläre Ausdruck &#039;&#039;lampe&#039;&#039; ist und das [[Ereignis]] &#039;&#039;tischlampe&#039;&#039; dann passen &#039;&#039;tischlampe&#039;&#039; und &#039;&#039;lampe&#039;&#039; zueinander.&lt;br /&gt;
&lt;br /&gt;
Für das &#039;&#039;&#039;Suchmuster&#039;&#039;&#039; gilt: Wenn  das Suchmuster &#039;&#039;lampe&#039;&#039; ist und das [[Ereignis]] &#039;&#039;tischlampe&#039;&#039; dann passen &#039;&#039;tischlampe&#039;&#039; und &#039;&#039;lampe&#039;&#039; &#039;&#039;&#039;nicht&#039;&#039;&#039; zueinander, weil das Suchmuster zu ^lampe$ ergänzt wird und damit exakt nur auf &#039;&#039;lampe&#039;&#039; matcht (passt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen Zuordnung zum Event&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  2020-01-21 22:40:39 HUEDevice VibrationTest1 battery: 88&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !!$NAME !! colspan=&amp;quot;2&amp;quot; |$EVENT&lt;br /&gt;
|-&lt;br /&gt;
| ||||$EVTPART0 ||$EVTPART1&lt;br /&gt;
|-&lt;br /&gt;
|2020-01-21 22:40:39 HUEDevice|| VibrationTest1|| battery:|| 88&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 2&#039;&#039;&#039;&lt;br /&gt;
  2021-05-09 19:11:43 FB_CALLMONITOR cm_example external_name: Graf Herzog von und zu ...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !!$NAME !! colspan=&amp;quot;7&amp;quot; |$EVENT&lt;br /&gt;
|-&lt;br /&gt;
| ||||$EVTPART0 ||$EVTPART1 || $EVTPART2|| $EVTPART3 || $EVTPART4|| $EVTPART5|| ...&lt;br /&gt;
|-&lt;br /&gt;
|2021-05-09 19:11:43 FB_CALLMONITOR|| cm_example|| external_name:|| Graf|| Herzog|| von|| und|| zu|| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  2023-04-29 16:53:04 dummy Demo closed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !!$NAME !! colspan=&amp;quot;1&amp;quot; |$EVENT&lt;br /&gt;
|-&lt;br /&gt;
| ||||$EVTPART0&lt;br /&gt;
|-&lt;br /&gt;
|2023-04-29 16:53:04 dummy|| Demo|| closed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FHEMWEB-unterstütztes Anlegen eines notify ==&lt;br /&gt;
{{Hinweis|Die Erstellung eines notify und insbesondere die korrekte Angabe des Suchmusters (Regex) führt gerade bei Einsteigern immer wieder zu Schwierigkeiten. Zur Fehlerminimierung empfiehlt es sich zum einen, die [[Konfiguration]] nicht direkt zu bearbeiten, sondern die &amp;quot;Befehl-Eingabezeile&amp;quot;, die &amp;quot;Objektdetails&amp;quot; oder den [[Import von Code Snippets|Import von RAW-Definitionen]] zur Bearbeitung zu nutzen.}}&lt;br /&gt;
&lt;br /&gt;
=== Event Monitor ===&lt;br /&gt;
Die komfortabelste Möglichkeit, die häufigsten Event-Handler zu erstellen, bietet der [[Event monitor|Event-Monitor]]. Die Vorgehensweis ist in dem zugehörigen Artikel dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Regexp wizard ===&lt;br /&gt;
Zudem enthält FHEM einen Regexp wizard mit dem Regex anhand der in FHEM vorhandenen Devices und deren Events aus einer Auswahlbox selektiert werden können. Voraussetzungen sind:&lt;br /&gt;
* Aktivierung des Hilfsmoduls [[eventTypes]] (bei allen Neuinstallationen Standard) &lt;br /&gt;
* das gesuchte Ereignis (Event) ist nach Aktivierung des Hilfsmoduls bereits mindestens einmal eingetreten&lt;br /&gt;
&lt;br /&gt;
Schrittweise Darstellung der Nutzung des Regexp wizard zur Anlage eines &amp;quot;notify&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
In das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] eingeben und mit {{Taste|Enter}} bestätigen:&lt;br /&gt;
 define ntest notify a b&lt;br /&gt;
Als Beispiel wird ein notify mit &amp;lt;name&amp;gt; &amp;quot;ntest&amp;quot; angelegt. &amp;quot;a&amp;quot; und &amp;quot;b&amp;quot; sind beliebige Platzhalter für &amp;lt;Suchmuster&amp;gt; und &amp;lt;Command&amp;gt;, die bei der weiteren Bearbeitung mit dem endgültigen Werten ersetzt werden.&lt;br /&gt;
Der Regexp wizard öffnet sich:&lt;br /&gt;
[[Datei:Regexp wizard1.JPG|400px|thumb|center]]&lt;br /&gt;
Nun in der Auswahlbox das auslösende Event (Ereignis) auswählen; zunächst das Device und dann das gewünschte Regex. Hier soll das notify bei jeder Veränderung der Temperatur (temperature.*) des Device BTHR918N reagieren. Abschließend mit einem Mausklick auf {{Taste|set}} bestätigen. Wählt man mehrere Regex in dieser Weise aus, so wird das &amp;quot;notify&amp;quot; bei Eintritt jedes dieser Events ausgeführt:&lt;br /&gt;
[[Datei:Regexp wizard2.JPG|400px|thumb|center]]&lt;br /&gt;
Anschließend den Platzhalter &amp;quot;a&amp;quot; mit Klick auf den Link &amp;quot;removeRegexpPart&amp;quot; löschen:&lt;br /&gt;
[[Datei:Regexp wizard3.JPG|400px|thumb|center]]&lt;br /&gt;
Den Link &amp;quot;DEF&amp;quot; anklicken, damit sich der DEF-Editor öffnet:&lt;br /&gt;
[[Datei:Regexp wizard4.JPG|400px|thumb|center]]&lt;br /&gt;
Jetzt den auszuführenden Befehl im &amp;quot;DEF&amp;quot;-Bereich durch Überschreiben des Platzhalters &amp;quot;b&amp;quot; eintragen und mit Klick auf {{Taste|modify ntest}} abschließen:&lt;br /&gt;
[[Datei:Regexp wizard5.JPG|400px|thumb|center]]&lt;br /&gt;
Das fertige und sofort aktive &amp;quot;notify&amp;quot; sieht abschließend folgendermaßen aus:&lt;br /&gt;
[[Datei:Regexp wizard6.JPG|400px|thumb|center]]&lt;br /&gt;
Am Schluss das Speichern über {{Taste|Save config}} nicht vergessen.&lt;br /&gt;
&lt;br /&gt;
== Mein notify geht nicht - wie kann ich mir selbst helfen: Debugging ==&lt;br /&gt;
Funktioniert ein notify nicht wie gewünscht, kann es nur zwei Hauptursachen haben: &lt;br /&gt;
* Entweder das Suchmuster paßt nicht zum gewünschten Auslöser (FHEM Device), und/oder&lt;br /&gt;
* die Anweisung enthält einen Fehler. &lt;br /&gt;
Sollte kein Fehler im Logfile auftauchen aber das notify ausgelöst werden, stimmt meist der Übertragungsweg zum Zieldevice nicht.&lt;br /&gt;
Der STATE des notify zeigt normalerweise mit Datum/Uhrzeit die letzte Auslösung an.&lt;br /&gt;
&lt;br /&gt;
Beim Debuggen sollte man daher beide Elemente getrennt untersuchen. Hier ein Beispiel welches nicht wie gewünscht funktioniert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt; define n_test notify n_test:muster Ausführungsteil&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zum debuggen benötigen wir &lt;br /&gt;
* den [[Event monitor]]&lt;br /&gt;
* das [https://fhem.de/commandref.html#trigger trigger-Kommando] - kann man jederzeit verwenden um das Suchmuster als Event unabhängig vom Auslöser zu erzeugen.&lt;br /&gt;
* die FHEM Kommandozeile&lt;br /&gt;
* den [[DEF-Editor]]&lt;br /&gt;
* eventuell einen Texteditor um Codeblöcke zwischen zu lagern und Notizen zu machen.&lt;br /&gt;
&lt;br /&gt;
Das Suchmuster im Beispiel notify triggert auf sich selbst, es soll auf jeden Event mit dem Inhalt &#039;&#039;&#039;muster&#039;&#039;&#039; ausgelöst werden, Beispiel:&lt;br /&gt;
  2018-07-14 14:31:03 notify n_test muster bild&lt;br /&gt;
&lt;br /&gt;
=== Suchmuster ===&lt;br /&gt;
Sollte das notify nicht funktionieren:&lt;br /&gt;
* keine Reaktion wie gewünscht&lt;br /&gt;
* keine Fehlermeldung in der Weboberfläche beim Anlegen, keine Fehlermeldung im Logfile&lt;br /&gt;
* STATE ist unverändert auf active oder einem altem Datum/Uhrzeit&lt;br /&gt;
liegt der Fehler mit Sicherheit im Suchmuster. Man hat die Chance das Suchmuster mit dem trigger Befehl zu erzeugen und zu schauen ob die Anweisung ausgeführt wird. Dabei ist zu beachten: Der erste &amp;quot;:&amp;quot; im Suchmuster ist zusätzlich zwischen Gerät und Event als Trennung. Jeder weiter : ist, wenn vorhanden, Bestandteil des Events! Siehe dazu den Abschnitt [https://fhem.de/commandref_DE.html#notify Hinweise in der commandref]&lt;br /&gt;
*Im Beispiel: Event: n_test muster -&amp;gt; Suchmuster n_test:muster&lt;br /&gt;
Um aus dem [[Event]] ein passendes Suchmuster zu erzeugen kann der [[Event monitor|Event-Monitor]] direkt verwendet werden. Man kann ein neues notify erzeugen oder ein Bestehendes modifizieren lassen.&lt;br /&gt;
&lt;br /&gt;
Unser Regex im Beispiel ist zu spezifisch, es triggert nur exakt auf &#039;&#039;&#039;muster&#039;&#039;&#039;. Dieser Trigger erzeugt den folgenden Eintrag im Eventmonitor, entspricht exakt dem Suchmuster und löst das notify aus:&lt;br /&gt;
  trigger n_test muster&lt;br /&gt;
  2018-07-13 11:52:08 notify n_test muster&lt;br /&gt;
Das Suchmuster für unsere Anforderung muss in &amp;lt;code&amp;gt;n_test:muster.*&amp;lt;/code&amp;gt; geändert werden, damit jeder Event der mit muster beginnt das notify auslöst.&lt;br /&gt;
Der . im Regex steht für jedes beliebige Zeichen und der * für eine beliebige Anzahl des Zeichens davor: also beliebig viele beliebige Zeichen nach muster.&lt;br /&gt;
&lt;br /&gt;
Das Suchmuster wird häufig in ein komplizierteres Regex umgewandelt um im notify mehrere Aktionen zu starten. Das eigene Regex kann z.B. mit http://regexpal.com/ oder https://regex101.com/ getestet werden.&lt;br /&gt;
&lt;br /&gt;
Funktioniert der Auslöser, das notify tut aber noch nicht was es soll, müssen wir die Anweisung untersuchen. In unserem korrigierten Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt; defmod n_test notify n_test:muster.* Ausführungsteil&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
folgt beim Kommando &amp;lt;code&amp;gt;trigger n_test muster bild&amp;lt;/code&amp;gt; ein Eintrag im Log:&lt;br /&gt;
  2018.07.13 11:47:57 3: n_test return value: Unknown command Ausführungsteil, try help.&lt;br /&gt;
Das notify wurde zwar getriggert aber die Anweisung war nicht ausführbar. &lt;br /&gt;
&lt;br /&gt;
Ein richtiges Suchmuster und eine fehlerhafte Anweisung wird also normalerweise einen Fehlereintrag im Logfile erzeugen!&lt;br /&gt;
&lt;br /&gt;
=== Spezialfall: notify löst zwar aus - aber zu oft ===&lt;br /&gt;
In dem Fall ist das Suchmuster (regExp) zu unscharf oder das triggernde Gerät löst das Event zu oft aus. Das regExp sollte so genau wie möglich konstruiert werden, device:.* ist eine einfache aber oft keine gute Wahl!&lt;br /&gt;
&lt;br /&gt;
Im Device, welches den Event auslöst, kann mit den Attributen event-on-.* die Häufigkeit gesteuert werden. Insbesondere ist hier das regExp .* eine Art Standardwahl um aufeinanderfolgende gleichartige Events zu verhindern.&lt;br /&gt;
:&amp;lt;code&amp;gt;attr device event-on-change-reading .*&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039;: durch falsche Angaben kann man Events ganz leicht völlig verhindern!&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[event-on-change-reading]]&lt;br /&gt;
&lt;br /&gt;
=== Anweisung ===&lt;br /&gt;
Wird das notify getriggert oder will man ganz schnell mal ein notify testen, kann man die Anweisung durch folgenden Code ersetzen, man öffnet also einfach nur die DEF, kopiert den ursprünglichen Inhalt an einen sicheren Ort und ersetzt die Anweisung durch eine der beiden Zeilen. Die erste Zeile kann man auch einfach mal in der Kommandozeile testen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{Log 1, &amp;quot;Das Notify n_test hat ausgeloest.&amp;quot;}&lt;br /&gt;
{Log 1, &amp;quot;Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT&amp;quot;}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wird das notify ausgelöst, muss anschließend im Logfile ein Eintrag zu finden sein:&lt;br /&gt;
  2018.07.13 10:28:57 1: Das Notify n_test hat ausgeloest, der Event sah so aus: muster&lt;br /&gt;
Unsere Anweisung &amp;lt;code&amp;gt;Ausführungsteil&amp;lt;/code&amp;gt; liefert in der Kommandozeile selbst einen Fehler:&lt;br /&gt;
&amp;lt;code&amp;gt;Unknown command Ausführungsteil, try help.&amp;lt;/code&amp;gt;&lt;br /&gt;
Ein Versuch mit geschweiften Klammern &amp;lt;code&amp;gt;{Ausführungsteil}&amp;lt;/code&amp;gt; liefert wieder einen Fehler:&lt;br /&gt;
&amp;lt;code&amp;gt;Unrecognized character \xC3; marked by &amp;lt;-- HERE after {Ausf&amp;lt;-- HERE near column 6 at (eval 5977) line 1.&amp;lt;/code&amp;gt;&lt;br /&gt;
Diese Variante &amp;lt;code&amp;gt;{&amp;quot;Ausführungsteil&amp;quot;}&amp;lt;/code&amp;gt; liefert den String Ausführungsteil ohne Fehler: Das notify arbeitet fehler- aber sinnfrei.&lt;br /&gt;
Der fertige Code:&lt;br /&gt;
  defmod n_test notify n_test:muster.* {&amp;quot;Ausführungsteil&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Man kann die Anweisung, normalerweise so wie sie ist, in der FHEM Kommandozeile testen. Sind im Perl Code (in geschweiften Klammern) im DEF Editor Semikolon enthalten muss man diese für den Test in der Kommandozeile (oder Raw Def) verdoppeln.&lt;br /&gt;
Laufzeitabhängige Variablen sind in der Kommandozeile meist nicht verfügbar, diese sollte man für den Test einfach durch passende Inhalte austauschen. So kann man die komfortable Variante (loggt den Namen und das komplette Event) nicht in der Kommandozeile ausführen. &lt;br /&gt;
&lt;br /&gt;
Funktioniert ein FHEM Befehl in der Kommandozeile nicht (z.B. Lampe geht nicht an) kann es im notify auch nicht funktionieren, dann muss die Fehlersuche an anderer Stelle fortgeführt werden. &lt;br /&gt;
&lt;br /&gt;
Komplexeren Code im Ausführungsteil sollte man beim Testen in Teilabschnitte aufteilen, von der Laufzeit abhängige Variable ($NAME, $EVENT, $EVTPART) durch Strings (&amp;quot;TestWort&amp;quot;) ersetzen, die Teilabschnitte separat testen und anschließend schrittweise wieder komplettieren.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
{{Hinweis|Für die nachfolgenden Beispiele wurden einige unterschiedliche Technologien verwendet. Sie können aber recht einfach auf alle anderen Systeme übertragen werden, dabei sollte ggf. darauf geachtet werden, dass sich Schaltbefehle und Events teilweise je nach konkret eingesetzter Technologie unterscheiden können. Dann ist ggf. eine Erweiterung, z.B. durch eine [[if-condition|if-Abfrage]] erforderlich.}}&lt;br /&gt;
&lt;br /&gt;
=== Schalter entprellen ===&lt;br /&gt;
Will man ein notify innerhalb eines bestimmten Zeitraumes nur einmal auslösen lassen, auch wenn er in diesem Zeitraum mehrfach getriggered werden sollte, so bietet sich das Attribut disabledAfterTrigger an,&lt;br /&gt;
 attr &amp;lt;notify_device&amp;gt; disabledAfterTrigger &amp;lt;Anzahl Sekunden&amp;gt;&lt;br /&gt;
In dem Zeitraum wird dann nur einmal (beim ersten Mal) der Befehl ausgelöst, auch wenn mehrfach getriggered wurde. Der Zeitraum kann Bruchteile von Sekunden umfassen.&lt;br /&gt;
&lt;br /&gt;
=== Etwas schalten, wenn ein anderes Gerät geschaltet wird ===&lt;br /&gt;
&lt;br /&gt;
==== Vorbedingungen ====&lt;br /&gt;
Dieses Beispiel verwendet eine einfache InterTechno-kompatible Funksteckdose für das Radio und einen HM-Aktor für das Licht:&lt;br /&gt;
&lt;br /&gt;
 define RadioKueche IT 000000FFFF 0F F0&lt;br /&gt;
 define LichtKueche CUL_HM 3A37D6&lt;br /&gt;
Beachte: beide kennen als Event bzw. Schaltbefehle &#039;&#039;on&#039;&#039; und &#039;&#039;off&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define LichtamRadioan notify LichtKueche set RadioKueche $EVENT &lt;br /&gt;
oder alternativ: &lt;br /&gt;
 define LichtamRadioan notify LichtKueche { fhem &amp;quot;set RadioKueche $EVENT&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
* Der Name des &#039;&#039;notify&#039;&#039; &amp;quot;LichtamRadioan&amp;quot; kann frei gewählt werden, er dient nur dazu, das notify in FHEM eindeutig zu identifizieren.&lt;br /&gt;
* &amp;quot;$EVENT&amp;quot; ist ein Platzhalter für den Zustand vom Pattern. $EVENT enthält ein &amp;quot;off&amp;quot; wenn das LichtKueche aus- und ein &amp;quot;on&amp;quot; wenn das Licht eingeschaltet wird.&lt;br /&gt;
* &amp;quot;{ &amp;amp;lt;perlcode&amp;amp;gt; }&amp;quot; alles was zwischen {} steht ist Perl code. Perl kennt das Schlüsselwort fhem. Das Schlüsselwort FHEM dient dazu, FHEM Befehle auszuführen. Es wird also der FHEM Befehl &amp;quot;set RadioKueche on/off&amp;quot; ausgeführt. on oder off ist abhängig vom Pattern. Der eigentliche FHEM Befehl muss in &amp;quot; &amp;quot; stehen.&lt;br /&gt;
* Wann ist ein Wechsel auf die Perl-Ebene erforderlich? &lt;br /&gt;
** einfache FHEM-Befehle sollten in der Regel direkt verwendet werden, dies ist ressourcenschonender.&lt;br /&gt;
** Immer dann, wenn dies nicht möglich ist, weil z.B. komplexerer Code ausgeführt werden soll, (blockierende) Prozesse ausgelagert werden sollten oder Systembefehle ausgeführt werden, ist es günstiger, auf die Perl-Ebene zu wechseln &amp;lt;ref&amp;gt;In diesem {{Link2Forum|Topic=88398|Message=808685|LinkText=Forenbeitrag}} wird z.B. erläutert, wie man nichtblockierend externe Scripte aufrufen kann, die dann ihre Ergebnisse wieder an FHEM übergeben.&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird ===&lt;br /&gt;
Dieses Beispiel verwendet einen HM-Aktor für das Licht sowie zwei Milight-Birnen, die einzeln geschaltet werden sollen&amp;lt;ref&amp;gt;Dies ist ausdrücklich keine Empfehlung für diese Technologie und der Module&amp;lt;/ref&amp;gt; in den Stehlampen:&lt;br /&gt;
&lt;br /&gt;
==== Vorbedingungen ====&lt;br /&gt;
FHEM:&lt;br /&gt;
 define LichtWZ CUL_HM 3A37D8&lt;br /&gt;
 define Stehlampe1 MilightDevice RGBW Milight_Wohnzimmer 5&lt;br /&gt;
 define Stehlampe2 MilightDevice RGBW Milight_Wohnzimmer 6&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define SteckdoseWZein notify LichtWZ set Stehlampe1,Stehlampe2 $EVENT&lt;br /&gt;
oder &#039;&#039;in Perl&#039;&#039;&lt;br /&gt;
 define SteckdoseWZein notify LichtWZ { fhem &amp;quot;set Stehlampe1 $EVENT;;set Stehlampe2 $EVENT &amp;quot; } &lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Wenn das LichtWZ eingeschaltet wird, dann werden auch die Stehlampen (1 und 2) eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
=== Einfache ODER Funktion ===&lt;br /&gt;
Eine einfache ODER Funktion kann sehr einfach realisiert werden&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
KNX:&lt;br /&gt;
* 3x GAs der abzufragende Werte (0/0/40 0/0/41 0/0/42)&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
 define Licht1 CUL_HM 3A37D8&lt;br /&gt;
 define Licht2 CUL_HM 1B7EC3&lt;br /&gt;
 define Stehlampe MilightDevice RGBW Milight_Wohnzimmer 7&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define SteckdoseWZein notify (Licht1|Licht2) set Stehlampe $EVENT &lt;br /&gt;
oder&lt;br /&gt;
 define SteckdoseWZein notify (Licht.) set Stehlampe $EVENT&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Die Werte in der Klammer (wichtig ist das »|«) sind die Rückgabewerte. Alternativ kann in diesem Beispiel auch »Licht.«  (zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für (genau) ein beliebiges Zeichen.&lt;br /&gt;
&lt;br /&gt;
Danach folgt der set Befehl.&lt;br /&gt;
Wenn also das Licht1 oder Licht2 den Wert &amp;quot;on&amp;quot; hat, dann hat auch die Steckdose den Wert &amp;quot;on&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alternative: [[structure]]&lt;br /&gt;
&lt;br /&gt;
=== Einfache UND Funktion ===&lt;br /&gt;
Ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezweifeln. In FHEM fehlen Loggingfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ).&lt;br /&gt;
Dadurch ist FHEM zwar mächtig, wird aber für viele sehr kompliziert.&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
KNX:&lt;br /&gt;
* 3x GDs für die Rückgabewert Rollo geschlossen == 1 (0/0/50 0/0/51 0/0/52)&lt;br /&gt;
* GD LED am Lichtschalter (0/0/106)&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
 define R1ZU KNX 0/0/50:dpt1.009&lt;br /&gt;
 attr R1ZU dummy 1&lt;br /&gt;
 define R2ZU KNX 0/0/51:dpt1.009&lt;br /&gt;
 attr R2ZU dummy 1&lt;br /&gt;
 define R3ZU KNX 0/0/52:dpt1.009&lt;br /&gt;
 attr R3ZU dummy 1&lt;br /&gt;
 define LEDalleRolloZu KNX 0/0/106:dpt1&lt;br /&gt;
Durch das Attribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define nt.allerolloszu notify (R1ZU|R2ZU|R3ZU) {\&lt;br /&gt;
 my $r1 = Value(&amp;quot;R1ZU&amp;quot;);;\&lt;br /&gt;
 my $r2 = Value(&amp;quot;R2ZU&amp;quot;);;\&lt;br /&gt;
 my $r3 = Value(&amp;quot;R3ZU&amp;quot;);;\&lt;br /&gt;
 if ($r1 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r2 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r3 eq &amp;quot;on&amp;quot;) {\&lt;br /&gt;
   fhem(&amp;quot;set LEDalleRolloZu on&amp;quot;);;\&lt;br /&gt;
 } else {\&lt;br /&gt;
   fhem(&amp;quot;set LEDalleRolloZu off&amp;quot;);;\&lt;br /&gt;
 }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet. Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }&lt;br /&gt;
&lt;br /&gt;
my $r1 =&amp;amp;gt; Variable $r1 definieren&lt;br /&gt;
= Value(&amp;quot;R1ZU&amp;quot;);; ==&amp;amp;gt; weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu &lt;br /&gt;
&lt;br /&gt;
Der doppelte ;; ist ein FHEM Thema. Eigentlich würde für Perl ein ; reichen. Aber FHEM nutzt selbst das ; und daher wird ein ;; benötigt. Mit den ersten drei my Zeilen werden die Rückgabewerte den Variablen zugewiesen.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt ein normales &amp;quot;if then else&amp;quot; Konstrukt. Die Zeile »($r1 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r2 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r3 eq &amp;quot;on&amp;quot;)«&amp;amp;#160;kann man so lesen: Wenn $r1 den Wert &amp;quot;on&amp;quot; und (&amp;amp;amp;&amp;amp;amp;) $r2 den Wert &amp;quot;on&amp;quot; und $r3 den Wert &amp;quot;on&amp;quot; dann schalte die LEDalleRolloZu ein {fhem(&amp;quot;set LEDalleRolloZu on&amp;quot;)}&lt;br /&gt;
ansonsten else schalte die LED aus. {fhem(&amp;quot;set LEDalleRolloZu off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Alternative: [[structure]]&lt;br /&gt;
&lt;br /&gt;
=== Zeitverzögert schalten ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Aufgabe:&#039;&#039;&#039; || Zeitverzögert schalten&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Beschreibung:&#039;&#039;&#039; || Mit einem Notify zeitverzögert eine Aktion auslösen.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Vorbereitung:&#039;&#039;&#039; || Gerät &amp;quot;Lampe&amp;quot; ist definiert und es gibt eine Situation, die ein Ereignis &amp;quot;Fernbedienung:.*&amp;quot; generiert.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Befehl:&#039;&#039;&#039; || &amp;lt;code&amp;gt;define ntfy1 notify Fernbedienung:.* sleep 7.5;; set Lampe $EVENT&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Erläuterungen:&#039;&#039;&#039; || Bei Eintreten eines Ereignisses &amp;quot;Fernbedienung*&amp;quot; wird nach einer Pause von siebeneinhalb Sekunden der Befehl &amp;lt;set Lampe ??&amp;gt; ausgeführt, wobei der eigentliche Befehl aus dem auslösenden Ereignis übernommen wird.&lt;br /&gt;
:&#039;&#039;Quelle: {{Link2Forum|Topic=17161|LinkText=FHEM Forum}}&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig) ===&lt;br /&gt;
Hier ein kleines Beispiel, wie man mit Hilfe einer PV-Anlage die Sonneneinstrahlung auf der Südseite ermittelt und dies zur Rolladensteuerung nutzt.&lt;br /&gt;
Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel)&lt;br /&gt;
Optional: Die Funktion soll nur zwischen dem 6. und 9. Monat funktioneren. (drittes Beispiel)&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
PV Anlage mit SolarView abfragen.&lt;br /&gt;
Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schließen.&lt;br /&gt;
&lt;br /&gt;
==== notify Syntax ====&lt;br /&gt;
FHEM:&lt;br /&gt;
&lt;br /&gt;
 define sv SolarView solarview 15000 wr1 wr2 wr3 wr4                           &amp;lt;----vier Wechselrichter&lt;br /&gt;
 attr sv event-on-change-reading currentPower                                &lt;br /&gt;
&lt;br /&gt;
 define nt.sonnenlichtpersolar notify sv:currentPower.* { \&lt;br /&gt;
  if ($EVTPART1 &amp;amp;lt; 3000 ) {\&lt;br /&gt;
  fhem(&#039;set Flur1 Auf&#039;)\&lt;br /&gt;
 }else {\&lt;br /&gt;
  if ($EVTPART1 &amp;amp;gt; 5000 ) {\&lt;br /&gt;
  fhem(&#039;set Flur1 Ab&#039;)\&lt;br /&gt;
  } \&lt;br /&gt;
  }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Optional 1: Zeitabhängig (Code gehört in die DEF)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 sv:currentPower.* { &lt;br /&gt;
  my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&lt;br /&gt;
   if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;) { &lt;br /&gt;
   if ($EVTPART1 &amp;lt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Auf&#039;)&lt;br /&gt;
    }else {&lt;br /&gt;
    if ($EVTPART1 &amp;gt; 8000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Ab&#039;)&lt;br /&gt;
    } &lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Optional 2: Zeit und Datum (Code gehört in die DEF)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 sv:currentPower.* { &lt;br /&gt;
  my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&lt;br /&gt;
  if ($month &amp;gt;= 6 &amp;amp;&amp;amp; $month &amp;lt;= 9) {&lt;br /&gt;
   if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;) { &lt;br /&gt;
   if ($EVTPART1 &amp;lt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1,RBUERO1,RBUERO2 Auf&#039;);&lt;br /&gt;
    }else {&lt;br /&gt;
    if ($EVTPART1 &amp;gt; 8000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1,Flur2,RBUERO1,RBUERO2 Ab&#039;);&lt;br /&gt;
    } &lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
* Das define wird in der Kommandozeile im Webbrowser eingegeben.&lt;br /&gt;
* Anschließend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl&lt;br /&gt;
* define sv SolarView ... &amp;lt;==== ist die Schnittstelle vom SolarView&lt;br /&gt;
* define nt.sonnenlichtpersolar notify (sv:currentPower.*) { &amp;lt;==== hier wird ein notify angelegt, der auf das &amp;quot;define sv&amp;quot; Wert &amp;quot;currentPower.*&amp;quot; (.* ist irgendwas) reagiert&lt;br /&gt;
  if ($EVTPART1 &amp;amp;lt; 3000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Auf&#039;);&lt;br /&gt;
  }else {&lt;br /&gt;
   if ($EVTPART1 &amp;amp;gt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Ab&#039;);&lt;br /&gt;
  } &lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
Diese if-Funktion wertet den Rückgabewert von currentPower aus. Hierbei muss man wissen, dass $EVTPART1 das Split-Ergebnis vom Rückgabewert ist&lt;br /&gt;
&lt;br /&gt;
Beispiel: Der Rückgabewert (wie im Beispiel) ist &amp;quot;currentPower: 6000&amp;quot;.&lt;br /&gt;
Jetzt steht im &amp;quot;$EVTPART0 == currentPower:&amp;quot; und im &amp;quot;$EVTPART1 == 6000&amp;quot;&lt;br /&gt;
Das bedeutet, dass man sich nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken muss, dies übernimmt vielmehr FHEM.&lt;br /&gt;
&lt;br /&gt;
Ergebnis: &lt;br /&gt;
Das Rollo wird abhängig von der erzeugten IST_Strommenge auf und zu gefahren.&lt;br /&gt;
Damit dies nicht dauernd hin und her pendelt, wurde der Auf Wert sehr klein und den Ab Wert sehr groß gewählt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional 1:&#039;&#039;&#039; Der Block &amp;quot;my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&amp;quot; erzeugt die String-Variable $hm mit dem Inhalt $hour:$min. %02d begrenzt die Ausgabe auf zwei Stellen.&lt;br /&gt;
Danach wird mit &amp;quot;if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;)&amp;quot; mit stringvergleichenden Operatoren geprüft, ob die Uhrzeit zwischen 9:30 und 17:00 liegt (lt = kleiner als; gt = größer als). Es wäre auch ein le und ge möglich: le =  kleiner/gleich als, ge =  größer/gleich als.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional 2:&#039;&#039;&#039;if( $month &amp;gt;= 6 &amp;amp;&amp;amp; $month &amp;lt;= 9) {&lt;br /&gt;
&lt;br /&gt;
Hier wird die numerische FHEM-Standard-Variable $month (Monat) auf größer/gleich bzw kleiner/gleich mit den binären Operatoren überprüft.&lt;br /&gt;
Die Funktion arbeitet also nur zwischen dem 6. und dem 9. Monat und dann auch nur zwischen 9:31 und 16:59.&lt;br /&gt;
&lt;br /&gt;
=== Status eines Kippfensters mit 2 Fensterkontakten abbilden ===&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
Es ist je ein Fensterkontakt der &#039;&#039;open&#039;&#039; oder &#039;&#039;closed&#039;&#039; meldet, oben und unten am Fenster angebracht.&lt;br /&gt;
Die Namen der beiden FHEM-Devices sind &#039;&#039;fensterKontaktOben&#039;&#039; und &#039;&#039;fensterKontaktUnten&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== notify Syntax ====&lt;br /&gt;
FHEM:&lt;br /&gt;
 define statusFenster notify fensterKontakt(Oben|Unten):(open|closed) {\&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039;)\&lt;br /&gt;
        { fhem &#039;set Terrassentuer open&#039; }\&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039;)\&lt;br /&gt;
        { fhem &#039;set Terrassentuer closed&#039; }\&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039;)\&lt;br /&gt;
        { fhem &#039;set Terrassentuer tilted&#039; }\&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039;)\&lt;br /&gt;
        { fhem &#039;set Terrassentuer undef&#039; }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Weitere Hinweise ==&lt;br /&gt;
* Entsprechend zu $EVENT gibt es auch noch $NAME und $TYPE. $NAME und $TYPE enthalten den Namen bzw. Typ des Ereignis auslösenden Gerätes.&lt;br /&gt;
* Wird der Perl-Code in einem &amp;lt;code&amp;gt;notify&amp;lt;/code&amp;gt; immer länger, lagere den Code wegen der Übersichtlichkeit in eine eigene Programmdatei aus, wie in [[99_myUtils anlegen]] beschrieben.&lt;br /&gt;
* Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreibt, muss man anscheinend darauf achten, dass keine abschließende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.&lt;br /&gt;
* Dieser {{Link2Forum|Topic=38520|Message=307325}} enthält Vorschläge zur Vorgehensweise bei der Erstellung von komplexen &#039;&#039;notify&#039;&#039; Definitionen bzw. bei deren Fehlerbehebung.&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
* [[Escapen in Perlbefehlen]]&lt;br /&gt;
* [[Klammerebenen]]&lt;br /&gt;
* Forenbeitrag zum Thema {{Link2Forum|Topic=115414|LinkText=Optimierung des Suchmusters - NOTIFYDEV}}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Hilfsmodul]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Notify&amp;diff=38340</id>
		<title>Notify</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Notify&amp;diff=38340"/>
		<updated>2023-04-29T15:03:33Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Syntax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:notify}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Ausführung von Anweisung(en) als Reaktion auf Ereignisse&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=notify&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=91_notify.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
{{Hinweis|Weitere grundlegende Informationen/Beispiele zu notify enthält [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM]}}&lt;br /&gt;
Das Hilfsmodul notify dient dazu [[Ereignis|Ereignisse]] über ein Suchmuster zu erkennen und bei einem Treffer eine Aktion auszulösen. Mit &#039;&#039;notify&#039;&#039; und anderen [[Eventhandler|Eventhandlern]] &amp;lt;ref&amp;gt;hierzu gehören u.a. auch [[DOIF]], [[THRESHOLD]] und [[watchdog]]&amp;lt;/ref&amp;gt; ist es möglich, Logikfunktionen im FHEM abzubilden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039; &lt;br /&gt;
* Wird das Licht in der Küche eingeschaltet, soll FHEM dort auch das Radio einschalten. &lt;br /&gt;
* Bei Druck auf einen Taster soll die Umwälzpumpe für das Warmwasser eingeschaltet werden. &lt;br /&gt;
* Erweiterte Möglichkeiten: Aber nur, wenn das Radio aus ist bzw. die Temperatur im Rücklauf des Warmwassers unterhalb einer bestimmten Schwelle liegt&amp;lt;ref&amp;gt;vgl. hierzu z.B. {{Link2CmdRef|Anker=devspec|Label=FILTER}} und [[if-condition]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; notify &amp;lt;Suchmuster&amp;gt; &amp;lt;command&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;[[Regulärer Ausdruck|Suchmuster]]&#039;&#039;  (häufig als Regexp = regular expression = regulärer Ausdruck bezeichnet) ist sehr wichtig: Es ist entweder der Name des auslösenden (&amp;quot;triggernden&amp;quot;) Gerätes oder die Kombination aus Gerät und auslösendem Ereignis (Event) &amp;lt;code&amp;gt;Gerätename:Event&amp;lt;/code&amp;gt;. Die Events kann man dem [[Event_monitor|Event-Monitor]] entnehmen. Wenn dort z.B. &amp;lt;code&amp;gt;Rollo1&amp;lt;/code&amp;gt; steht, dann reagiert &#039;&#039;notify&#039;&#039; auf &amp;lt;code&amp;gt;Rollo1 on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Rollo1 off&amp;lt;/code&amp;gt; usw.&lt;br /&gt;
&lt;br /&gt;
Wenn man mehrere Suchmuster kombinieren möchte, kann man diese in Klammer schreiben, als Trenner wird dann Pipe (|) genutzt: &amp;lt;code&amp;gt;(Rollo1|Rollo2|Steckdose5)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auch die Verwendung von Platzhaltern ist möglich&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;code&amp;gt;Rollo.&amp;lt;/code&amp;gt; → das notify reagiert auf alles was mit Rollo und &#039;&#039;&#039;einem&#039;&#039;&#039; weiteren beliebigen Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg&lt;br /&gt;
* &amp;lt;code&amp;gt;Rollo.*&amp;lt;/code&amp;gt; → notify reagiert auf alles das mit Rollo beginnt&lt;br /&gt;
* &amp;lt;code&amp;gt;.*isch&amp;lt;/code&amp;gt; → auf alles das mit isch aufhört (Tisch, Fisch)&lt;br /&gt;
* &amp;lt;code&amp;gt;Schalter(1|2|3)&amp;lt;/code&amp;gt; → hört auf Schalter1, Schalter2 und Schalter3&lt;br /&gt;
* &amp;lt;code&amp;gt;dimmer:pct:.(100|7[6-9]|[89][0-9])&amp;lt;/code&amp;gt;  → reagiert, wenn pct einen Wert über 75 annimmt.&lt;br /&gt;
&lt;br /&gt;
Suchmuster/Regex kann man im Internet beispielsweise auf [http://regexpal.com/| http://regexpal.com/] testen.&lt;br /&gt;
&lt;br /&gt;
Es gibt seit Juli 2020 eine Perlfunktion notifyRegexpCheck zum Testen, wie FHEM über das Suchmuster &amp;quot;denkt&amp;quot; - siehe {{Link2Forum|Topic=111938|Message=1074202|LinkText=diesen Beitrag}} im Forum.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Das &#039;&#039;&#039;Suchmuster&#039;&#039;&#039; wird notify-intern um das Zeichen ^ (beginnt mit) und das Zeichen $ (endet mit) ergänzt&amp;lt;ref&amp;gt;Der Eventhandler [[DOIF]] verwendet die in Perl übliche Syntax für reguläre Ausdrücke als DOIF-Suchmuster.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Deshalb darf das Suchmuster nicht mit einem üblichen [[Regulärer Ausdruck|&#039;&#039;&#039;Regulären Ausdruck&#039;&#039;&#039;]], wie er in Perl&amp;lt;ref&amp;gt;https://perldoc.perl.org/perlre.html&amp;lt;/ref&amp;gt; verwendet wird, gleichgesetzt werden, da die Ergänzung zu einem grundsätzlich unterschiedlichen Verhalten führt, siehe nachstehendes Beispiel.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel für das unterschiedliche Verhalten von &#039;&#039;Suchmuster&#039;&#039; und &#039;&#039;regulären Ausdruck&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für einen &#039;&#039;&#039;regulären Audruck&#039;&#039;&#039; gilt: Wenn  der reguläre Ausdruck &#039;&#039;lampe&#039;&#039; ist und das [[Ereignis]] &#039;&#039;tischlampe&#039;&#039; dann passen &#039;&#039;tischlampe&#039;&#039; und &#039;&#039;lampe&#039;&#039; zueinander.&lt;br /&gt;
&lt;br /&gt;
Für das &#039;&#039;&#039;Suchmuster&#039;&#039;&#039; gilt: Wenn  das Suchmuster &#039;&#039;lampe&#039;&#039; ist und das [[Ereignis]] &#039;&#039;tischlampe&#039;&#039; dann passen &#039;&#039;tischlampe&#039;&#039; und &#039;&#039;lampe&#039;&#039; &#039;&#039;&#039;nicht&#039;&#039;&#039; zueinander, weil das Suchmuster zu ^lampe$ ergänzt wird und damit exakt nur auf &#039;&#039;lampe&#039;&#039; matcht (passt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen Zuordnung zum Event&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  2020-01-21 22:40:39 HUEDevice VibrationTest1 battery: 88&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !!$NAME !! colspan=&amp;quot;2&amp;quot; |$EVENT&lt;br /&gt;
|-&lt;br /&gt;
| ||||$EVTPART0 ||$EVTPART1&lt;br /&gt;
|-&lt;br /&gt;
|2020-01-21 22:40:39 HUEDevice|| VibrationTest1|| battery:|| 88&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 2&#039;&#039;&#039;&lt;br /&gt;
  2021-05-09 19:11:43 FB_CALLMONITOR cm_example external_name: Graf Herzog von und zu ...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !!$NAME !! colspan=&amp;quot;7&amp;quot; |$EVENT&lt;br /&gt;
|-&lt;br /&gt;
| ||||$EVTPART0 ||$EVTPART1 || $EVTPART2|| $EVTPART3 || $EVTPART4|| $EVTPART5|| ...&lt;br /&gt;
|-&lt;br /&gt;
|2021-05-09 19:11:43 FB_CALLMONITOR|| cm_example|| external_name:|| Graf|| Herzog|| von|| und|| zu|| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  2023-04-29 16:53:04 dummy Demo closed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !!$NAME !! colspan=&amp;quot;1&amp;quot; |$EVENT&lt;br /&gt;
|-&lt;br /&gt;
| ||||$EVTPART0&lt;br /&gt;
|-&lt;br /&gt;
|2020-01-21 22:40:39 dummy|| Demo|| closed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FHEMWEB-unterstütztes Anlegen eines notify ==&lt;br /&gt;
{{Hinweis|Die Erstellung eines notify und insbesondere die korrekte Angabe des Suchmusters (Regex) führt gerade bei Einsteigern immer wieder zu Schwierigkeiten. Zur Fehlerminimierung empfiehlt es sich zum einen, die [[Konfiguration]] nicht direkt zu bearbeiten, sondern die &amp;quot;Befehl-Eingabezeile&amp;quot;, die &amp;quot;Objektdetails&amp;quot; oder den [[Import von Code Snippets|Import von RAW-Definitionen]] zur Bearbeitung zu nutzen.}}&lt;br /&gt;
&lt;br /&gt;
=== Event Monitor ===&lt;br /&gt;
Die komfortabelste Möglichkeit, die häufigsten Event-Handler zu erstellen, bietet der [[Event monitor|Event-Monitor]]. Die Vorgehensweis ist in dem zugehörigen Artikel dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Regexp wizard ===&lt;br /&gt;
Zudem enthält FHEM einen Regexp wizard mit dem Regex anhand der in FHEM vorhandenen Devices und deren Events aus einer Auswahlbox selektiert werden können. Voraussetzungen sind:&lt;br /&gt;
* Aktivierung des Hilfsmoduls [[eventTypes]] (bei allen Neuinstallationen Standard) &lt;br /&gt;
* das gesuchte Ereignis (Event) ist nach Aktivierung des Hilfsmoduls bereits mindestens einmal eingetreten&lt;br /&gt;
&lt;br /&gt;
Schrittweise Darstellung der Nutzung des Regexp wizard zur Anlage eines &amp;quot;notify&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
In das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] eingeben und mit {{Taste|Enter}} bestätigen:&lt;br /&gt;
 define ntest notify a b&lt;br /&gt;
Als Beispiel wird ein notify mit &amp;lt;name&amp;gt; &amp;quot;ntest&amp;quot; angelegt. &amp;quot;a&amp;quot; und &amp;quot;b&amp;quot; sind beliebige Platzhalter für &amp;lt;Suchmuster&amp;gt; und &amp;lt;Command&amp;gt;, die bei der weiteren Bearbeitung mit dem endgültigen Werten ersetzt werden.&lt;br /&gt;
Der Regexp wizard öffnet sich:&lt;br /&gt;
[[Datei:Regexp wizard1.JPG|400px|thumb|center]]&lt;br /&gt;
Nun in der Auswahlbox das auslösende Event (Ereignis) auswählen; zunächst das Device und dann das gewünschte Regex. Hier soll das notify bei jeder Veränderung der Temperatur (temperature.*) des Device BTHR918N reagieren. Abschließend mit einem Mausklick auf {{Taste|set}} bestätigen. Wählt man mehrere Regex in dieser Weise aus, so wird das &amp;quot;notify&amp;quot; bei Eintritt jedes dieser Events ausgeführt:&lt;br /&gt;
[[Datei:Regexp wizard2.JPG|400px|thumb|center]]&lt;br /&gt;
Anschließend den Platzhalter &amp;quot;a&amp;quot; mit Klick auf den Link &amp;quot;removeRegexpPart&amp;quot; löschen:&lt;br /&gt;
[[Datei:Regexp wizard3.JPG|400px|thumb|center]]&lt;br /&gt;
Den Link &amp;quot;DEF&amp;quot; anklicken, damit sich der DEF-Editor öffnet:&lt;br /&gt;
[[Datei:Regexp wizard4.JPG|400px|thumb|center]]&lt;br /&gt;
Jetzt den auszuführenden Befehl im &amp;quot;DEF&amp;quot;-Bereich durch Überschreiben des Platzhalters &amp;quot;b&amp;quot; eintragen und mit Klick auf {{Taste|modify ntest}} abschließen:&lt;br /&gt;
[[Datei:Regexp wizard5.JPG|400px|thumb|center]]&lt;br /&gt;
Das fertige und sofort aktive &amp;quot;notify&amp;quot; sieht abschließend folgendermaßen aus:&lt;br /&gt;
[[Datei:Regexp wizard6.JPG|400px|thumb|center]]&lt;br /&gt;
Am Schluss das Speichern über {{Taste|Save config}} nicht vergessen.&lt;br /&gt;
&lt;br /&gt;
== Mein notify geht nicht - wie kann ich mir selbst helfen: Debugging ==&lt;br /&gt;
Funktioniert ein notify nicht wie gewünscht, kann es nur zwei Hauptursachen haben: &lt;br /&gt;
* Entweder das Suchmuster paßt nicht zum gewünschten Auslöser (FHEM Device), und/oder&lt;br /&gt;
* die Anweisung enthält einen Fehler. &lt;br /&gt;
Sollte kein Fehler im Logfile auftauchen aber das notify ausgelöst werden, stimmt meist der Übertragungsweg zum Zieldevice nicht.&lt;br /&gt;
Der STATE des notify zeigt normalerweise mit Datum/Uhrzeit die letzte Auslösung an.&lt;br /&gt;
&lt;br /&gt;
Beim Debuggen sollte man daher beide Elemente getrennt untersuchen. Hier ein Beispiel welches nicht wie gewünscht funktioniert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt; define n_test notify n_test:muster Ausführungsteil&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zum debuggen benötigen wir &lt;br /&gt;
* den [[Event monitor]]&lt;br /&gt;
* das [https://fhem.de/commandref.html#trigger trigger-Kommando] - kann man jederzeit verwenden um das Suchmuster als Event unabhängig vom Auslöser zu erzeugen.&lt;br /&gt;
* die FHEM Kommandozeile&lt;br /&gt;
* den [[DEF-Editor]]&lt;br /&gt;
* eventuell einen Texteditor um Codeblöcke zwischen zu lagern und Notizen zu machen.&lt;br /&gt;
&lt;br /&gt;
Das Suchmuster im Beispiel notify triggert auf sich selbst, es soll auf jeden Event mit dem Inhalt &#039;&#039;&#039;muster&#039;&#039;&#039; ausgelöst werden, Beispiel:&lt;br /&gt;
  2018-07-14 14:31:03 notify n_test muster bild&lt;br /&gt;
&lt;br /&gt;
=== Suchmuster ===&lt;br /&gt;
Sollte das notify nicht funktionieren:&lt;br /&gt;
* keine Reaktion wie gewünscht&lt;br /&gt;
* keine Fehlermeldung in der Weboberfläche beim Anlegen, keine Fehlermeldung im Logfile&lt;br /&gt;
* STATE ist unverändert auf active oder einem altem Datum/Uhrzeit&lt;br /&gt;
liegt der Fehler mit Sicherheit im Suchmuster. Man hat die Chance das Suchmuster mit dem trigger Befehl zu erzeugen und zu schauen ob die Anweisung ausgeführt wird. Dabei ist zu beachten: Der erste &amp;quot;:&amp;quot; im Suchmuster ist zusätzlich zwischen Gerät und Event als Trennung. Jeder weiter : ist, wenn vorhanden, Bestandteil des Events! Siehe dazu den Abschnitt [https://fhem.de/commandref_DE.html#notify Hinweise in der commandref]&lt;br /&gt;
*Im Beispiel: Event: n_test muster -&amp;gt; Suchmuster n_test:muster&lt;br /&gt;
Um aus dem [[Event]] ein passendes Suchmuster zu erzeugen kann der [[Event monitor|Event-Monitor]] direkt verwendet werden. Man kann ein neues notify erzeugen oder ein Bestehendes modifizieren lassen.&lt;br /&gt;
&lt;br /&gt;
Unser Regex im Beispiel ist zu spezifisch, es triggert nur exakt auf &#039;&#039;&#039;muster&#039;&#039;&#039;. Dieser Trigger erzeugt den folgenden Eintrag im Eventmonitor, entspricht exakt dem Suchmuster und löst das notify aus:&lt;br /&gt;
  trigger n_test muster&lt;br /&gt;
  2018-07-13 11:52:08 notify n_test muster&lt;br /&gt;
Das Suchmuster für unsere Anforderung muss in &amp;lt;code&amp;gt;n_test:muster.*&amp;lt;/code&amp;gt; geändert werden, damit jeder Event der mit muster beginnt das notify auslöst.&lt;br /&gt;
Der . im Regex steht für jedes beliebige Zeichen und der * für eine beliebige Anzahl des Zeichens davor: also beliebig viele beliebige Zeichen nach muster.&lt;br /&gt;
&lt;br /&gt;
Das Suchmuster wird häufig in ein komplizierteres Regex umgewandelt um im notify mehrere Aktionen zu starten. Das eigene Regex kann z.B. mit http://regexpal.com/ oder https://regex101.com/ getestet werden.&lt;br /&gt;
&lt;br /&gt;
Funktioniert der Auslöser, das notify tut aber noch nicht was es soll, müssen wir die Anweisung untersuchen. In unserem korrigierten Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt; defmod n_test notify n_test:muster.* Ausführungsteil&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
folgt beim Kommando &amp;lt;code&amp;gt;trigger n_test muster bild&amp;lt;/code&amp;gt; ein Eintrag im Log:&lt;br /&gt;
  2018.07.13 11:47:57 3: n_test return value: Unknown command Ausführungsteil, try help.&lt;br /&gt;
Das notify wurde zwar getriggert aber die Anweisung war nicht ausführbar. &lt;br /&gt;
&lt;br /&gt;
Ein richtiges Suchmuster und eine fehlerhafte Anweisung wird also normalerweise einen Fehlereintrag im Logfile erzeugen!&lt;br /&gt;
&lt;br /&gt;
=== Spezialfall: notify löst zwar aus - aber zu oft ===&lt;br /&gt;
In dem Fall ist das Suchmuster (regExp) zu unscharf oder das triggernde Gerät löst das Event zu oft aus. Das regExp sollte so genau wie möglich konstruiert werden, device:.* ist eine einfache aber oft keine gute Wahl!&lt;br /&gt;
&lt;br /&gt;
Im Device, welches den Event auslöst, kann mit den Attributen event-on-.* die Häufigkeit gesteuert werden. Insbesondere ist hier das regExp .* eine Art Standardwahl um aufeinanderfolgende gleichartige Events zu verhindern.&lt;br /&gt;
:&amp;lt;code&amp;gt;attr device event-on-change-reading .*&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039;: durch falsche Angaben kann man Events ganz leicht völlig verhindern!&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[event-on-change-reading]]&lt;br /&gt;
&lt;br /&gt;
=== Anweisung ===&lt;br /&gt;
Wird das notify getriggert oder will man ganz schnell mal ein notify testen, kann man die Anweisung durch folgenden Code ersetzen, man öffnet also einfach nur die DEF, kopiert den ursprünglichen Inhalt an einen sicheren Ort und ersetzt die Anweisung durch eine der beiden Zeilen. Die erste Zeile kann man auch einfach mal in der Kommandozeile testen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{Log 1, &amp;quot;Das Notify n_test hat ausgeloest.&amp;quot;}&lt;br /&gt;
{Log 1, &amp;quot;Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT&amp;quot;}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wird das notify ausgelöst, muss anschließend im Logfile ein Eintrag zu finden sein:&lt;br /&gt;
  2018.07.13 10:28:57 1: Das Notify n_test hat ausgeloest, der Event sah so aus: muster&lt;br /&gt;
Unsere Anweisung &amp;lt;code&amp;gt;Ausführungsteil&amp;lt;/code&amp;gt; liefert in der Kommandozeile selbst einen Fehler:&lt;br /&gt;
&amp;lt;code&amp;gt;Unknown command Ausführungsteil, try help.&amp;lt;/code&amp;gt;&lt;br /&gt;
Ein Versuch mit geschweiften Klammern &amp;lt;code&amp;gt;{Ausführungsteil}&amp;lt;/code&amp;gt; liefert wieder einen Fehler:&lt;br /&gt;
&amp;lt;code&amp;gt;Unrecognized character \xC3; marked by &amp;lt;-- HERE after {Ausf&amp;lt;-- HERE near column 6 at (eval 5977) line 1.&amp;lt;/code&amp;gt;&lt;br /&gt;
Diese Variante &amp;lt;code&amp;gt;{&amp;quot;Ausführungsteil&amp;quot;}&amp;lt;/code&amp;gt; liefert den String Ausführungsteil ohne Fehler: Das notify arbeitet fehler- aber sinnfrei.&lt;br /&gt;
Der fertige Code:&lt;br /&gt;
  defmod n_test notify n_test:muster.* {&amp;quot;Ausführungsteil&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Man kann die Anweisung, normalerweise so wie sie ist, in der FHEM Kommandozeile testen. Sind im Perl Code (in geschweiften Klammern) im DEF Editor Semikolon enthalten muss man diese für den Test in der Kommandozeile (oder Raw Def) verdoppeln.&lt;br /&gt;
Laufzeitabhängige Variablen sind in der Kommandozeile meist nicht verfügbar, diese sollte man für den Test einfach durch passende Inhalte austauschen. So kann man die komfortable Variante (loggt den Namen und das komplette Event) nicht in der Kommandozeile ausführen. &lt;br /&gt;
&lt;br /&gt;
Funktioniert ein FHEM Befehl in der Kommandozeile nicht (z.B. Lampe geht nicht an) kann es im notify auch nicht funktionieren, dann muss die Fehlersuche an anderer Stelle fortgeführt werden. &lt;br /&gt;
&lt;br /&gt;
Komplexeren Code im Ausführungsteil sollte man beim Testen in Teilabschnitte aufteilen, von der Laufzeit abhängige Variable ($NAME, $EVENT, $EVTPART) durch Strings (&amp;quot;TestWort&amp;quot;) ersetzen, die Teilabschnitte separat testen und anschließend schrittweise wieder komplettieren.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
{{Hinweis|Für die nachfolgenden Beispiele wurden einige unterschiedliche Technologien verwendet. Sie können aber recht einfach auf alle anderen Systeme übertragen werden, dabei sollte ggf. darauf geachtet werden, dass sich Schaltbefehle und Events teilweise je nach konkret eingesetzter Technologie unterscheiden können. Dann ist ggf. eine Erweiterung, z.B. durch eine [[if-condition|if-Abfrage]] erforderlich.}}&lt;br /&gt;
&lt;br /&gt;
=== Schalter entprellen ===&lt;br /&gt;
Will man ein notify innerhalb eines bestimmten Zeitraumes nur einmal auslösen lassen, auch wenn er in diesem Zeitraum mehrfach getriggered werden sollte, so bietet sich das Attribut disabledAfterTrigger an,&lt;br /&gt;
 attr &amp;lt;notify_device&amp;gt; disabledAfterTrigger &amp;lt;Anzahl Sekunden&amp;gt;&lt;br /&gt;
In dem Zeitraum wird dann nur einmal (beim ersten Mal) der Befehl ausgelöst, auch wenn mehrfach getriggered wurde. Der Zeitraum kann Bruchteile von Sekunden umfassen.&lt;br /&gt;
&lt;br /&gt;
=== Etwas schalten, wenn ein anderes Gerät geschaltet wird ===&lt;br /&gt;
&lt;br /&gt;
==== Vorbedingungen ====&lt;br /&gt;
Dieses Beispiel verwendet eine einfache InterTechno-kompatible Funksteckdose für das Radio und einen HM-Aktor für das Licht:&lt;br /&gt;
&lt;br /&gt;
 define RadioKueche IT 000000FFFF 0F F0&lt;br /&gt;
 define LichtKueche CUL_HM 3A37D6&lt;br /&gt;
Beachte: beide kennen als Event bzw. Schaltbefehle &#039;&#039;on&#039;&#039; und &#039;&#039;off&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define LichtamRadioan notify LichtKueche set RadioKueche $EVENT &lt;br /&gt;
oder alternativ: &lt;br /&gt;
 define LichtamRadioan notify LichtKueche { fhem &amp;quot;set RadioKueche $EVENT&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
* Der Name des &#039;&#039;notify&#039;&#039; &amp;quot;LichtamRadioan&amp;quot; kann frei gewählt werden, er dient nur dazu, das notify in FHEM eindeutig zu identifizieren.&lt;br /&gt;
* &amp;quot;$EVENT&amp;quot; ist ein Platzhalter für den Zustand vom Pattern. $EVENT enthält ein &amp;quot;off&amp;quot; wenn das LichtKueche aus- und ein &amp;quot;on&amp;quot; wenn das Licht eingeschaltet wird.&lt;br /&gt;
* &amp;quot;{ &amp;amp;lt;perlcode&amp;amp;gt; }&amp;quot; alles was zwischen {} steht ist Perl code. Perl kennt das Schlüsselwort fhem. Das Schlüsselwort FHEM dient dazu, FHEM Befehle auszuführen. Es wird also der FHEM Befehl &amp;quot;set RadioKueche on/off&amp;quot; ausgeführt. on oder off ist abhängig vom Pattern. Der eigentliche FHEM Befehl muss in &amp;quot; &amp;quot; stehen.&lt;br /&gt;
* Wann ist ein Wechsel auf die Perl-Ebene erforderlich? &lt;br /&gt;
** einfache FHEM-Befehle sollten in der Regel direkt verwendet werden, dies ist ressourcenschonender.&lt;br /&gt;
** Immer dann, wenn dies nicht möglich ist, weil z.B. komplexerer Code ausgeführt werden soll, (blockierende) Prozesse ausgelagert werden sollten oder Systembefehle ausgeführt werden, ist es günstiger, auf die Perl-Ebene zu wechseln &amp;lt;ref&amp;gt;In diesem {{Link2Forum|Topic=88398|Message=808685|LinkText=Forenbeitrag}} wird z.B. erläutert, wie man nichtblockierend externe Scripte aufrufen kann, die dann ihre Ergebnisse wieder an FHEM übergeben.&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird ===&lt;br /&gt;
Dieses Beispiel verwendet einen HM-Aktor für das Licht sowie zwei Milight-Birnen, die einzeln geschaltet werden sollen&amp;lt;ref&amp;gt;Dies ist ausdrücklich keine Empfehlung für diese Technologie und der Module&amp;lt;/ref&amp;gt; in den Stehlampen:&lt;br /&gt;
&lt;br /&gt;
==== Vorbedingungen ====&lt;br /&gt;
FHEM:&lt;br /&gt;
 define LichtWZ CUL_HM 3A37D8&lt;br /&gt;
 define Stehlampe1 MilightDevice RGBW Milight_Wohnzimmer 5&lt;br /&gt;
 define Stehlampe2 MilightDevice RGBW Milight_Wohnzimmer 6&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define SteckdoseWZein notify LichtWZ set Stehlampe1,Stehlampe2 $EVENT&lt;br /&gt;
oder &#039;&#039;in Perl&#039;&#039;&lt;br /&gt;
 define SteckdoseWZein notify LichtWZ { fhem &amp;quot;set Stehlampe1 $EVENT;;set Stehlampe2 $EVENT &amp;quot; } &lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Wenn das LichtWZ eingeschaltet wird, dann werden auch die Stehlampen (1 und 2) eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
=== Einfache ODER Funktion ===&lt;br /&gt;
Eine einfache ODER Funktion kann sehr einfach realisiert werden&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
KNX:&lt;br /&gt;
* 3x GAs der abzufragende Werte (0/0/40 0/0/41 0/0/42)&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
 define Licht1 CUL_HM 3A37D8&lt;br /&gt;
 define Licht2 CUL_HM 1B7EC3&lt;br /&gt;
 define Stehlampe MilightDevice RGBW Milight_Wohnzimmer 7&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define SteckdoseWZein notify (Licht1|Licht2) set Stehlampe $EVENT &lt;br /&gt;
oder&lt;br /&gt;
 define SteckdoseWZein notify (Licht.) set Stehlampe $EVENT&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Die Werte in der Klammer (wichtig ist das »|«) sind die Rückgabewerte. Alternativ kann in diesem Beispiel auch »Licht.«  (zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für (genau) ein beliebiges Zeichen.&lt;br /&gt;
&lt;br /&gt;
Danach folgt der set Befehl.&lt;br /&gt;
Wenn also das Licht1 oder Licht2 den Wert &amp;quot;on&amp;quot; hat, dann hat auch die Steckdose den Wert &amp;quot;on&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alternative: [[structure]]&lt;br /&gt;
&lt;br /&gt;
=== Einfache UND Funktion ===&lt;br /&gt;
Ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezweifeln. In FHEM fehlen Loggingfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ).&lt;br /&gt;
Dadurch ist FHEM zwar mächtig, wird aber für viele sehr kompliziert.&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
KNX:&lt;br /&gt;
* 3x GDs für die Rückgabewert Rollo geschlossen == 1 (0/0/50 0/0/51 0/0/52)&lt;br /&gt;
* GD LED am Lichtschalter (0/0/106)&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
 define R1ZU KNX 0/0/50:dpt1.009&lt;br /&gt;
 attr R1ZU dummy 1&lt;br /&gt;
 define R2ZU KNX 0/0/51:dpt1.009&lt;br /&gt;
 attr R2ZU dummy 1&lt;br /&gt;
 define R3ZU KNX 0/0/52:dpt1.009&lt;br /&gt;
 attr R3ZU dummy 1&lt;br /&gt;
 define LEDalleRolloZu KNX 0/0/106:dpt1&lt;br /&gt;
Durch das Attribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define nt.allerolloszu notify (R1ZU|R2ZU|R3ZU) {\&lt;br /&gt;
 my $r1 = Value(&amp;quot;R1ZU&amp;quot;);;\&lt;br /&gt;
 my $r2 = Value(&amp;quot;R2ZU&amp;quot;);;\&lt;br /&gt;
 my $r3 = Value(&amp;quot;R3ZU&amp;quot;);;\&lt;br /&gt;
 if ($r1 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r2 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r3 eq &amp;quot;on&amp;quot;) {\&lt;br /&gt;
   fhem(&amp;quot;set LEDalleRolloZu on&amp;quot;);;\&lt;br /&gt;
 } else {\&lt;br /&gt;
   fhem(&amp;quot;set LEDalleRolloZu off&amp;quot;);;\&lt;br /&gt;
 }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet. Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }&lt;br /&gt;
&lt;br /&gt;
my $r1 =&amp;amp;gt; Variable $r1 definieren&lt;br /&gt;
= Value(&amp;quot;R1ZU&amp;quot;);; ==&amp;amp;gt; weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu &lt;br /&gt;
&lt;br /&gt;
Der doppelte ;; ist ein FHEM Thema. Eigentlich würde für Perl ein ; reichen. Aber FHEM nutzt selbst das ; und daher wird ein ;; benötigt. Mit den ersten drei my Zeilen werden die Rückgabewerte den Variablen zugewiesen.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt ein normales &amp;quot;if then else&amp;quot; Konstrukt. Die Zeile »($r1 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r2 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r3 eq &amp;quot;on&amp;quot;)«&amp;amp;#160;kann man so lesen: Wenn $r1 den Wert &amp;quot;on&amp;quot; und (&amp;amp;amp;&amp;amp;amp;) $r2 den Wert &amp;quot;on&amp;quot; und $r3 den Wert &amp;quot;on&amp;quot; dann schalte die LEDalleRolloZu ein {fhem(&amp;quot;set LEDalleRolloZu on&amp;quot;)}&lt;br /&gt;
ansonsten else schalte die LED aus. {fhem(&amp;quot;set LEDalleRolloZu off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Alternative: [[structure]]&lt;br /&gt;
&lt;br /&gt;
=== Zeitverzögert schalten ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Aufgabe:&#039;&#039;&#039; || Zeitverzögert schalten&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Beschreibung:&#039;&#039;&#039; || Mit einem Notify zeitverzögert eine Aktion auslösen.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Vorbereitung:&#039;&#039;&#039; || Gerät &amp;quot;Lampe&amp;quot; ist definiert und es gibt eine Situation, die ein Ereignis &amp;quot;Fernbedienung:.*&amp;quot; generiert.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Befehl:&#039;&#039;&#039; || &amp;lt;code&amp;gt;define ntfy1 notify Fernbedienung:.* sleep 7.5;; set Lampe $EVENT&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Erläuterungen:&#039;&#039;&#039; || Bei Eintreten eines Ereignisses &amp;quot;Fernbedienung*&amp;quot; wird nach einer Pause von siebeneinhalb Sekunden der Befehl &amp;lt;set Lampe ??&amp;gt; ausgeführt, wobei der eigentliche Befehl aus dem auslösenden Ereignis übernommen wird.&lt;br /&gt;
:&#039;&#039;Quelle: {{Link2Forum|Topic=17161|LinkText=FHEM Forum}}&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig) ===&lt;br /&gt;
Hier ein kleines Beispiel, wie man mit Hilfe einer PV-Anlage die Sonneneinstrahlung auf der Südseite ermittelt und dies zur Rolladensteuerung nutzt.&lt;br /&gt;
Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel)&lt;br /&gt;
Optional: Die Funktion soll nur zwischen dem 6. und 9. Monat funktioneren. (drittes Beispiel)&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
PV Anlage mit SolarView abfragen.&lt;br /&gt;
Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schließen.&lt;br /&gt;
&lt;br /&gt;
==== notify Syntax ====&lt;br /&gt;
FHEM:&lt;br /&gt;
&lt;br /&gt;
 define sv SolarView solarview 15000 wr1 wr2 wr3 wr4                           &amp;lt;----vier Wechselrichter&lt;br /&gt;
 attr sv event-on-change-reading currentPower                                &lt;br /&gt;
&lt;br /&gt;
 define nt.sonnenlichtpersolar notify sv:currentPower.* { \&lt;br /&gt;
  if ($EVTPART1 &amp;amp;lt; 3000 ) {\&lt;br /&gt;
  fhem(&#039;set Flur1 Auf&#039;)\&lt;br /&gt;
 }else {\&lt;br /&gt;
  if ($EVTPART1 &amp;amp;gt; 5000 ) {\&lt;br /&gt;
  fhem(&#039;set Flur1 Ab&#039;)\&lt;br /&gt;
  } \&lt;br /&gt;
  }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Optional 1: Zeitabhängig (Code gehört in die DEF)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 sv:currentPower.* { &lt;br /&gt;
  my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&lt;br /&gt;
   if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;) { &lt;br /&gt;
   if ($EVTPART1 &amp;lt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Auf&#039;)&lt;br /&gt;
    }else {&lt;br /&gt;
    if ($EVTPART1 &amp;gt; 8000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Ab&#039;)&lt;br /&gt;
    } &lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Optional 2: Zeit und Datum (Code gehört in die DEF)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 sv:currentPower.* { &lt;br /&gt;
  my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&lt;br /&gt;
  if ($month &amp;gt;= 6 &amp;amp;&amp;amp; $month &amp;lt;= 9) {&lt;br /&gt;
   if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;) { &lt;br /&gt;
   if ($EVTPART1 &amp;lt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1,RBUERO1,RBUERO2 Auf&#039;);&lt;br /&gt;
    }else {&lt;br /&gt;
    if ($EVTPART1 &amp;gt; 8000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1,Flur2,RBUERO1,RBUERO2 Ab&#039;);&lt;br /&gt;
    } &lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
* Das define wird in der Kommandozeile im Webbrowser eingegeben.&lt;br /&gt;
* Anschließend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl&lt;br /&gt;
* define sv SolarView ... &amp;lt;==== ist die Schnittstelle vom SolarView&lt;br /&gt;
* define nt.sonnenlichtpersolar notify (sv:currentPower.*) { &amp;lt;==== hier wird ein notify angelegt, der auf das &amp;quot;define sv&amp;quot; Wert &amp;quot;currentPower.*&amp;quot; (.* ist irgendwas) reagiert&lt;br /&gt;
  if ($EVTPART1 &amp;amp;lt; 3000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Auf&#039;);&lt;br /&gt;
  }else {&lt;br /&gt;
   if ($EVTPART1 &amp;amp;gt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Ab&#039;);&lt;br /&gt;
  } &lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
Diese if-Funktion wertet den Rückgabewert von currentPower aus. Hierbei muss man wissen, dass $EVTPART1 das Split-Ergebnis vom Rückgabewert ist&lt;br /&gt;
&lt;br /&gt;
Beispiel: Der Rückgabewert (wie im Beispiel) ist &amp;quot;currentPower: 6000&amp;quot;.&lt;br /&gt;
Jetzt steht im &amp;quot;$EVTPART0 == currentPower:&amp;quot; und im &amp;quot;$EVTPART1 == 6000&amp;quot;&lt;br /&gt;
Das bedeutet, dass man sich nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken muss, dies übernimmt vielmehr FHEM.&lt;br /&gt;
&lt;br /&gt;
Ergebnis: &lt;br /&gt;
Das Rollo wird abhängig von der erzeugten IST_Strommenge auf und zu gefahren.&lt;br /&gt;
Damit dies nicht dauernd hin und her pendelt, wurde der Auf Wert sehr klein und den Ab Wert sehr groß gewählt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional 1:&#039;&#039;&#039; Der Block &amp;quot;my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&amp;quot; erzeugt die String-Variable $hm mit dem Inhalt $hour:$min. %02d begrenzt die Ausgabe auf zwei Stellen.&lt;br /&gt;
Danach wird mit &amp;quot;if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;)&amp;quot; mit stringvergleichenden Operatoren geprüft, ob die Uhrzeit zwischen 9:30 und 17:00 liegt (lt = kleiner als; gt = größer als). Es wäre auch ein le und ge möglich: le =  kleiner/gleich als, ge =  größer/gleich als.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional 2:&#039;&#039;&#039;if( $month &amp;gt;= 6 &amp;amp;&amp;amp; $month &amp;lt;= 9) {&lt;br /&gt;
&lt;br /&gt;
Hier wird die numerische FHEM-Standard-Variable $month (Monat) auf größer/gleich bzw kleiner/gleich mit den binären Operatoren überprüft.&lt;br /&gt;
Die Funktion arbeitet also nur zwischen dem 6. und dem 9. Monat und dann auch nur zwischen 9:31 und 16:59.&lt;br /&gt;
&lt;br /&gt;
=== Status eines Kippfensters mit 2 Fensterkontakten abbilden ===&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
Es ist je ein Fensterkontakt der &#039;&#039;open&#039;&#039; oder &#039;&#039;closed&#039;&#039; meldet, oben und unten am Fenster angebracht.&lt;br /&gt;
Die Namen der beiden FHEM-Devices sind &#039;&#039;fensterKontaktOben&#039;&#039; und &#039;&#039;fensterKontaktUnten&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== notify Syntax ====&lt;br /&gt;
FHEM:&lt;br /&gt;
 define statusFenster notify fensterKontakt(Oben|Unten):(open|closed) {\&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039;)\&lt;br /&gt;
        { fhem &#039;set Terrassentuer open&#039; }\&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039;)\&lt;br /&gt;
        { fhem &#039;set Terrassentuer closed&#039; }\&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039;)\&lt;br /&gt;
        { fhem &#039;set Terrassentuer tilted&#039; }\&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039;)\&lt;br /&gt;
        { fhem &#039;set Terrassentuer undef&#039; }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Weitere Hinweise ==&lt;br /&gt;
* Entsprechend zu $EVENT gibt es auch noch $NAME und $TYPE. $NAME und $TYPE enthalten den Namen bzw. Typ des Ereignis auslösenden Gerätes.&lt;br /&gt;
* Wird der Perl-Code in einem &amp;lt;code&amp;gt;notify&amp;lt;/code&amp;gt; immer länger, lagere den Code wegen der Übersichtlichkeit in eine eigene Programmdatei aus, wie in [[99_myUtils anlegen]] beschrieben.&lt;br /&gt;
* Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreibt, muss man anscheinend darauf achten, dass keine abschließende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.&lt;br /&gt;
* Dieser {{Link2Forum|Topic=38520|Message=307325}} enthält Vorschläge zur Vorgehensweise bei der Erstellung von komplexen &#039;&#039;notify&#039;&#039; Definitionen bzw. bei deren Fehlerbehebung.&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
* [[Escapen in Perlbefehlen]]&lt;br /&gt;
* [[Klammerebenen]]&lt;br /&gt;
* Forenbeitrag zum Thema {{Link2Forum|Topic=115414|LinkText=Optimierung des Suchmusters - NOTIFYDEV}}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Hilfsmodul]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Zeitangaben,_rechnen_mit&amp;diff=37832</id>
		<title>Zeitangaben, rechnen mit</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Zeitangaben,_rechnen_mit&amp;diff=37832"/>
		<updated>2022-12-22T12:18:14Z</updated>

		<summary type="html">&lt;p&gt;TomLee: Formatierung angepasst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit leicht lesbaren Zeitangaben, wie &#039;&#039;07:30&#039;&#039;, &#039;&#039;23.05.2017, 09:20&#039;&#039; usw. kann in FHEM nicht ohne Weiteres gerechnet werden, da es sich um Zeichenketten handelt und nicht um Zahlen.&lt;br /&gt;
&lt;br /&gt;
== Verfahren zum Rechnen mit Zeitangaben, die als Zeichenkette vorliegen ==&lt;br /&gt;
Die Berechnung erfolgt in Perl. Das Verfahren besteht aus drei Schritten:&lt;br /&gt;
* Umwandeln der Zeichenketten in eine Zahl, z.B. Sekunden.&lt;br /&gt;
* Berechen einer Zeit als Zahl.&lt;br /&gt;
* Umwandeln der Zahl in eine Zeichenkette (Formatierung)&lt;br /&gt;
&lt;br /&gt;
=== Umwandeln eine Zeichenkette in eine Zahl ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText= Hinweis!&lt;br /&gt;
* Die von &amp;lt;code&amp;gt;timelocal&amp;lt;/code&amp;gt; erwartete Monatsangabe sind Ganzzahlwerte von 0 bis 11 für Januar bis Dezember.}} &lt;br /&gt;
Hier hängt das Verfahren von der Struktur der Zeichenkette ab.&lt;br /&gt;
&lt;br /&gt;
Perl und FHEM stellen Funktionen zur Umwandlung bereit.&lt;br /&gt;
* &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt; liefert die aktuelle Zeit in Sekunden &amp;lt;ref&amp;gt;http://perldoc.perl.org/functions/time.html&amp;lt;/ref&amp;gt; &lt;br /&gt;
* &amp;lt;code&amp;gt;time_str2num(&amp;quot;YYYY-MM-DD HH:MM:SS&amp;quot;)&amp;lt;/code&amp;gt; wandelt einen FHEM-Zeitstempel in Sekunden um &amp;lt;ref&amp;gt;{{Link2CmdRef|Lang=de|Anker=perl}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;timelocal(&amp;lt;Sekunden&amp;gt;, &amp;lt;Minuten&amp;gt;, &amp;lt;Stunden&amp;gt;, &amp;lt;Tag des Monats&amp;gt;, &amp;lt;Monat&amp;gt;, &amp;lt;Jahr&amp;gt;)&amp;lt;/code&amp;gt; wandelt einen Satz von Zeitelementen (Sekunden, Minuten, Stunden usw.) in Sekunden um &amp;lt;ref&amp;gt;http://perldoc.perl.org/Time/Local.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Sekunden + Minuten * 60 + Stunden * 60 * 60 + Tage * 24 * 60 * 60&amp;lt;/code&amp;gt; berechnen eines Summanden oder Subtrahenden aus Sekunden, Minuten, Stunden und Tagen.&lt;br /&gt;
==== Beispiel: Zeitstempel eines Readings in Sekunden umwandeln ====&lt;br /&gt;
  time_str2num(ReadingsTimestamp(&amp;lt;devicename&amp;gt;, &amp;lt;reading&amp;gt;,&amp;lt;defaultvalue&amp;gt;))&lt;br /&gt;
==== Konstanten innerhalb FHEM ====&lt;br /&gt;
FHEM stellt einige Konstanten&amp;lt;ref&amp;gt;{{Link2Forum|Topic=96959|Msg=901268|LinkText=Forum-Thread}}&amp;lt;/ref&amp;gt; bereit, um das Rechnen mit Zeiten zu erleichtern, &#039;&#039;DAYSECONDS&#039;&#039;, &#039;&#039;HOURSECONDS&#039;&#039;, und &#039;&#039;MINUTESECONDS&#039;&#039;. Obiger Code kann also auch so geschrieben werden:&lt;br /&gt;
 Sekunden + Minuten * MINUTESECONDS + Stunden * HOURSECONDS + Tage * DAYSECONDS&lt;br /&gt;
&lt;br /&gt;
=== Umwandeln einer Zahl in eine Zeichenkette ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText= Hinweis!&lt;br /&gt;
* Die von &amp;lt;code&amp;gt;localtime&amp;lt;/code&amp;gt; zurückgegebene Monatsangabe liegt im Bereich der Ganzzahlwerte 0 bis 11 für Januar bis Dezember.&lt;br /&gt;
* Werden keine Parameter angegeben, bezieht sich die Ausgabe auf den aktuellen Zeitpunkt.}}&lt;br /&gt;
Zur Umwandlung seien die folgenden Perl-Funktionen genannt:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;HH:MM, DD.MM.YY&amp;quot; =~ /(\d\d).(\d\d)..(\d\d).(\d\d).(\d\d)/&amp;lt;/code&amp;gt; extrahiert HH,MM,DD,MM und YY aus der Zeichenkette HH:MM, DD.MM.YY, die ein Datum in der angegebenen Form enthält. \d steht für eine Ziffer, der Punkt für ein beliebiges Zeichen, die () schreiben den Treffer in spezielle Variablen in der Reihenfolge ihrer Anordnung HH in $1, MM in $2, DD in $3 usw.&lt;br /&gt;
* &amp;lt;code&amp;gt;(Sekunden, Minuten, Stunden, Tag des Monats, Monat, Jahr, Nummer des Wochentages, Tag des Jahres, Sommerzeitkennzeichen) = localtime(Zeit in Sekunden)&amp;lt;/code&amp;gt; gibt die einzelnen Zeitelemente zurück &amp;lt;ref&amp;gt;http://perldoc.perl.org/functions/localtime.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;POSIX::strftime(&amp;lt;Format&amp;gt;,&amp;lt;Array mit Zeitelementen&amp;gt;)&amp;lt;/code&amp;gt;, wandelt ein Array aus Zeitelementen, wie es &amp;lt;code&amp;gt;localtime&amp;lt;/code&amp;gt; liefert in eine formatierte Zeichenkette um. &amp;lt;Format&amp;gt; wird mit Hilfe bestimmter Formatierungszeichen (%a für den Wochentagnamen, %d für den Tag des Monats usw. &amp;lt;ref&amp;gt;http://search.cpan.org/~dexter/POSIX-strftime-GNU-0.02/lib/POSIX/strftime/GNU.pm&amp;lt;/ref&amp;gt;) festgelegt.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Wochentag zu Datum ====&lt;br /&gt;
Zum heutigen Datum&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{return strftime(&amp;quot;%A&amp;quot;,localtime)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu einem vorgegebenen Datum&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    my ($d,$m,$y) = split(/\./,&amp;quot;06.09.2021&amp;quot;);&lt;br /&gt;
    $m-=1;&lt;br /&gt;
    return strftime(&amp;quot;%A&amp;quot;,localtime(timelocal(&#039;0&#039;,&#039;0&#039;,&#039;0&#039;,$d,$m,$y)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Berechnungsbeispiele ===&lt;br /&gt;
Allen Berechnungen zu Grunde liegt die Vorgehensweise in absoluten Sekunden bezogen auf einen Referenzzeitpunkt zu rechnen. Damit umgeht man jeden Wechsel Stunden/Tage/Monate/Jahre. &lt;br /&gt;
&lt;br /&gt;
Die einzeiligen Beispiele sollten im Eingabefeld von FHEMWEB ausführbar sein.&lt;br /&gt;
&lt;br /&gt;
==== Addition zu einem Zeitstempel ====&lt;br /&gt;
Gegeben sei ein [[Readings|Reading]] &#039;&#039;motion&#039;&#039; des [[Gerät|Gerätes]] &#039;&#039;BM1&#039;&#039; mit einem Zeitstempel &#039;&#039;2017-08-11 14:17:13&#039;&#039;. Es sollen 2 Stunden und 12 Minuten addiert werden und das Ergebnis als HH:MM dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{POSIX::strftime(&amp;quot;%H:%M&amp;quot;,localtime(time_str2num(ReadingsTimestamp(&amp;quot;BM1&amp;quot;,&amp;quot;motion&amp;quot;,&amp;quot;2000-01-01 00:00:00&amp;quot;))+2*60*60+12*60))}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schrittweise:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{&lt;br /&gt;
  my $timestamp = ReadingsTimestamp(&amp;quot;BM1&amp;quot;,&amp;quot;motion&amp;quot;,&amp;quot;2000-01-01 00:00:00&amp;quot;);&lt;br /&gt;
  my $seconds = time_str2num($timestamp)+2*60*60+12*60;&lt;br /&gt;
  my $result = POSIX::strftime(&amp;quot;%H:%M&amp;quot;,localtime($seconds));&lt;br /&gt;
  return $result;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Addition zum aktuellen Zeitpunkt ====&lt;br /&gt;
Zur aktuellen Zeit sollen 30 Minuten addiert und das Ergebnis als HH:MM:SS dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time+30*60))}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Subtraktion vom aktuellen Zeitpunkt ====&lt;br /&gt;
Zur aktuellen Zeit sollen 45 Minuten subtrahiert und das Ergebnis als HH:MM:SS dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time-45*60))}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Kalendertage von heute bis zu einem Datum ====&lt;br /&gt;
Zu einem bestimmten Kalendertag soll die Differenz in ganzen Tagen bestimmt werden.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{(time_str2num(&#039;2021-04-30&#039;) - time_str2num(strftime &#039;%F&#039;,localtime))/86400}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das Zieldatum kann z.B. ein Termin aus dem Kalender sein: &lt;br /&gt;
:&amp;lt;code&amp;gt;fhem(&#039;get AbfallKalender events timeFormat:&amp;quot;%F&amp;quot; format:custom=&amp;quot;$T1&amp;quot; limit:from=0,count=1&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Weitere Funktionen zur Zeitumwandlung ===&lt;br /&gt;
* [[DevelopmentModuleAPI#Time_.2F_Timestamp|Time/Timestamp]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2_CLIENT&amp;diff=37679</id>
		<title>MQTT2 CLIENT</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2_CLIENT&amp;diff=37679"/>
		<updated>2022-11-16T21:13:29Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Define */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Stellt als Gateway die Verbindung zu einem MQTT-Broker her&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=MQTT2_CLIENT&lt;br /&gt;
|ModForumArea=MQTT&lt;br /&gt;
|ModTechName=10_MQTT2_CLIENT.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])}}&lt;br /&gt;
Das Modul [[MQTT2_CLIENT]] ermöglicht es, Geräte einzubinden, die über eine MQTT-Schnittstelle verfügen. Es fungiert als [[Interface|Verbindung]] zwischen FHEM und einem externen MQTT Server (z.B. &#039;&#039;mosquitto&#039;&#039;) und repräsentiert ein  &#039;&#039;&#039;&#039;&#039;MQTT Gateway&#039;&#039;&#039;&#039;&#039;. Die durch die Module [[MQTT2_DEVICE]] oder {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=en|Label=MQTT_GENERIC_BRIDGE}} repräsentierten Client-Geräte sind gesondert anzulegen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Es muss für jedes MQTT-Gateway ein MQTT-Server eingerichtet und erreichbar sein.&lt;br /&gt;
Eine Anleitung zur Einrichtung eines Mosquitto-Brokers finden Sie z.B. im Artikel [[MQTT Einführung]].&lt;br /&gt;
{{Hinweis|FHEM selbst kann ebenfalls mit {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} als MQTT-Server eingesetzt werden. In diesem Fall ist innerhalb dieser FHEM-Instanz kein MQTT2_CLIENT-Gerät erforderlich. Befindet sich ein MQTT2_SERVER in einer anderen FHEM-Instanz, kann dieser von dort aus mit MQTT2_CLIENT verbunden werden.}}&lt;br /&gt;
&lt;br /&gt;
== Kurzübersicht ==&lt;br /&gt;
{{Hinweis|Eine Übersicht über die verschiedenen Möglichkeiten, MQTT in FHEM zu nutzen, ist in [[MQTT#FHEM und MQTT]] zu finden.}}&lt;br /&gt;
&lt;br /&gt;
== Define ==&lt;br /&gt;
Das MQTT Gateway wird angelegt mit&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;meinMQTT2ClientName&amp;gt; MQTT2_CLIENT &amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Sofern der MQTT-Server mit FHEM über localhost kommunizieren kann, sollte als IP 127.0.0.1 verwendet werden.}}&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
Danach können entsprechende Client-Devices angelegt werden, in der Regel als [[MQTT2 DEVICE|MQTT2_DEVICE]]. Dabei kann ein physikalisches Device (Sensor oder Aktor), das über mqtt kommuniziert (z.B. ein ESP8266- oder ESP32-basiertes Gerät), ein oder mehrere Devices des Typs &#039;&#039;MQTT2_DEVICE&#039;&#039; entsprechen.&lt;br /&gt;
&lt;br /&gt;
=== autocreate und bridgeRegexp ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Für weitere bridge-Geräte wird bei Verwendung des MQTT2_CLIENT empfohlen, die betreffenden templates jeweils auf eine Kopie des &amp;quot;Sammeldevices&amp;quot; MQTT2_CLIENT_general_bridge anzuwenden und dabei vorab die CID auf einen anderen Wert festzulegen als die ClientID des MQTT2_CLIENT-Geräts&amp;lt;ref&amp;gt;Dabei empfielt sich der [[Import von Code Snippets|RAW-Editor]], beachten Sie hierzu aber die Hinweise zur Änderung der CID!&amp;lt;/ref&amp;gt;! Hat man neue Geräte mit bridgeRegexp-Einträgen erstellt oder die bridgeRegexp-Einträge verändert, kann in der Regel gefahrlos zunächst die readingList am &amp;quot;Sammeldevice&amp;quot; (bzw. der MQTT2_CLIENT_general_bridge) gelöscht werden, so dass dann eingehende Nachrichten auch tatsächlich gegen die bridgeRegexp geprüft werden müssen.}}Möchte man &#039;&#039;autocreate&#039;&#039; verwenden, um automatisiert MQTT2_DEVICE-Geräte anlegen zu lassen, empfiehlt es sich, auf das erste automatisch angelegte Gerät das [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|template]] &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; anzuwenden. Dadurch werden anschließend bestimmte eingehenden MQTT-Messages für eine Anzahl häufig anzutreffender Gerätetypen in separate, automatisch angelegte MQTT2_DEVICE-Geräte umgeleitet&amp;lt;ref&amp;gt;Näheres zur Entstehung der derzeitigen bridgeRegexp des templates &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; sind diesem {{Link2Forum|Topic=98126|LinkText=Forenthread}} zu entnehmen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
{{Hinweis|Da hierzu die typischen Topicstrukturen und Benennungen genutzt werden, sollten die MQTT-Einstellungen hinsichtlich des topictrees auf den Geräten auf den jeweiligen defaults belassen werden.}}&lt;br /&gt;
&lt;br /&gt;
Das attrTemplate &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; löscht die readingList des Geräts, auf das es angewendet wird und ergänzt das Device mit der beschriebenen &#039;&#039;bridgeRegexp&#039;&#039;. Dies muß nur einmalig erfolgen, für alle weiteren - mittels bridgeRegexp erstellten - Geräte gilt dann - mit o.g. Einschränkungen bei der Erstellung von weiteren &#039;&#039;bridge&#039;&#039;-Geräten - das allgemeine Vorgehen für MQTT2_DEVICE, z.B. auch die Festlegung weiterer Geräten mit &#039;&#039;bridgeRegexp&#039;&#039;-Attributen wie in den [[MQTT2-Module - Praxisbeispiele|Praxisbeispielen]] beschrieben, dort findet sich auch ein Abschnitt zum Attribut [[MQTT2-Module_-_Praxisbeispiele#bridgeRegexp|bridgeRegexp]] allgemein.&lt;br /&gt;
&lt;br /&gt;
Will man Geräte unterscheiden, die sich nur z.B im ersten Teil der Topic-Struktur unterscheiden, kann man dies durch Anpassung der &#039;&#039;bridgeRegexp&#039;&#039; erreichen oder dadurch, dass man die betreffenden Geräte manuell anlegt. Dabei sollte man jedoch tendenziell sehr restriktive bridgeRegexp-Ausdrücke verwenden&amp;lt;ref&amp;gt;Zum Hintergrund siehe diese {{Link2Forum|Topic=98206|LinkText=Forendiskussion}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== ignoreRegexp ===&lt;br /&gt;
Da ein externer MQTT-Server auch alle ausgehenden Anweisungen wieder an alle Clients zurückliefert, führt dies iVm. &#039;&#039;autocreate&#039;&#039; dazu, dass in vielen Fälle Events doppelt - und überdies in Teilen sachlich falsch - erzeugt werden. Um nur die Rückmeldung des Geräts über den Vollzug der Anweisung auszuwerten und die ausgehenden Informationen zu verwerfen, kann man am Interface ein &#039;&#039;ignoreRegexp&#039;&#039; setzen. Für typische Befehlsstrukturen von Tasmota, Shelly und zigbee2mqtt sowie das Auswerten von - für HomeAssistant gedachten - autodiscovery-Meldungen wäre z.B. folgendes &#039;&#039;ignoreRegexp&#039;&#039; zu verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr MQTT2_Mosquitto_Client ignoreRegexp cmnd/[^:&amp;quot;]+:|homeassistant/[^:&amp;quot;]+/config:|shellies/[^:&amp;quot;]+/command:|zigbee2mqtt/[^/]+/set:|milight/0x[0-9a-fA-F]{1,4}/.*/[0-8]:|tasmota/discovery/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Dieses Attribut wäre auch an einem &#039;&#039;MQTT2_SERVER&#039;&#039; sinnvollerweise entsprechend zu setzen, wenn über diesen andere (Software-)Client-Systeme angebunden werden, die ebenfalls direkt MQTT-Anweisungen an die anderen Clients senden können sollen. Beispiele wären verteilte Systeme mit MQTT2_CLIENT auf entfernten FHEM-Installationen oder die Verwendung von MQTT-basierten User-Interfaces (NodeRed oä).}}&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2_CLIENT&amp;diff=37678</id>
		<title>MQTT2 CLIENT</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2_CLIENT&amp;diff=37678"/>
		<updated>2022-11-16T21:12:25Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Define */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Stellt als Gateway die Verbindung zu einem MQTT-Broker her&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=MQTT2_CLIENT&lt;br /&gt;
|ModForumArea=MQTT&lt;br /&gt;
|ModTechName=10_MQTT2_CLIENT.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])}}&lt;br /&gt;
Das Modul [[MQTT2_CLIENT]] ermöglicht es, Geräte einzubinden, die über eine MQTT-Schnittstelle verfügen. Es fungiert als [[Interface|Verbindung]] zwischen FHEM und einem externen MQTT Server (z.B. &#039;&#039;mosquitto&#039;&#039;) und repräsentiert ein  &#039;&#039;&#039;&#039;&#039;MQTT Gateway&#039;&#039;&#039;&#039;&#039;. Die durch die Module [[MQTT2_DEVICE]] oder {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=en|Label=MQTT_GENERIC_BRIDGE}} repräsentierten Client-Geräte sind gesondert anzulegen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Es muss für jedes MQTT-Gateway ein MQTT-Server eingerichtet und erreichbar sein.&lt;br /&gt;
Eine Anleitung zur Einrichtung eines Mosquitto-Brokers finden Sie z.B. im Artikel [[MQTT Einführung]].&lt;br /&gt;
{{Hinweis|FHEM selbst kann ebenfalls mit {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} als MQTT-Server eingesetzt werden. In diesem Fall ist innerhalb dieser FHEM-Instanz kein MQTT2_CLIENT-Gerät erforderlich. Befindet sich ein MQTT2_SERVER in einer anderen FHEM-Instanz, kann dieser von dort aus mit MQTT2_CLIENT verbunden werden.}}&lt;br /&gt;
&lt;br /&gt;
== Kurzübersicht ==&lt;br /&gt;
{{Hinweis|Eine Übersicht über die verschiedenen Möglichkeiten, MQTT in FHEM zu nutzen, ist in [[MQTT#FHEM und MQTT]] zu finden.}}&lt;br /&gt;
&lt;br /&gt;
== Define ==&lt;br /&gt;
Das MQTT Gateway wird angelegt mit&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;meinMQTT2ClientName&amp;gt; MQTT2_CLIENT &amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Sofern der MQTT-Server mit FEHM über localhost kommunizieren kann, sollte als IP 127.0.0.1 verwendet werden.}}&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
Danach können entsprechende Client-Devices angelegt werden, in der Regel als [[MQTT2 DEVICE|MQTT2_DEVICE]]. Dabei kann ein physikalisches Device (Sensor oder Aktor), das über mqtt kommuniziert (z.B. ein ESP8266- oder ESP32-basiertes Gerät), ein oder mehrere Devices des Typs &#039;&#039;MQTT2_DEVICE&#039;&#039; entsprechen.&lt;br /&gt;
&lt;br /&gt;
=== autocreate und bridgeRegexp ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Für weitere bridge-Geräte wird bei Verwendung des MQTT2_CLIENT empfohlen, die betreffenden templates jeweils auf eine Kopie des &amp;quot;Sammeldevices&amp;quot; MQTT2_CLIENT_general_bridge anzuwenden und dabei vorab die CID auf einen anderen Wert festzulegen als die ClientID des MQTT2_CLIENT-Geräts&amp;lt;ref&amp;gt;Dabei empfielt sich der [[Import von Code Snippets|RAW-Editor]], beachten Sie hierzu aber die Hinweise zur Änderung der CID!&amp;lt;/ref&amp;gt;! Hat man neue Geräte mit bridgeRegexp-Einträgen erstellt oder die bridgeRegexp-Einträge verändert, kann in der Regel gefahrlos zunächst die readingList am &amp;quot;Sammeldevice&amp;quot; (bzw. der MQTT2_CLIENT_general_bridge) gelöscht werden, so dass dann eingehende Nachrichten auch tatsächlich gegen die bridgeRegexp geprüft werden müssen.}}Möchte man &#039;&#039;autocreate&#039;&#039; verwenden, um automatisiert MQTT2_DEVICE-Geräte anlegen zu lassen, empfiehlt es sich, auf das erste automatisch angelegte Gerät das [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|template]] &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; anzuwenden. Dadurch werden anschließend bestimmte eingehenden MQTT-Messages für eine Anzahl häufig anzutreffender Gerätetypen in separate, automatisch angelegte MQTT2_DEVICE-Geräte umgeleitet&amp;lt;ref&amp;gt;Näheres zur Entstehung der derzeitigen bridgeRegexp des templates &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; sind diesem {{Link2Forum|Topic=98126|LinkText=Forenthread}} zu entnehmen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
{{Hinweis|Da hierzu die typischen Topicstrukturen und Benennungen genutzt werden, sollten die MQTT-Einstellungen hinsichtlich des topictrees auf den Geräten auf den jeweiligen defaults belassen werden.}}&lt;br /&gt;
&lt;br /&gt;
Das attrTemplate &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; löscht die readingList des Geräts, auf das es angewendet wird und ergänzt das Device mit der beschriebenen &#039;&#039;bridgeRegexp&#039;&#039;. Dies muß nur einmalig erfolgen, für alle weiteren - mittels bridgeRegexp erstellten - Geräte gilt dann - mit o.g. Einschränkungen bei der Erstellung von weiteren &#039;&#039;bridge&#039;&#039;-Geräten - das allgemeine Vorgehen für MQTT2_DEVICE, z.B. auch die Festlegung weiterer Geräten mit &#039;&#039;bridgeRegexp&#039;&#039;-Attributen wie in den [[MQTT2-Module - Praxisbeispiele|Praxisbeispielen]] beschrieben, dort findet sich auch ein Abschnitt zum Attribut [[MQTT2-Module_-_Praxisbeispiele#bridgeRegexp|bridgeRegexp]] allgemein.&lt;br /&gt;
&lt;br /&gt;
Will man Geräte unterscheiden, die sich nur z.B im ersten Teil der Topic-Struktur unterscheiden, kann man dies durch Anpassung der &#039;&#039;bridgeRegexp&#039;&#039; erreichen oder dadurch, dass man die betreffenden Geräte manuell anlegt. Dabei sollte man jedoch tendenziell sehr restriktive bridgeRegexp-Ausdrücke verwenden&amp;lt;ref&amp;gt;Zum Hintergrund siehe diese {{Link2Forum|Topic=98206|LinkText=Forendiskussion}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== ignoreRegexp ===&lt;br /&gt;
Da ein externer MQTT-Server auch alle ausgehenden Anweisungen wieder an alle Clients zurückliefert, führt dies iVm. &#039;&#039;autocreate&#039;&#039; dazu, dass in vielen Fälle Events doppelt - und überdies in Teilen sachlich falsch - erzeugt werden. Um nur die Rückmeldung des Geräts über den Vollzug der Anweisung auszuwerten und die ausgehenden Informationen zu verwerfen, kann man am Interface ein &#039;&#039;ignoreRegexp&#039;&#039; setzen. Für typische Befehlsstrukturen von Tasmota, Shelly und zigbee2mqtt sowie das Auswerten von - für HomeAssistant gedachten - autodiscovery-Meldungen wäre z.B. folgendes &#039;&#039;ignoreRegexp&#039;&#039; zu verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr MQTT2_Mosquitto_Client ignoreRegexp cmnd/[^:&amp;quot;]+:|homeassistant/[^:&amp;quot;]+/config:|shellies/[^:&amp;quot;]+/command:|zigbee2mqtt/[^/]+/set:|milight/0x[0-9a-fA-F]{1,4}/.*/[0-8]:|tasmota/discovery/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Dieses Attribut wäre auch an einem &#039;&#039;MQTT2_SERVER&#039;&#039; sinnvollerweise entsprechend zu setzen, wenn über diesen andere (Software-)Client-Systeme angebunden werden, die ebenfalls direkt MQTT-Anweisungen an die anderen Clients senden können sollen. Beispiele wären verteilte Systeme mit MQTT2_CLIENT auf entfernten FHEM-Installationen oder die Verwendung von MQTT-basierten User-Interfaces (NodeRed oä).}}&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2_CLIENT&amp;diff=37677</id>
		<title>MQTT2 CLIENT</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2_CLIENT&amp;diff=37677"/>
		<updated>2022-11-16T21:04:12Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Define */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Stellt als Gateway die Verbindung zu einem MQTT-Broker her&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=MQTT2_CLIENT&lt;br /&gt;
|ModForumArea=MQTT&lt;br /&gt;
|ModTechName=10_MQTT2_CLIENT.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])}}&lt;br /&gt;
Das Modul [[MQTT2_CLIENT]] ermöglicht es, Geräte einzubinden, die über eine MQTT-Schnittstelle verfügen. Es fungiert als [[Interface|Verbindung]] zwischen FHEM und einem externen MQTT Server (z.B. &#039;&#039;mosquitto&#039;&#039;) und repräsentiert ein  &#039;&#039;&#039;&#039;&#039;MQTT Gateway&#039;&#039;&#039;&#039;&#039;. Die durch die Module [[MQTT2_DEVICE]] oder {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=en|Label=MQTT_GENERIC_BRIDGE}} repräsentierten Client-Geräte sind gesondert anzulegen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Es muss für jedes MQTT-Gateway ein MQTT-Server eingerichtet und erreichbar sein.&lt;br /&gt;
Eine Anleitung zur Einrichtung eines Mosquitto-Brokers finden Sie z.B. im Artikel [[MQTT Einführung]].&lt;br /&gt;
{{Hinweis|FHEM selbst kann ebenfalls mit {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} als MQTT-Server eingesetzt werden. In diesem Fall ist innerhalb dieser FHEM-Instanz kein MQTT2_CLIENT-Gerät erforderlich. Befindet sich ein MQTT2_SERVER in einer anderen FHEM-Instanz, kann dieser von dort aus mit MQTT2_CLIENT verbunden werden.}}&lt;br /&gt;
&lt;br /&gt;
== Kurzübersicht ==&lt;br /&gt;
{{Hinweis|Eine Übersicht über die verschiedenen Möglichkeiten, MQTT in FHEM zu nutzen, ist in [[MQTT#FHEM und MQTT]] zu finden.}}&lt;br /&gt;
&lt;br /&gt;
== Define ==&lt;br /&gt;
Das MQTT Gateway wird angelegt mit&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;&#039;&#039;meinMQTT2ClientName&amp;gt;&#039;&#039; MQTT2_CLIENT &amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Sofern der MQTT-Server mit FEHM über localhost kommunizieren kann, sollte als IP 127.0.0.1 verwendet werden.}}&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
Danach können entsprechende Client-Devices angelegt werden, in der Regel als [[MQTT2 DEVICE|MQTT2_DEVICE]]. Dabei kann ein physikalisches Device (Sensor oder Aktor), das über mqtt kommuniziert (z.B. ein ESP8266- oder ESP32-basiertes Gerät), ein oder mehrere Devices des Typs &#039;&#039;MQTT2_DEVICE&#039;&#039; entsprechen.&lt;br /&gt;
&lt;br /&gt;
=== autocreate und bridgeRegexp ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Für weitere bridge-Geräte wird bei Verwendung des MQTT2_CLIENT empfohlen, die betreffenden templates jeweils auf eine Kopie des &amp;quot;Sammeldevices&amp;quot; MQTT2_CLIENT_general_bridge anzuwenden und dabei vorab die CID auf einen anderen Wert festzulegen als die ClientID des MQTT2_CLIENT-Geräts&amp;lt;ref&amp;gt;Dabei empfielt sich der [[Import von Code Snippets|RAW-Editor]], beachten Sie hierzu aber die Hinweise zur Änderung der CID!&amp;lt;/ref&amp;gt;! Hat man neue Geräte mit bridgeRegexp-Einträgen erstellt oder die bridgeRegexp-Einträge verändert, kann in der Regel gefahrlos zunächst die readingList am &amp;quot;Sammeldevice&amp;quot; (bzw. der MQTT2_CLIENT_general_bridge) gelöscht werden, so dass dann eingehende Nachrichten auch tatsächlich gegen die bridgeRegexp geprüft werden müssen.}}Möchte man &#039;&#039;autocreate&#039;&#039; verwenden, um automatisiert MQTT2_DEVICE-Geräte anlegen zu lassen, empfiehlt es sich, auf das erste automatisch angelegte Gerät das [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|template]] &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; anzuwenden. Dadurch werden anschließend bestimmte eingehenden MQTT-Messages für eine Anzahl häufig anzutreffender Gerätetypen in separate, automatisch angelegte MQTT2_DEVICE-Geräte umgeleitet&amp;lt;ref&amp;gt;Näheres zur Entstehung der derzeitigen bridgeRegexp des templates &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; sind diesem {{Link2Forum|Topic=98126|LinkText=Forenthread}} zu entnehmen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
{{Hinweis|Da hierzu die typischen Topicstrukturen und Benennungen genutzt werden, sollten die MQTT-Einstellungen hinsichtlich des topictrees auf den Geräten auf den jeweiligen defaults belassen werden.}}&lt;br /&gt;
&lt;br /&gt;
Das attrTemplate &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; löscht die readingList des Geräts, auf das es angewendet wird und ergänzt das Device mit der beschriebenen &#039;&#039;bridgeRegexp&#039;&#039;. Dies muß nur einmalig erfolgen, für alle weiteren - mittels bridgeRegexp erstellten - Geräte gilt dann - mit o.g. Einschränkungen bei der Erstellung von weiteren &#039;&#039;bridge&#039;&#039;-Geräten - das allgemeine Vorgehen für MQTT2_DEVICE, z.B. auch die Festlegung weiterer Geräten mit &#039;&#039;bridgeRegexp&#039;&#039;-Attributen wie in den [[MQTT2-Module - Praxisbeispiele|Praxisbeispielen]] beschrieben, dort findet sich auch ein Abschnitt zum Attribut [[MQTT2-Module_-_Praxisbeispiele#bridgeRegexp|bridgeRegexp]] allgemein.&lt;br /&gt;
&lt;br /&gt;
Will man Geräte unterscheiden, die sich nur z.B im ersten Teil der Topic-Struktur unterscheiden, kann man dies durch Anpassung der &#039;&#039;bridgeRegexp&#039;&#039; erreichen oder dadurch, dass man die betreffenden Geräte manuell anlegt. Dabei sollte man jedoch tendenziell sehr restriktive bridgeRegexp-Ausdrücke verwenden&amp;lt;ref&amp;gt;Zum Hintergrund siehe diese {{Link2Forum|Topic=98206|LinkText=Forendiskussion}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== ignoreRegexp ===&lt;br /&gt;
Da ein externer MQTT-Server auch alle ausgehenden Anweisungen wieder an alle Clients zurückliefert, führt dies iVm. &#039;&#039;autocreate&#039;&#039; dazu, dass in vielen Fälle Events doppelt - und überdies in Teilen sachlich falsch - erzeugt werden. Um nur die Rückmeldung des Geräts über den Vollzug der Anweisung auszuwerten und die ausgehenden Informationen zu verwerfen, kann man am Interface ein &#039;&#039;ignoreRegexp&#039;&#039; setzen. Für typische Befehlsstrukturen von Tasmota, Shelly und zigbee2mqtt sowie das Auswerten von - für HomeAssistant gedachten - autodiscovery-Meldungen wäre z.B. folgendes &#039;&#039;ignoreRegexp&#039;&#039; zu verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr MQTT2_Mosquitto_Client ignoreRegexp cmnd/[^:&amp;quot;]+:|homeassistant/[^:&amp;quot;]+/config:|shellies/[^:&amp;quot;]+/command:|zigbee2mqtt/[^/]+/set:|milight/0x[0-9a-fA-F]{1,4}/.*/[0-8]:|tasmota/discovery/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Dieses Attribut wäre auch an einem &#039;&#039;MQTT2_SERVER&#039;&#039; sinnvollerweise entsprechend zu setzen, wenn über diesen andere (Software-)Client-Systeme angebunden werden, die ebenfalls direkt MQTT-Anweisungen an die anderen Clients senden können sollen. Beispiele wären verteilte Systeme mit MQTT2_CLIENT auf entfernten FHEM-Installationen oder die Verwendung von MQTT-basierten User-Interfaces (NodeRed oä).}}&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Notify&amp;diff=37398</id>
		<title>Notify</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Notify&amp;diff=37398"/>
		<updated>2022-04-10T14:11:12Z</updated>

		<summary type="html">&lt;p&gt;TomLee: Nicht nötige Klammern entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:notify}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Ausführung von Anweisung(en) als Reaktion auf Ereignisse&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=notify&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=91_notify.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
{{Hinweis|Weitere grundlegende Informationen/Beispiele zu notify enthält [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM]}}&lt;br /&gt;
Das Hilfsmodul notify dient dazu [[Ereignis|Ereignisse]] über ein Suchmuster zu erkennen und bei einem Treffer eine Aktion auszulösen. Mit &#039;&#039;notify&#039;&#039; und anderen [[Eventhandler|Eventhandlern]] &amp;lt;ref&amp;gt;hierzu gehören u.a. auch [[DOIF]], [[THRESHOLD]] und [[watchdog]]&amp;lt;/ref&amp;gt; ist es möglich, Logikfunktionen im FHEM abzubilden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039; &lt;br /&gt;
* Wird das Licht in der Küche eingeschaltet, soll FHEM dort auch das Radio einschalten. &lt;br /&gt;
* Bei Druck auf einen Taster soll die Umwälzpumpe für das Warmwasser eingeschaltet werden. &lt;br /&gt;
* Erweiterte Möglichkeiten: Aber nur, wenn das Radio aus ist bzw. die Temperatur im Rücklauf des Warmwassers unterhalb einer bestimmten Schwelle liegt&amp;lt;ref&amp;gt;vgl. hierzu z.B. {{Link2CmdRef|Anker=devspec|Label=FILTER}} und [[if-condition]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; notify &amp;lt;Suchmuster&amp;gt; &amp;lt;command&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;[[Regulärer Ausdruck|Suchmuster]]&#039;&#039;  (häufig als Regexp = regular expression = regulärer Ausdruck bezeichnet) ist sehr wichtig: Es ist entweder der Name des auslösenden (&amp;quot;triggernden&amp;quot;) Gerätes oder die Kombination aus Gerät und auslösendem Ereignis (Event) &amp;lt;code&amp;gt;Gerätename:Event&amp;lt;/code&amp;gt;. Die Events kann man dem [[Event_monitor|Event-Monitor]] entnehmen. Wenn dort z.B. &amp;lt;code&amp;gt;Rollo1&amp;lt;/code&amp;gt; steht, dann reagiert &#039;&#039;notify&#039;&#039; auf &amp;lt;code&amp;gt;Rollo1 on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Rollo1 off&amp;lt;/code&amp;gt; usw.&lt;br /&gt;
&lt;br /&gt;
Wenn man mehrere Suchmuster kombinieren möchte, kann man diese in Klammer schreiben, als Trenner wird dann Pipe (|) genutzt: &amp;lt;code&amp;gt;(Rollo1|Rollo2|Steckdose5)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auch die Verwendung von Platzhaltern ist möglich&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;code&amp;gt;Rollo.&amp;lt;/code&amp;gt; → das notify reagiert auf alles was mit Rollo und &#039;&#039;&#039;einem&#039;&#039;&#039; weiteren beliebigen Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg&lt;br /&gt;
* &amp;lt;code&amp;gt;Rollo.*&amp;lt;/code&amp;gt; → notify reagiert auf alles das mit Rollo beginnt&lt;br /&gt;
* &amp;lt;code&amp;gt;.*isch&amp;lt;/code&amp;gt; → auf alles das mit isch aufhört (Tisch, Fisch)&lt;br /&gt;
* &amp;lt;code&amp;gt;Schalter(1|2|3)&amp;lt;/code&amp;gt; → hört auf Schalter1, Schalter2 und Schalter3&lt;br /&gt;
* &amp;lt;code&amp;gt;dimmer:pct:.(100|7[6-9]|[89][0-9])&amp;lt;/code&amp;gt;  → reagiert, wenn pct einen Wert über 75 annimmt.&lt;br /&gt;
&lt;br /&gt;
Suchmuster/Regex kann man im Internet beispielsweise auf [http://regexpal.com/| http://regexpal.com/] testen.&lt;br /&gt;
&lt;br /&gt;
Es gibt seit Juli 2020 eine Perlfunktion notifyRegexpCheck zum Testen, wie FHEM über das Suchmuster &amp;quot;denkt&amp;quot; - siehe {{Link2Forum|Topic=111938|Message=1074202|LinkText=diesen Beitrag}} im Forum.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Das &#039;&#039;&#039;Suchmuster&#039;&#039;&#039; wird notify-intern um das Zeichen ^ (beginnt mit) und das Zeichen $ (endet mit) ergänzt&amp;lt;ref&amp;gt;Der Eventhandler [[DOIF]] verwendet die in Perl übliche Syntax für reguläre Ausdrücke als DOIF-Suchmuster.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Deshalb darf das Suchmuster nicht mit einem üblichen [[Regulärer Ausdruck|&#039;&#039;&#039;Regulären Ausdruck&#039;&#039;&#039;]], wie er in Perl&amp;lt;ref&amp;gt;https://perldoc.perl.org/perlre.html&amp;lt;/ref&amp;gt; verwendet wird, gleichgesetzt werden, da die Ergänzung zu einem grundsätzlich unterschiedlichen Verhalten führt, siehe nachstehendes Beispiel.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel für das unterschiedliche Verhalten von &#039;&#039;Suchmuster&#039;&#039; und &#039;&#039;regulären Ausdruck&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für einen &#039;&#039;&#039;regulären Audruck&#039;&#039;&#039; gilt: Wenn  der reguläre Ausdruck &#039;&#039;lampe&#039;&#039; ist und das [[Ereignis]] &#039;&#039;tischlampe&#039;&#039; dann passen &#039;&#039;tischlampe&#039;&#039; und &#039;&#039;lampe&#039;&#039; zueinander.&lt;br /&gt;
&lt;br /&gt;
Für das &#039;&#039;&#039;Suchmuster&#039;&#039;&#039; gilt: Wenn  das Suchmuster &#039;&#039;lampe&#039;&#039; ist und das [[Ereignis]] &#039;&#039;tischlampe&#039;&#039; dann passen &#039;&#039;tischlampe&#039;&#039; und &#039;&#039;lampe&#039;&#039; &#039;&#039;&#039;nicht&#039;&#039;&#039; zueinander, weil das Suchmuster zu ^lampe$ ergänzt wird und damit exakt nur auf &#039;&#039;lampe&#039;&#039; matcht (passt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen Zuordnung zum Event&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  2020-01-21 22:40:39 HUEDevice VibrationTest1 battery: 88&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !!$NAME !! colspan=&amp;quot;2&amp;quot; |$EVENT&lt;br /&gt;
|-&lt;br /&gt;
| ||||$EVTPART0 ||$EVTPART1&lt;br /&gt;
|-&lt;br /&gt;
|2020-01-21 22:40:39 HUEDevice|| VibrationTest1|| battery:|| 88&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 2&#039;&#039;&#039;&lt;br /&gt;
  2021-05-09 19:11:43 FB_CALLMONITOR cm_example external_name: Graf Herzog von und zu ...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !!$NAME !! colspan=&amp;quot;7&amp;quot; |$EVENT&lt;br /&gt;
|-&lt;br /&gt;
| ||||$EVTPART0 ||$EVTPART1 || $EVTPART2|| $EVTPART3 || $EVTPART4|| $EVTPART5|| ...&lt;br /&gt;
|-&lt;br /&gt;
|2021-05-09 19:11:43 FB_CALLMONITOR|| cm_example|| external_name:|| Graf|| Herzog|| von|| und|| zu|| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FHEMWEB-unterstütztes Anlegen eines notify ==&lt;br /&gt;
{{Hinweis|Die Erstellung eines notify und insbesondere die korrekte Angabe des Suchmusters (Regex) führt gerade bei Einsteigern immer wieder zu Schwierigkeiten. Zur Fehlerminimierung empfiehlt es sich zum einen, die [[Konfiguration]] nicht direkt zu bearbeiten, sondern die &amp;quot;Befehl-Eingabezeile&amp;quot;, die &amp;quot;Objektdetails&amp;quot; oder den [[Import von Code Snippets|Import von RAW-Definitionen]] zur Bearbeitung zu nutzen.}}&lt;br /&gt;
&lt;br /&gt;
=== Event Monitor ===&lt;br /&gt;
Die komfortabelste Möglichkeit, die häufigsten Event-Handler zu erstellen, bietet der [[Event monitor|Event-Monitor]]. Die Vorgehensweis ist in dem zugehörigen Artikel dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Regexp wizard ===&lt;br /&gt;
Zudem enthält FHEM einen Regexp wizard mit dem Regex anhand der in FHEM vorhandenen Devices und deren Events aus einer Auswahlbox selektiert werden können. Voraussetzungen sind:&lt;br /&gt;
* Aktivierung des Hilfsmoduls [[eventTypes]] (bei allen Neuinstallationen Standard) &lt;br /&gt;
* das gesuchte Ereignis (Event) ist nach Aktivierung des Hilfsmoduls bereits mindestens einmal eingetreten&lt;br /&gt;
&lt;br /&gt;
Schrittweise Darstellung der Nutzung des Regexp wizard zur Anlage eines &amp;quot;notify&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
In das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] eingeben und mit {{Taste|Enter}} bestätigen:&lt;br /&gt;
 define ntest notify a b&lt;br /&gt;
Als Beispiel wird ein notify mit &amp;lt;name&amp;gt; &amp;quot;ntest&amp;quot; angelegt. &amp;quot;a&amp;quot; und &amp;quot;b&amp;quot; sind beliebige Platzhalter für &amp;lt;Suchmuster&amp;gt; und &amp;lt;Command&amp;gt;, die bei der weiteren Bearbeitung mit dem endgültigen Werten ersetzt werden.&lt;br /&gt;
Der Regexp wizard öffnet sich:&lt;br /&gt;
[[Datei:Regexp wizard1.JPG|400px|thumb|center]]&lt;br /&gt;
Nun in der Auswahlbox das auslösende Event (Ereignis) auswählen; zunächst das Device und dann das gewünschte Regex. Hier soll das notify bei jeder Veränderung der Temperatur (temperature.*) des Device BTHR918N reagieren. Abschließend mit einem Mausklick auf {{Taste|set}} bestätigen. Wählt man mehrere Regex in dieser Weise aus, so wird das &amp;quot;notify&amp;quot; bei Eintritt jedes dieser Events ausgeführt:&lt;br /&gt;
[[Datei:Regexp wizard2.JPG|400px|thumb|center]]&lt;br /&gt;
Anschließend den Platzhalter &amp;quot;a&amp;quot; mit Klick auf den Link &amp;quot;removeRegexpPart&amp;quot; löschen:&lt;br /&gt;
[[Datei:Regexp wizard3.JPG|400px|thumb|center]]&lt;br /&gt;
Den Link &amp;quot;DEF&amp;quot; anklicken, damit sich der DEF-Editor öffnet:&lt;br /&gt;
[[Datei:Regexp wizard4.JPG|400px|thumb|center]]&lt;br /&gt;
Jetzt den auszuführenden Befehl im &amp;quot;DEF&amp;quot;-Bereich durch Überschreiben des Platzhalters &amp;quot;b&amp;quot; eintragen und mit Klick auf {{Taste|modify ntest}} abschließen:&lt;br /&gt;
[[Datei:Regexp wizard5.JPG|400px|thumb|center]]&lt;br /&gt;
Das fertige und sofort aktive &amp;quot;notify&amp;quot; sieht abschließend folgendermaßen aus:&lt;br /&gt;
[[Datei:Regexp wizard6.JPG|400px|thumb|center]]&lt;br /&gt;
Am Schluss das Speichern über {{Taste|Save config}} nicht vergessen.&lt;br /&gt;
&lt;br /&gt;
== Mein notify geht nicht - wie kann ich mir selbst helfen: Debugging ==&lt;br /&gt;
Funktioniert ein notify nicht wie gewünscht, kann es nur zwei Hauptursachen haben: &lt;br /&gt;
* Entweder das Suchmuster paßt nicht zum gewünschten Auslöser (FHEM Device), und/oder&lt;br /&gt;
* die Anweisung enthält einen Fehler. &lt;br /&gt;
Sollte kein Fehler im Logfile auftauchen aber das notify ausgelöst werden, stimmt meist der Übertragungsweg zum Zieldevice nicht.&lt;br /&gt;
Der STATE des notify zeigt normalerweise mit Datum/Uhrzeit die letzte Auslösung an.&lt;br /&gt;
&lt;br /&gt;
Beim Debuggen sollte man daher beide Elemente getrennt untersuchen. Hier ein Beispiel welches nicht wie gewünscht funktioniert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt; define n_test notify n_test:muster Ausführungsteil&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zum debuggen benötigen wir &lt;br /&gt;
* den [[Event monitor]]&lt;br /&gt;
* das [https://fhem.de/commandref.html#trigger trigger-Kommando] - kann man jederzeit verwenden um das Suchmuster als Event unabhängig vom Auslöser zu erzeugen.&lt;br /&gt;
* die FHEM Kommandozeile&lt;br /&gt;
* den [[DEF-Editor]]&lt;br /&gt;
* eventuell einen Texteditor um Codeblöcke zwischen zu lagern und Notizen zu machen.&lt;br /&gt;
&lt;br /&gt;
Das Suchmuster im Beispiel notify triggert auf sich selbst, es soll auf jeden Event mit dem Inhalt &#039;&#039;&#039;muster&#039;&#039;&#039; ausgelöst werden, Beispiel:&lt;br /&gt;
  2018-07-14 14:31:03 notify n_test muster bild&lt;br /&gt;
&lt;br /&gt;
=== Suchmuster ===&lt;br /&gt;
Sollte das notify nicht funktionieren:&lt;br /&gt;
* keine Reaktion wie gewünscht&lt;br /&gt;
* keine Fehlermeldung in der Weboberfläche beim Anlegen, keine Fehlermeldung im Logfile&lt;br /&gt;
* STATE ist unverändert auf active oder einem altem Datum/Uhrzeit&lt;br /&gt;
liegt der Fehler mit Sicherheit im Suchmuster. Man hat die Chance das Suchmuster mit dem trigger Befehl zu erzeugen und zu schauen ob die Anweisung ausgeführt wird. Dabei ist zu beachten: Der erste &amp;quot;:&amp;quot; im Suchmuster ist zusätzlich zwischen Gerät und Event als Trennung. Jeder weiter : ist, wenn vorhanden, Bestandteil des Events! Siehe dazu den Abschnitt [https://fhem.de/commandref_DE.html#notify Hinweise in der commandref]&lt;br /&gt;
*Im Beispiel: Event: n_test muster -&amp;gt; Suchmuster n_test:muster&lt;br /&gt;
Um aus dem [[Event]] ein passendes Suchmuster zu erzeugen kann der [[Event monitor|Event-Monitor]] direkt verwendet werden. Man kann ein neues notify erzeugen oder ein Bestehendes modifizieren lassen.&lt;br /&gt;
&lt;br /&gt;
Unser Regex im Beispiel ist zu spezifisch, es triggert nur exakt auf &#039;&#039;&#039;muster&#039;&#039;&#039;. Dieser Trigger erzeugt den folgenden Eintrag im Eventmonitor, entspricht exakt dem Suchmuster und löst das notify aus:&lt;br /&gt;
  trigger n_test muster&lt;br /&gt;
  2018-07-13 11:52:08 notify n_test muster&lt;br /&gt;
Das Suchmuster für unsere Anforderung muss in &amp;lt;code&amp;gt;n_test:muster.*&amp;lt;/code&amp;gt; geändert werden, damit jeder Event der mit muster beginnt das notify auslöst.&lt;br /&gt;
Der . im Regex steht für jedes beliebige Zeichen und der * für eine beliebige Anzahl des Zeichens davor: also beliebig viele beliebige Zeichen nach muster.&lt;br /&gt;
&lt;br /&gt;
Das Suchmuster wird häufig in ein komplizierteres Regex umgewandelt um im notify mehrere Aktionen zu starten. Das eigene Regex kann z.B. mit http://regexpal.com/ oder https://regex101.com/ getestet werden.&lt;br /&gt;
&lt;br /&gt;
Funktioniert der Auslöser, das notify tut aber noch nicht was es soll, müssen wir die Anweisung untersuchen. In unserem korrigierten Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt; defmod n_test notify n_test:muster.* Ausführungsteil&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
folgt beim Kommando &amp;lt;code&amp;gt;trigger n_test muster bild&amp;lt;/code&amp;gt; ein Eintrag im Log:&lt;br /&gt;
  2018.07.13 11:47:57 3: n_test return value: Unknown command Ausführungsteil, try help.&lt;br /&gt;
Das notify wurde zwar getriggert aber die Anweisung war nicht ausführbar. &lt;br /&gt;
&lt;br /&gt;
Ein richtiges Suchmuster und eine fehlerhafte Anweisung wird also normalerweise einen Fehlereintrag im Logfile erzeugen!&lt;br /&gt;
&lt;br /&gt;
=== Spezialfall: notify löst zwar aus - aber zu oft ===&lt;br /&gt;
In dem Fall ist das Suchmuster (regExp) zu unscharf oder das triggernde Gerät löst das Event zu oft aus. Das regExp sollte so genau wie möglich konstruiert werden, device:.* ist eine einfache aber oft keine gute Wahl!&lt;br /&gt;
&lt;br /&gt;
Im Device, welches den Event auslöst, kann mit den Attributen event-on-.* die Häufigkeit gesteuert werden. Insbesondere ist hier das regExp .* eine Art Standardwahl um aufeinanderfolgende gleichartige Events zu verhindern.&lt;br /&gt;
:&amp;lt;code&amp;gt;attr device event-on-change-reading .*&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039;: durch falsche Angaben kann man Events ganz leicht völlig verhindern!&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[event-on-change-reading]]&lt;br /&gt;
&lt;br /&gt;
=== Anweisung ===&lt;br /&gt;
Wird das notify getriggert oder will man ganz schnell mal ein notify testen, kann man die Anweisung durch folgenden Code ersetzen, man öffnet also einfach nur die DEF, kopiert den ursprünglichen Inhalt an einen sicheren Ort und ersetzt die Anweisung durch eine der beiden Zeilen. Die erste Zeile kann man auch einfach mal in der Kommandozeile testen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{Log 1, &amp;quot;Das Notify n_test hat ausgeloest.&amp;quot;}&lt;br /&gt;
{Log 1, &amp;quot;Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT&amp;quot;}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wird das notify ausgelöst, muss anschließend im Logfile ein Eintrag zu finden sein:&lt;br /&gt;
  2018.07.13 10:28:57 1: Das Notify n_test hat ausgeloest, der Event sah so aus: muster&lt;br /&gt;
Unsere Anweisung &amp;lt;code&amp;gt;Ausführungsteil&amp;lt;/code&amp;gt; liefert in der Kommandozeile selbst einen Fehler:&lt;br /&gt;
&amp;lt;code&amp;gt;Unknown command Ausführungsteil, try help.&amp;lt;/code&amp;gt;&lt;br /&gt;
Ein Versuch mit geschweiften Klammern &amp;lt;code&amp;gt;{Ausführungsteil}&amp;lt;/code&amp;gt; liefert wieder einen Fehler:&lt;br /&gt;
&amp;lt;code&amp;gt;Unrecognized character \xC3; marked by &amp;lt;-- HERE after {Ausf&amp;lt;-- HERE near column 6 at (eval 5977) line 1.&amp;lt;/code&amp;gt;&lt;br /&gt;
Diese Variante &amp;lt;code&amp;gt;{&amp;quot;Ausführungsteil&amp;quot;}&amp;lt;/code&amp;gt; liefert den String Ausführungsteil ohne Fehler: Das notify arbeitet fehler- aber sinnfrei.&lt;br /&gt;
Der fertige Code:&lt;br /&gt;
  defmod n_test notify n_test:muster.* {&amp;quot;Ausführungsteil&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Man kann die Anweisung, normalerweise so wie sie ist, in der FHEM Kommandozeile testen. Sind im Perl Code (in geschweiften Klammern) im DEF Editor Semikolon enthalten muss man diese für den Test in der Kommandozeile (oder Raw Def) verdoppeln.&lt;br /&gt;
Laufzeitabhängige Variablen sind in der Kommandozeile meist nicht verfügbar, diese sollte man für den Test einfach durch passende Inhalte austauschen. So kann man die komfortable Variante (loggt den Namen und das komplette Event) nicht in der Kommandozeile ausführen. &lt;br /&gt;
&lt;br /&gt;
Funktioniert ein FHEM Befehl in der Kommandozeile nicht (z.B. Lampe geht nicht an) kann es im notify auch nicht funktionieren, dann muss die Fehlersuche an anderer Stelle fortgeführt werden. &lt;br /&gt;
&lt;br /&gt;
Komplexeren Code im Ausführungsteil sollte man beim Testen in Teilabschnitte aufteilen, von der Laufzeit abhängige Variable ($NAME, $EVENT, $EVTPART) durch Strings (&amp;quot;TestWort&amp;quot;) ersetzen, die Teilabschnitte separat testen und anschließend schrittweise wieder komplettieren.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
{{Hinweis|Für die nachfolgenden Beispiele wurden einige unterschiedliche Technologien verwendet. Sie können aber recht einfach auf alle anderen Systeme übertragen werden, dabei sollte ggf. darauf geachtet werden, dass sich Schaltbefehle und Events teilweise je nach konkret eingesetzter Technologie unterscheiden können. Dann ist ggf. eine Erweiterung, z.B. durch eine [[if-condition|if-Abfrage]] erforderlich.}}&lt;br /&gt;
&lt;br /&gt;
=== Schalter entprellen ===&lt;br /&gt;
Will man ein notify innerhalb eines bestimmten Zeitraumes nur einmal auslösen lassen, auch wenn er in diesem Zeitraum mehrfach getriggered werden sollte, so bietet sich das Attribut disabledAfterTrigger an,&lt;br /&gt;
 attr &amp;lt;notify_device&amp;gt; disabledAfterTrigger &amp;lt;Anzahl Sekunden&amp;gt;&lt;br /&gt;
In dem Zeitraum wird dann nur einmal (beim ersten Mal) der Befehl ausgelöst, auch wenn mehrfach getriggered wurde. Der Zeitraum kann Bruchteile von Sekunden umfassen.&lt;br /&gt;
&lt;br /&gt;
=== Etwas schalten, wenn ein anderes Gerät geschaltet wird ===&lt;br /&gt;
&lt;br /&gt;
==== Vorbedingungen ====&lt;br /&gt;
Dieses Beispiel verwendet eine einfache InterTechno-kompatible Funksteckdose für das Radio und einen HM-Aktor für das Licht:&lt;br /&gt;
&lt;br /&gt;
 define RadioKueche IT 000000FFFF 0F F0&lt;br /&gt;
 define LichtKueche CUL_HM 3A37D6&lt;br /&gt;
Beachte: beide kennen als Event bzw. Schaltbefehle &#039;&#039;on&#039;&#039; und &#039;&#039;off&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define LichtamRadioan notify LichtKueche set RadioKueche $EVENT &lt;br /&gt;
oder alternativ: &lt;br /&gt;
 define LichtamRadioan notify LichtKueche { fhem &amp;quot;set RadioKueche $EVENT&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
* Der Name des &#039;&#039;notify&#039;&#039; &amp;quot;LichtamRadioan&amp;quot; kann frei gewählt werden, er dient nur dazu, das notify in FHEM eindeutig zu identifizieren.&lt;br /&gt;
* &amp;quot;$EVENT&amp;quot; ist ein Platzhalter für den Zustand vom Pattern. $EVENT enthält ein &amp;quot;off&amp;quot; wenn das LichtKueche aus- und ein &amp;quot;on&amp;quot; wenn das Licht eingeschaltet wird.&lt;br /&gt;
* &amp;quot;{ &amp;amp;lt;perlcode&amp;amp;gt; }&amp;quot; alles was zwischen {} steht ist Perl code. Perl kennt das Schlüsselwort fhem. Das Schlüsselwort FHEM dient dazu, FHEM Befehle auszuführen. Es wird also der FHEM Befehl &amp;quot;set RadioKueche on/off&amp;quot; ausgeführt. on oder off ist abhängig vom Pattern. Der eigentliche FHEM Befehl muss in &amp;quot; &amp;quot; stehen.&lt;br /&gt;
* Wann ist ein Wechsel auf die Perl-Ebene erforderlich? &lt;br /&gt;
** einfache FHEM-Befehle sollten in der Regel direkt verwendet werden, dies ist ressourcenschonender.&lt;br /&gt;
** Immer dann, wenn dies nicht möglich ist, weil z.B. komplexerer Code ausgeführt werden soll, (blockierende) Prozesse ausgelagert werden sollten oder Systembefehle ausgeführt werden, ist es günstiger, auf die Perl-Ebene zu wechseln &amp;lt;ref&amp;gt;In diesem {{Link2Forum|Topic=88398|Message=808685|LinkText=Forenbeitrag}} wird z.B. erläutert, wie man nichtblockierend externe Scripte aufrufen kann, die dann ihre Ergebnisse wieder an FHEM übergeben.&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird ===&lt;br /&gt;
Dieses Beispiel verwendet einen HM-Aktor für das Licht sowie zwei Milight-Birnen, die einzeln geschaltet werden sollen&amp;lt;ref&amp;gt;Dies ist ausdrücklich keine Empfehlung für diese Technologie und der Module&amp;lt;/ref&amp;gt; in den Stehlampen:&lt;br /&gt;
&lt;br /&gt;
==== Vorbedingungen ====&lt;br /&gt;
FHEM:&lt;br /&gt;
 define LichtWZ CUL_HM 3A37D8&lt;br /&gt;
 define Stehlampe1 MilightDevice RGBW Milight_Wohnzimmer 5&lt;br /&gt;
 define Stehlampe2 MilightDevice RGBW Milight_Wohnzimmer 6&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define SteckdoseWZein notify LichtWZ set Stehlampe1,Stehlampe2 $EVENT&lt;br /&gt;
oder &#039;&#039;in Perl&#039;&#039;&lt;br /&gt;
 define SteckdoseWZein notify LichtWZ { fhem &amp;quot;set Stehlampe1 $EVENT;;set Stehlampe2 $EVENT &amp;quot; } &lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Wenn das LichtWZ eingeschaltet wird, dann werden auch die Stehlampen (1 und 2) eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
=== Einfache ODER Funktion ===&lt;br /&gt;
Eine einfache ODER Funktion kann sehr einfach realisiert werden&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
KNX:&lt;br /&gt;
* 3x GAs der abzufragende Werte (0/0/40 0/0/41 0/0/42)&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
 define Licht1 CUL_HM 3A37D8&lt;br /&gt;
 define Licht2 CUL_HM 1B7EC3&lt;br /&gt;
 define Stehlampe MilightDevice RGBW Milight_Wohnzimmer 7&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define SteckdoseWZein notify (Licht1|Licht2) set Stehlampe $EVENT &lt;br /&gt;
oder&lt;br /&gt;
 define SteckdoseWZein notify (Licht.) set Stehlampe $EVENT&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Die Werte in der Klammer (wichtig ist das »|«) sind die Rückgabewerte. Alternativ kann in diesem Beispiel auch »Licht.«  (zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für (genau) ein beliebiges Zeichen.&lt;br /&gt;
&lt;br /&gt;
Danach folgt der set Befehl.&lt;br /&gt;
Wenn also das Licht1 oder Licht2 den Wert &amp;quot;on&amp;quot; hat, dann hat auch die Steckdose den Wert &amp;quot;on&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alternative: [[structure]]&lt;br /&gt;
&lt;br /&gt;
=== Einfache UND Funktion ===&lt;br /&gt;
Ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezweifeln. In FHEM fehlen Loggingfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ).&lt;br /&gt;
Dadurch ist FHEM zwar mächtig, wird aber für viele sehr kompliziert.&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
KNX:&lt;br /&gt;
* 3x GDs für die Rückgabewert Rollo geschlossen == 1 (0/0/50 0/0/51 0/0/52)&lt;br /&gt;
* GD LED am Lichtschalter (0/0/106)&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
 define R1ZU KNX 0/0/50:dpt1.009&lt;br /&gt;
 attr R1ZU dummy 1&lt;br /&gt;
 define R2ZU KNX 0/0/51:dpt1.009&lt;br /&gt;
 attr R2ZU dummy 1&lt;br /&gt;
 define R3ZU KNX 0/0/52:dpt1.009&lt;br /&gt;
 attr R3ZU dummy 1&lt;br /&gt;
 define LEDalleRolloZu KNX 0/0/106:dpt1&lt;br /&gt;
Durch das Attribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define nt.allerolloszu notify (R1ZU|R2ZU|R3ZU) {\&lt;br /&gt;
 my $r1 = Value(&amp;quot;R1ZU&amp;quot;);;\&lt;br /&gt;
 my $r2 = Value(&amp;quot;R2ZU&amp;quot;);;\&lt;br /&gt;
 my $r3 = Value(&amp;quot;R3ZU&amp;quot;);;\&lt;br /&gt;
 if ($r1 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r2 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r3 eq &amp;quot;on&amp;quot;) {\&lt;br /&gt;
   fhem(&amp;quot;set LEDalleRolloZu on&amp;quot;);;\&lt;br /&gt;
 } else {\&lt;br /&gt;
   fhem(&amp;quot;set LEDalleRolloZu off&amp;quot;);;\&lt;br /&gt;
 }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet. Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }&lt;br /&gt;
&lt;br /&gt;
my $r1 =&amp;amp;gt; Variable $r1 definieren&lt;br /&gt;
= Value(&amp;quot;R1ZU&amp;quot;);; ==&amp;amp;gt; weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu &lt;br /&gt;
&lt;br /&gt;
Der doppelte ;; ist ein FHEM Thema. Eigentlich würde für Perl ein ; reichen. Aber FHEM nutzt selbst das ; und daher wird ein ;; benötigt. Mit den ersten drei my Zeilen werden die Rückgabewerte den Variablen zugewiesen.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt ein normales &amp;quot;if then else&amp;quot; Konstrukt. Die Zeile »($r1 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r2 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r3 eq &amp;quot;on&amp;quot;)«&amp;amp;#160;kann man so lesen: Wenn $r1 den Wert &amp;quot;on&amp;quot; und (&amp;amp;amp;&amp;amp;amp;) $r2 den Wert &amp;quot;on&amp;quot; und $r3 den Wert &amp;quot;on&amp;quot; dann schalte die LEDalleRolloZu ein {fhem(&amp;quot;set LEDalleRolloZu on&amp;quot;)}&lt;br /&gt;
ansonsten else schalte die LED aus. {fhem(&amp;quot;set LEDalleRolloZu off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Alternative: [[structure]]&lt;br /&gt;
&lt;br /&gt;
=== Zeitverzögert schalten ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Aufgabe:&#039;&#039;&#039; || Zeitverzögert schalten&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Beschreibung:&#039;&#039;&#039; || Mit einem Notify zeitverzögert eine Aktion auslösen.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Vorbereitung:&#039;&#039;&#039; || Gerät &amp;quot;Lampe&amp;quot; ist definiert und es gibt eine Situation, die ein Ereignis &amp;quot;Fernbedienung:.*&amp;quot; generiert.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Befehl:&#039;&#039;&#039; || &amp;lt;code&amp;gt;define ntfy1 notify Fernbedienung:.* sleep 7.5;; set Lampe $EVENT&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Erläuterungen:&#039;&#039;&#039; || Bei Eintreten eines Ereignisses &amp;quot;Fernbedienung*&amp;quot; wird nach einer Pause von siebeneinhalb Sekunden der Befehl &amp;lt;set Lampe ??&amp;gt; ausgeführt, wobei der eigentliche Befehl aus dem auslösenden Ereignis übernommen wird.&lt;br /&gt;
:&#039;&#039;Quelle: {{Link2Forum|Topic=17161|LinkText=FHEM Forum}}&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig) ===&lt;br /&gt;
Hier ein kleines Beispiel, wie man mit Hilfe einer PV-Anlage die Sonneneinstrahlung auf der Südseite ermittelt und dies zur Rolladensteuerung nutzt.&lt;br /&gt;
Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel)&lt;br /&gt;
Optional: Die Funktion soll nur zwischen dem 6. und 9. Monat funktioneren. (drittes Beispiel)&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
PV Anlage mit SolarView abfragen.&lt;br /&gt;
Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schließen.&lt;br /&gt;
&lt;br /&gt;
==== notify Syntax ====&lt;br /&gt;
FHEM:&lt;br /&gt;
&lt;br /&gt;
 define sv SolarView solarview 15000 wr1 wr2 wr3 wr4                           &amp;lt;----vier Wechselrichter&lt;br /&gt;
 attr sv event-on-change-reading currentPower                                &lt;br /&gt;
&lt;br /&gt;
 define nt.sonnenlichtpersolar notify sv:currentPower.* { \&lt;br /&gt;
  if ($EVTPART1 &amp;amp;lt; 3000 ) {\&lt;br /&gt;
  fhem(&#039;set Flur1 Auf&#039;)\&lt;br /&gt;
 }else {\&lt;br /&gt;
  if ($EVTPART1 &amp;amp;gt; 5000 ) {\&lt;br /&gt;
  fhem(&#039;set Flur1 Ab&#039;)\&lt;br /&gt;
  } \&lt;br /&gt;
  }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Optional 1: Zeitabhängig (Code gehört in die DEF)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 sv:currentPower.* { &lt;br /&gt;
  my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&lt;br /&gt;
   if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;) { &lt;br /&gt;
   if ($EVTPART1 &amp;lt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Auf&#039;)&lt;br /&gt;
    }else {&lt;br /&gt;
    if ($EVTPART1 &amp;gt; 8000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Ab&#039;)&lt;br /&gt;
    } &lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Optional 2: Zeit und Datum (Code gehört in die DEF)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 sv:currentPower.* { &lt;br /&gt;
  my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&lt;br /&gt;
  if ($month &amp;gt;= 6 &amp;amp;&amp;amp; $month &amp;lt;= 9) {&lt;br /&gt;
   if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;) { &lt;br /&gt;
   if ($EVTPART1 &amp;lt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1,RBUERO1,RBUERO2 Auf&#039;);&lt;br /&gt;
    }else {&lt;br /&gt;
    if ($EVTPART1 &amp;gt; 8000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1,Flur2,RBUERO1,RBUERO2 Ab&#039;);&lt;br /&gt;
    } &lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
* Das define wird in der Kommandozeile im Webbrowser eingegeben.&lt;br /&gt;
* Anschließend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl&lt;br /&gt;
* define sv SolarView ... &amp;lt;==== ist die Schnittstelle vom SolarView&lt;br /&gt;
* define nt.sonnenlichtpersolar notify (sv:currentPower.*) { &amp;lt;==== hier wird ein notify angelegt, der auf das &amp;quot;define sv&amp;quot; Wert &amp;quot;currentPower.*&amp;quot; (.* ist irgendwas) reagiert&lt;br /&gt;
  if ($EVTPART1 &amp;amp;lt; 3000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Auf&#039;);&lt;br /&gt;
  }else {&lt;br /&gt;
   if ($EVTPART1 &amp;amp;gt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Ab&#039;);&lt;br /&gt;
  } &lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
Diese if-Funktion wertet den Rückgabewert von currentPower aus. Hierbei muss man wissen, dass $EVTPART1 das Split-Ergebnis vom Rückgabewert ist&lt;br /&gt;
&lt;br /&gt;
Beispiel: Der Rückgabewert (wie im Beispiel) ist &amp;quot;currentPower: 6000&amp;quot;.&lt;br /&gt;
Jetzt steht im &amp;quot;$EVTPART0 == currentPower:&amp;quot; und im &amp;quot;$EVTPART1 == 6000&amp;quot;&lt;br /&gt;
Das bedeutet, dass man sich nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken muss, dies übernimmt vielmehr FHEM.&lt;br /&gt;
&lt;br /&gt;
Ergebnis: &lt;br /&gt;
Das Rollo wird abhängig von der erzeugten IST_Strommenge auf und zu gefahren.&lt;br /&gt;
Damit dies nicht dauernd hin und her pendelt, wurde der Auf Wert sehr klein und den Ab Wert sehr groß gewählt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional 1:&#039;&#039;&#039; Der Block &amp;quot;my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&amp;quot; erzeugt die String-Variable $hm mit dem Inhalt $hour:$min. %02d begrenzt die Ausgabe auf zwei Stellen.&lt;br /&gt;
Danach wird mit &amp;quot;if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;)&amp;quot; mit stringvergleichenden Operatoren geprüft, ob die Uhrzeit zwischen 9:30 und 17:00 liegt (lt = kleiner als; gt = größer als). Es wäre auch ein le und ge möglich: le =  kleiner/gleich als, ge =  größer/gleich als.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional 2:&#039;&#039;&#039;if( $month &amp;gt;= 6 &amp;amp;&amp;amp; $month &amp;lt;= 9) {&lt;br /&gt;
&lt;br /&gt;
Hier wird die numerische FHEM-Standard-Variable $month (Monat) auf größer/gleich bzw kleiner/gleich mit den binären Operatoren überprüft.&lt;br /&gt;
Die Funktion arbeitet also nur zwischen dem 6. und dem 9. Monat und dann auch nur zwischen 9:31 und 16:59.&lt;br /&gt;
&lt;br /&gt;
=== Status eines Kippfensters mit 2 Fensterkontakten abbilden ===&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
Es ist je ein Fensterkontakt der &#039;&#039;open&#039;&#039; oder &#039;&#039;closed&#039;&#039; meldet, oben und unten am Fenster angebracht.&lt;br /&gt;
Die Namen der beiden FHEM-Devices sind &#039;&#039;fensterKontaktOben&#039;&#039; und &#039;&#039;fensterKontaktUnten&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== notify Syntax ====&lt;br /&gt;
FHEM:&lt;br /&gt;
 define statusFenster notify fensterKontakt(Oben|Unten):(open|closed) {\&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039;)\&lt;br /&gt;
        { fhem &#039;set Terrassentuer open&#039; }\&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039;)\&lt;br /&gt;
        { fhem &#039;set Terrassentuer closed&#039; }\&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039;)\&lt;br /&gt;
        { fhem &#039;set Terrassentuer tilted&#039; }\&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039;)\&lt;br /&gt;
        { fhem &#039;set Terrassentuer undef&#039; }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Weitere Hinweise ==&lt;br /&gt;
* Entsprechend zu $EVENT gibt es auch noch $NAME und $TYPE. $NAME und $TYPE enthalten den Namen bzw. Typ des Ereignis auslösenden Gerätes.&lt;br /&gt;
* Wird der Perl-Code in einem &amp;lt;code&amp;gt;notify&amp;lt;/code&amp;gt; immer länger, lagere den Code wegen der Übersichtlichkeit in eine eigene Programmdatei aus, wie in [[99_myUtils anlegen]] beschrieben.&lt;br /&gt;
* Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreibt, muss man anscheinend darauf achten, dass keine abschließende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.&lt;br /&gt;
* Dieser {{Link2Forum|Topic=38520|Message=307325}} enthält Vorschläge zur Vorgehensweise bei der Erstellung von komplexen &#039;&#039;notify&#039;&#039; Definitionen bzw. bei deren Fehlerbehebung.&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
* [[Escapen in Perlbefehlen]]&lt;br /&gt;
* [[Klammerebenen]]&lt;br /&gt;
* Forenbeitrag zum Thema {{Link2Forum|Topic=115414|LinkText=Optimierung des Suchmusters - NOTIFYDEV}}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Hilfsmodul]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Zeitangaben,_rechnen_mit&amp;diff=35988</id>
		<title>Zeitangaben, rechnen mit</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Zeitangaben,_rechnen_mit&amp;diff=35988"/>
		<updated>2021-09-07T14:43:35Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit leicht lesbaren Zeitangaben, wie &#039;&#039;07:30&#039;&#039;, &#039;&#039;23.05.2017, 09:20&#039;&#039; usw. kann in FHEM nicht ohne Weiteres gerechnet werden, da es sich um Zeichenketten handelt und nicht um Zahlen.&lt;br /&gt;
&lt;br /&gt;
== Verfahren zum Rechnen mit Zeitangaben, die als Zeichenkette vorliegen ==&lt;br /&gt;
Die Berechnung erfolgt in Perl. Das Verfahren besteht aus drei Schritten:&lt;br /&gt;
* Umwandeln der Zeichenketten in eine Zahl, z.B. Sekunden.&lt;br /&gt;
* Berechen einer Zeit als Zahl.&lt;br /&gt;
* Umwandeln der Zahl in eine Zeichenkette (Formatierung)&lt;br /&gt;
&lt;br /&gt;
=== Umwandeln eine Zeichenkette in eine Zahl ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText= Hinweis!&lt;br /&gt;
* Die von &amp;lt;code&amp;gt;timelocal&amp;lt;/code&amp;gt; zurückgegebene Monatsangabe hat die Ganzzahlwerte 0 bis 11 für Januar bis Dezember.}} &lt;br /&gt;
Hier hängt das Verfahren von der Struktur der Zeichenkette ab.&lt;br /&gt;
&lt;br /&gt;
Perl und FHEM stellen Funktionen zur Umwandlung bereit.&lt;br /&gt;
* &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt; liefert die aktuelle Zeit in Sekunden &amp;lt;ref&amp;gt;http://perldoc.perl.org/functions/time.html&amp;lt;/ref&amp;gt; &lt;br /&gt;
* &amp;lt;code&amp;gt;time_str2num(&amp;quot;YYYY-MM-DD HH:MM:SS&amp;quot;)&amp;lt;/code&amp;gt; wandelt einen FHEM-Zeitstempel in Sekunden um &amp;lt;ref&amp;gt;{{Link2CmdRef|Lang=de|Anker=perl}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;timelocal(&amp;lt;Sekunden&amp;gt;, &amp;lt;Minuten&amp;gt;, &amp;lt;Stunden&amp;gt;, &amp;lt;Tag des Monats&amp;gt;, &amp;lt;Monat&amp;gt;, &amp;lt;Jahr&amp;gt;)&amp;lt;/code&amp;gt; wandelt einen Satz von Zeitelementen (Sekunden, Minuten, Stunden usw.) in Sekunden um &amp;lt;ref&amp;gt;http://perldoc.perl.org/Time/Local.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Sekunden + Minuten * 60 + Stunden * 60 * 60 + Tage * 24 * 60 * 60&amp;lt;/code&amp;gt; berechnen eines Summanden oder Subtrahenden aus Sekunden, Minuten, Stunden und Tagen.&lt;br /&gt;
==== Beispiel: Zeitstempel eines Readings in Sekunden umwandeln ====&lt;br /&gt;
  time_str2num(ReadingsTimestamp(&amp;lt;devicename&amp;gt;, &amp;lt;reading&amp;gt;,&amp;lt;defaultvalue&amp;gt;))&lt;br /&gt;
==== Konstanten innerhalb FHEM ====&lt;br /&gt;
FHEM stellt einige Konstanten&amp;lt;ref&amp;gt;{{Link2Forum|Topic=96959|Msg=901268|LinkText=Forum-Thread}}&amp;lt;/ref&amp;gt; bereit, um das Rechnen mit Zeiten zu erleichtern, &#039;&#039;DAYSECONDS&#039;&#039;, &#039;&#039;HOURSECONDS&#039;&#039;, und &#039;&#039;MINUTESECONDS&#039;&#039;. Obiger Code kann also auch so geschrieben werden:&lt;br /&gt;
 Sekunden + Minuten * MINUTESECONDS + Stunden * HOURSECONDS + Tage * DAYSECONDS&lt;br /&gt;
&lt;br /&gt;
=== Umwandeln einer Zahl in eine Zeichenkette ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText= Hinweis!&lt;br /&gt;
* Die von &amp;lt;code&amp;gt;localtime&amp;lt;/code&amp;gt; als Parameter erwartete Monatsangabe muss im Bereich der Ganzzahlwerte 0 bis 11 für Januar bis Dezember liegen.&lt;br /&gt;
* Werden keine Parameter angegeben, bezieht sich die Ausgabe auf den aktuellen Zeitpunkt.}}&lt;br /&gt;
Zur Umwandlung seien die folgenden Perl-Funktionen genannt:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;HH:MM, DD.MM.YY&amp;quot; =~ /(\d\d).(\d\d)..(\d\d).(\d\d).(\d\d)/&amp;lt;/code&amp;gt; extrahiert HH,MM,DD,MM und YY aus der Zeichenkette HH:MM, DD.MM.YY, die ein Datum in der angegebenen Form enthält. \d steht für eine Ziffer, der Punkt für ein beliebiges Zeichen, die () schreiben den Treffer in spezielle Variablen in der Reihenfolge ihrer Anordnung HH in $1, MM in $2, DD in $3 usw.&lt;br /&gt;
* &amp;lt;code&amp;gt;(Sekunden, Minuten, Stunden, Tag des Monats, Monat, Jahr, Nummer des Wochentages, Tag des Jahres, Sommerzeitkennzeichen) = localtime(Zeit in Sekunden)&amp;lt;/code&amp;gt; gibt die einzelnen Zeitelemente zurück &amp;lt;ref&amp;gt;http://perldoc.perl.org/functions/localtime.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;POSIX::strftime(&amp;lt;Format&amp;gt;,&amp;lt;Array mit Zeitelementen&amp;gt;)&amp;lt;/code&amp;gt;, wandelt ein Array aus Zeitelementen, wie es &amp;lt;code&amp;gt;localtime&amp;lt;/code&amp;gt; liefert in eine formatierte Zeichenkette um. &amp;lt;Format&amp;gt; wird mit Hilfe bestimmter Formatierungszeichen (%a für den Wochentagnamen, %d für den Tag des Monats usw. &amp;lt;ref&amp;gt;http://search.cpan.org/~dexter/POSIX-strftime-GNU-0.02/lib/POSIX/strftime/GNU.pm&amp;lt;/ref&amp;gt;) festgelegt.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Wochentag zu Datum ====&lt;br /&gt;
Zum heutigen Datum&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{return strftime(&amp;quot;%A&amp;quot;,localtime)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu einem vorgegebenem Datum&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{my ($d,$m,$y) = split(/\./,&amp;quot;06.09.2021&amp;quot;);;&lt;br /&gt;
$m=$m-1;;&lt;br /&gt;
return strftime(&amp;quot;%A&amp;quot;,localtime(timelocal(&#039;0&#039;,&#039;0&#039;,&#039;0&#039;,$d,$m,$y)))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Berechnungsbeispiele ===&lt;br /&gt;
Allen Berechnungen zu Grunde liegt die Vorgehensweise in absoluten Sekunden bezogen auf einen Referenzzeitpunkt zu rechnen. Damit umgeht man jeden Wechsel Stunden/Tage/Monate/Jahre. &lt;br /&gt;
&lt;br /&gt;
Die einzeiligen Beispiele sollten im Eingabefeld von FHEMWEB ausführbar sein.&lt;br /&gt;
&lt;br /&gt;
==== Addition zu einem Zeitstempel ====&lt;br /&gt;
Gegeben sei ein [[Readings|Reading]] &#039;&#039;motion&#039;&#039; des [[Gerät|Gerätes]] &#039;&#039;BM1&#039;&#039; mit einem Zeitstempel &#039;&#039;2017-08-11 14:17:13&#039;&#039;. Es sollen 2 Stunden und 12 Minuten addiert werden und das Ergebnis als HH:MM dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{POSIX::strftime(&amp;quot;%H:%M&amp;quot;,localtime(time_str2num(ReadingsTimestamp(&amp;quot;BM1&amp;quot;,&amp;quot;motion&amp;quot;,&amp;quot;2000-01-01 00:00:00&amp;quot;))+2*60*60+12*60))}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schrittweise:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{&lt;br /&gt;
  my $timestamp = ReadingsTimestamp(&amp;quot;BM1&amp;quot;,&amp;quot;motion&amp;quot;,&amp;quot;2000-01-01 00:00:00&amp;quot;);&lt;br /&gt;
  my $seconds = time_str2num($timestamp)+2*60*60+12*60;&lt;br /&gt;
  my $result = POSIX::strftime(&amp;quot;%H:%M&amp;quot;,localtime($seconds));&lt;br /&gt;
  return $result;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Addition zum aktuellen Zeitpunkt ====&lt;br /&gt;
Zur aktuellen Zeit sollen 30 Minuten addiert und das Ergebnis als HH:MM:SS dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time+30*60))}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Subtraktion vom aktuellen Zeitpunkt ====&lt;br /&gt;
Zur aktuellen Zeit sollen 45 Minuten subtrahiert und das Ergebnis als HH:MM:SS dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time-45*60))}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Kalendertage von heute bis zu einem Datum ====&lt;br /&gt;
Zu einem bestimmten Kalendertag soll die Differenz in ganzen Tagen bestimmt werden.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{(time_str2num(&#039;2021-04-30&#039;) - time_str2num(strftime &#039;%F&#039;,localtime))/86400}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das Zieldatum kann z.B. ein Termin aus dem Kalender sein: &amp;lt;code&amp;gt;fhem(&#039;get AbfallKalender events timeFormat:&amp;quot;%F&amp;quot; format:custom=&amp;quot;$T1&amp;quot; limit:from=0,count=1&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Weitere Funktionen zur Zeitumwandlung ===&lt;br /&gt;
* [[DevelopmentModuleAPI#Time_.2F_Timestamp|Time/Timestamp]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Zeitangaben,_rechnen_mit&amp;diff=35987</id>
		<title>Zeitangaben, rechnen mit</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Zeitangaben,_rechnen_mit&amp;diff=35987"/>
		<updated>2021-09-07T14:35:34Z</updated>

		<summary type="html">&lt;p&gt;TomLee: Zwei Beispiele zum ausgeben des Wochentag ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit leicht lesbaren Zeitangaben, wie &#039;&#039;07:30&#039;&#039;, &#039;&#039;23.05.2017, 09:20&#039;&#039; usw. kann in FHEM nicht ohne Weiteres gerechnet werden, da es sich um Zeichenketten handelt und nicht um Zahlen.&lt;br /&gt;
&lt;br /&gt;
== Verfahren zum Rechnen mit Zeitangaben, die als Zeichenkette vorliegen ==&lt;br /&gt;
Die Berechnung erfolgt in Perl. Das Verfahren besteht aus drei Schritten:&lt;br /&gt;
* Umwandeln der Zeichenketten in eine Zahl, z.B. Sekunden.&lt;br /&gt;
* Berechen einer Zeit als Zahl.&lt;br /&gt;
* Umwandeln der Zahl in eine Zeichenkette (Formatierung)&lt;br /&gt;
&lt;br /&gt;
=== Umwandeln eine Zeichenkette in eine Zahl ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText= Hinweis!&lt;br /&gt;
* Die von &amp;lt;code&amp;gt;timelocal&amp;lt;/code&amp;gt; zurückgegebene Monatsangabe hat die Ganzzahlwerte 0 bis 11 für Januar bis Dezember.}} &lt;br /&gt;
Hier hängt das Verfahren von der Struktur der Zeichenkette ab.&lt;br /&gt;
&lt;br /&gt;
Perl und FHEM stellen Funktionen zur Umwandlung bereit.&lt;br /&gt;
* &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt; liefert die aktuelle Zeit in Sekunden &amp;lt;ref&amp;gt;http://perldoc.perl.org/functions/time.html&amp;lt;/ref&amp;gt; &lt;br /&gt;
* &amp;lt;code&amp;gt;time_str2num(&amp;quot;YYYY-MM-DD HH:MM:SS&amp;quot;)&amp;lt;/code&amp;gt; wandelt einen FHEM-Zeitstempel in Sekunden um &amp;lt;ref&amp;gt;{{Link2CmdRef|Lang=de|Anker=perl}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;timelocal(&amp;lt;Sekunden&amp;gt;, &amp;lt;Minuten&amp;gt;, &amp;lt;Stunden&amp;gt;, &amp;lt;Tag des Monats&amp;gt;, &amp;lt;Monat&amp;gt;, &amp;lt;Jahr&amp;gt;)&amp;lt;/code&amp;gt; wandelt einen Satz von Zeitelementen (Sekunden, Minuten, Stunden usw.) in Sekunden um &amp;lt;ref&amp;gt;http://perldoc.perl.org/Time/Local.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Sekunden + Minuten * 60 + Stunden * 60 * 60 + Tage * 24 * 60 * 60&amp;lt;/code&amp;gt; berechnen eines Summanden oder Subtrahenden aus Sekunden, Minuten, Stunden und Tagen.&lt;br /&gt;
==== Beispiel: Zeitstempel eines Readings in Sekunden umwandeln ====&lt;br /&gt;
  time_str2num(ReadingsTimestamp(&amp;lt;devicename&amp;gt;, &amp;lt;reading&amp;gt;,&amp;lt;defaultvalue&amp;gt;))&lt;br /&gt;
==== Konstanten innerhalb FHEM ====&lt;br /&gt;
FHEM stellt einige Konstanten&amp;lt;ref&amp;gt;{{Link2Forum|Topic=96959|Msg=901268|LinkText=Forum-Thread}}&amp;lt;/ref&amp;gt; bereit, um das Rechnen mit Zeiten zu erleichtern, &#039;&#039;DAYSECONDS&#039;&#039;, &#039;&#039;HOURSECONDS&#039;&#039;, und &#039;&#039;MINUTESECONDS&#039;&#039;. Obiger Code kann also auch so geschrieben werden:&lt;br /&gt;
 Sekunden + Minuten * MINUTESECONDS + Stunden * HOURSECONDS + Tage * DAYSECONDS&lt;br /&gt;
&lt;br /&gt;
=== Umwandeln einer Zahl in eine Zeichenkette ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText= Hinweis!&lt;br /&gt;
* Die von &amp;lt;code&amp;gt;localtime&amp;lt;/code&amp;gt; als Parameter erwartete Monatsangabe muss im Bereich der Ganzzahlwerte 0 bis 11 für Januar bis Dezember liegen.&lt;br /&gt;
* Werden keine Parameter angegeben, bezieht sich die Ausgabe auf den aktuellen Zeitpunkt.}}&lt;br /&gt;
Zur Umwandlung seien die folgenden Perl-Funktionen genannt:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;HH:MM, DD.MM.YY&amp;quot; =~ /(\d\d).(\d\d)..(\d\d).(\d\d).(\d\d)/&amp;lt;/code&amp;gt; extrahiert HH,MM,DD,MM und YY aus der Zeichenkette HH:MM, DD.MM.YY, die ein Datum in der angegebenen Form enthält. \d steht für eine Ziffer, der Punkt für ein beliebiges Zeichen, die () schreiben den Treffer in spezielle Variablen in der Reihenfolge ihrer Anordnung HH in $1, MM in $2, DD in $3 usw.&lt;br /&gt;
* &amp;lt;code&amp;gt;(Sekunden, Minuten, Stunden, Tag des Monats, Monat, Jahr, Nummer des Wochentages, Tag des Jahres, Sommerzeitkennzeichen) = localtime(Zeit in Sekunden)&amp;lt;/code&amp;gt; gibt die einzelnen Zeitelemente zurück &amp;lt;ref&amp;gt;http://perldoc.perl.org/functions/localtime.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;POSIX::strftime(&amp;lt;Format&amp;gt;,&amp;lt;Array mit Zeitelementen&amp;gt;)&amp;lt;/code&amp;gt;, wandelt ein Array aus Zeitelementen, wie es &amp;lt;code&amp;gt;localtime&amp;lt;/code&amp;gt; liefert in eine formatierte Zeichenkette um. &amp;lt;Format&amp;gt; wird mit Hilfe bestimmter Formatierungszeichen (%a für den Wochentagnamen, %d für den Tag des Monats usw. &amp;lt;ref&amp;gt;http://search.cpan.org/~dexter/POSIX-strftime-GNU-0.02/lib/POSIX/strftime/GNU.pm&amp;lt;/ref&amp;gt;) festgelegt.&lt;br /&gt;
&lt;br /&gt;
=== Berechnungsbeispiele ===&lt;br /&gt;
Allen Berechnungen zu Grunde liegt die Vorgehensweise in absoluten Sekunden bezogen auf einen Referenzzeitpunkt zu rechnen. Damit umgeht man jeden Wechsel Stunden/Tage/Monate/Jahre. &lt;br /&gt;
&lt;br /&gt;
Die einzeiligen Beispiele sollten im Eingabefeld von FHEMWEB ausführbar sein.&lt;br /&gt;
&lt;br /&gt;
==== Addition zu einem Zeitstempel ====&lt;br /&gt;
Gegeben sei ein [[Readings|Reading]] &#039;&#039;motion&#039;&#039; des [[Gerät|Gerätes]] &#039;&#039;BM1&#039;&#039; mit einem Zeitstempel &#039;&#039;2017-08-11 14:17:13&#039;&#039;. Es sollen 2 Stunden und 12 Minuten addiert werden und das Ergebnis als HH:MM dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{POSIX::strftime(&amp;quot;%H:%M&amp;quot;,localtime(time_str2num(ReadingsTimestamp(&amp;quot;BM1&amp;quot;,&amp;quot;motion&amp;quot;,&amp;quot;2000-01-01 00:00:00&amp;quot;))+2*60*60+12*60))}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schrittweise:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{&lt;br /&gt;
  my $timestamp = ReadingsTimestamp(&amp;quot;BM1&amp;quot;,&amp;quot;motion&amp;quot;,&amp;quot;2000-01-01 00:00:00&amp;quot;);&lt;br /&gt;
  my $seconds = time_str2num($timestamp)+2*60*60+12*60;&lt;br /&gt;
  my $result = POSIX::strftime(&amp;quot;%H:%M&amp;quot;,localtime($seconds));&lt;br /&gt;
  return $result;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Addition zum aktuellen Zeitpunkt ====&lt;br /&gt;
Zur aktuellen Zeit sollen 30 Minuten addiert und das Ergebnis als HH:MM:SS dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time+30*60))}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Subtraktion vom aktuellen Zeitpunkt ====&lt;br /&gt;
Zur aktuellen Zeit sollen 45 Minuten subtrahiert und das Ergebnis als HH:MM:SS dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time-45*60))}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Kalendertage von heute bis zu einem Datum ====&lt;br /&gt;
Zu einem bestimmten Kalendertag soll die Differenz in ganzen Tagen bestimmt werden.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{(time_str2num(&#039;2021-04-30&#039;) - time_str2num(strftime &#039;%F&#039;,localtime))/86400}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das Zieldatum kann z.B. ein Termin aus dem Kalender sein: &amp;lt;code&amp;gt;fhem(&#039;get AbfallKalender events timeFormat:&amp;quot;%F&amp;quot; format:custom=&amp;quot;$T1&amp;quot; limit:from=0,count=1&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Wochentag zu Datum ====&lt;br /&gt;
Zum heutigen Datum&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{return strftime(&amp;quot;%A&amp;quot;,localtime)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu einem vorgegebenem Datum&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{my ($d,$m,$y) = split(/\./,&amp;quot;06.09.2021&amp;quot;);;&lt;br /&gt;
$m=$m-1;;&lt;br /&gt;
return strftime(&amp;quot;%A&amp;quot;,localtime(timelocal(&#039;0&#039;,&#039;0&#039;,&#039;0&#039;,$d,$m,$y)))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Weitere Funktionen zur Zeitumwandlung ===&lt;br /&gt;
* [[DevelopmentModuleAPI#Time_.2F_Timestamp|Time/Timestamp]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=35811</id>
		<title>AutoShuttersControl</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=35811"/>
		<updated>2021-06-14T19:37:37Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* readingsGroup für die Beschattung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Rollläden&lt;br /&gt;
|ModCategory=Automatisierung&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=73_AutoShuttersControl.pm&lt;br /&gt;
|ModOwner=CoolTux ({{Link2FU|13684|Forum}}/[[Benutzer Diskussion:CoolTux|Wiki]])}}&lt;br /&gt;
Mit [[AutoShuttersControl]] oder kurz &#039;&#039;&#039;ASC&#039;&#039;&#039; können Rollläden automatisch hoch und herunter gefahren werden. Zum Beispiel Öffnen bei Sonnenaufgang, Schließen bei Sonnenuntergang, Beschatten abhängig vom Sonnenstand oder Anfahren von Lüftungspositionen nach Öffnen des zugehörigen Fensters. &lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
{{Hinweis|Das Modul befindet sich derzeit noch in der Entwicklung; der derzeit aktuelle Stand ist  diesem {{Link2Forum|Topic=112325|LinkText=&amp;quot;Thread im Forum&amp;quot;}} zu entnehmen.}}&lt;br /&gt;
Als Voraussetzung sollten folgende FHEM-Devices bereits vorhanden sein:&lt;br /&gt;
* Rollläden,&lt;br /&gt;
* Fensterkontakte,&lt;br /&gt;
* Bewohnerstatus auf Basis von Residents/Roomates in englisch. Ersatzweise andere Devices, z.B. Dummys, welche als &#039;&#039;state&#039;&#039; &#039;&#039;home&#039;&#039;, &#039;&#039;absent&#039;&#039;, &#039;&#039;asleep&#039;&#039;, &#039;&#039;gotosleep&#039;&#039; und &#039;&#039;awoken&#039;&#039; setzen sowie ein Reading &#039;&#039;lastState&#039;&#039;.&lt;br /&gt;
* Helligkeitssensor (Steuerung nach Helligkeit für Beschattung)&lt;br /&gt;
* Ein Device zur Bestimmung des Sonnenstands (nur für Beschattung). Unterstützt werden derzeit [[Modul Astro|Astro]] und [[Twilight]]&amp;lt;ref&amp;gt;Dabei müssen ggf. in [[Global|global]] auch Angaben zu &#039;&#039;longitude&#039;&#039; und &#039;&#039;latitude&#039;&#039; vorhanden sein&amp;lt;/ref&amp;gt;. &lt;br /&gt;
* Wenn Feiertage berücksichtigt werden sollen: Ein oder mehrere {{Link2CmdRef|Anker=holiday2we|Lang=en|Label=holiday2we}}-Angaben in [[Global|global]] samt entsprechender [[Wochenende, Feiertage und Schulferien#Feiertage mittels holiday-Datei|holiday]]-Dateien&amp;lt;ref&amp;gt;Es kann auch z.B. ein Dummy-Device verwendet werden, dieses sollte dann aber neben dem eigentlichen Feiertags-&#039;&#039;state&#039;&#039; auch in einem Reading &#039;&#039;tomorrow&#039;&#039; Angaben zu anstehenden Feiertagen enthalten.&amp;lt;/ref&amp;gt; &amp;lt;ref&amp;gt;Bitte verfahren Sie entsprechend, wenn Urlaubs- oder Ferientage wie Feiertage behandelt werden sollen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung des Moduls bzw. dessen Funktionalität erfolgt in mehreren Schritten:&lt;br /&gt;
* Definition des ASC-Devices&lt;br /&gt;
* Einstellung zentraler Vorgaben am ASC-Device&lt;br /&gt;
* Markieren der zukünftig zu steuernden Rollladen-Devices&lt;br /&gt;
* Einbinden der Rollladen-Devices in das ASC-Device&lt;br /&gt;
* Einstellen der individuellen Vorgaben je Rollladen (am Rollladen-Device)&lt;br /&gt;
Dabei geht man am einfachsten schrittweise vor und erweitert die Funktionalität nach und nach um die gewünschten Funktionen. Dann benötigt man jeweils nur einen kleinen Teil der vielen per Attribut einstellbaren Optionen, und kann die Auswirkungen der jeweiligen Änderung besser nachvollziehen. &lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
{{Hinweis|ASC kann auch verwendet werden, um lediglich Teilaufgaben der Rollladensteuerung zu erfüllen, also z.B. nur das morgendliche Öffnen der Rollläden. Allerdings geht dabei ein erheblicher Teil des Komforts verloren, der dadurch entsteht, dass die Steuerung innerhalb der vollintegrierten Lösung jeweils nachvollzieht, aus welchem Grund eine Fahrt erfolgt war und dies ggf. bei der nächsten Aktion berücksichtigt.}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung ===&lt;br /&gt;
Zunächst sollten die in den [[#Basics|Basics]] beschriebenen Geräte vorhanden und funktionsfähig sein. &lt;br /&gt;
&lt;br /&gt;
=== Define des ASC-Devices ===&lt;br /&gt;
Es genügt ein einfaches define ohne weitere Parameter.&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Dies bewirkt neben der Anlage des Devices selbst auch, dass als weiteres globales Attribut &#039;&#039;ASC&#039;&#039; verfügbar wird.&lt;br /&gt;
&lt;br /&gt;
=== Einstellung zentraler Vorgaben ===&lt;br /&gt;
Mit Attributen am ASC-Device wird das Verhalten des ASC-Devices eingestellt, z.B. Vermeiden von morgendlichen oder abendlichen Fahrten, Frostschutzfunktion bei Gefahr von festgefrorenen Rollläden oder die Reaktion auf Fensterkontakte. Details sind der Commandref zu entnehmen.&lt;br /&gt;
Diese Attribute können jederzeit geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Auswählen zu steuernder Rollladen-Devices ===&lt;br /&gt;
Für jeden vom ASC-Device kontrollierten Rollladen muss das globale Attribut &#039;&#039;ASC&#039;&#039; gesetzt werden. Das steht nach dem Definieren des ASC-Devices zur Verfügung. Das Attribut ist mit 1 oder 2 festzulegen: &lt;br /&gt;
# Je &#039;&#039;kleiner&#039;&#039; der &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Wert um so weiter ist der Rollladen geschlossen. Typischerweise ist dann 0 &#039;&#039;offen&#039;&#039; und 100 &#039;&#039;geschlossen&#039;&#039;. Dies ist z.B. die  passende Wahl für ROLLO-Devices&lt;br /&gt;
# Je &#039;&#039;größer&#039;&#039; der &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Wert desto weiter ist der Rollladen geschlossen, also &#039;&#039;offen&#039;&#039; für &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; pct 100&amp;lt;/code&amp;gt;. Typische Vertreter dieses Typs sind HomeMatic (CUL_HM-) Geräte oder die Shelly2-Aktoren.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dem Parameter leitet das Modul bestimmte Voreinstellungen (&#039;&#039;defaults&#039;&#039;) für den Rollladen ab. Es genügt daher, nur jeweils die Einstellungen zu verändern, die anders gewünscht werden oder für den Rollladenaktortyp anders sein müssen (z.B. &#039;&#039;dim 99&#039;&#039; für vollständiges Öffnen eines ZWave-Aktors).&lt;br /&gt;
{{Hinweis|Das Vorstehende gilt jeweils für den nicht-invertierten Modus! Wer z.B. ein HomeMatic-Gerät mit &#039;&#039;levelinverse&#039;&#039; betreibt, sollte &#039;&#039;ASC&#039;&#039; auf &amp;quot;1&amp;quot; setzen usw.. Maßgeblich ist letztlich nur die Frage, ob die Offen-Positionsangabe nummerisch kleiner oder größer als die Geschlossen-Positionsangabe ist; die konkreten Zahlenwerte spielen dabei keine Rolle, die Angabe &#039;&#039;position&#039;&#039; oder &#039;&#039;pct&#039;&#039; kann auch später über ein weiteres Attribut passend eingestellt werden.}}&lt;br /&gt;
&lt;br /&gt;
=== Einbinden in das ASC-Device ===&lt;br /&gt;
Nachdem das ASC Attribut für die betreffenden Rollladen-Devices gesetzt ist, muss mit &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; scanForShutters&amp;lt;/code&amp;gt; ein Suchlauf gestartet werden, mit dem diese Rollläden in die Steuerungslogik eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellen der individuellen Vorgaben ===&lt;br /&gt;
Die gefundenen Rollladen-Devices erhalten weitere Attribute, mit denen für den jeweiligen Rollladen benötigte Einstellungen vorgenommen werden. &lt;br /&gt;
Diese Attribute sind in der commandref beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
===Readings im zentralen ASC-Device ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|..._nextAstroTimeEvent || || Zeit wird abhängig von der eingestellten Attribute ASC_Time_Up/ASC_Time_Down angezeigt. Bei &#039;&#039;astro&#039;&#039; die Uhrzeit des  Sonnenauf- oder Sonnenuntergang, bei &#039;&#039;time&#039;&#039; und &#039;&#039;brightness&#039;&#039; die Zeit aus ASC_Time_Up_Early/ASC_Time_Down_Late pro Rollonamen&lt;br /&gt;
|-&lt;br /&gt;
|..._lastPosValue || || Position pro Rollonamen, bevor ASC die Rollläden verfahren hat.&lt;br /&gt;
|-&lt;br /&gt;
|..._PosValue || ||aktuelle Position pro Rollonamen.&lt;br /&gt;
|-&lt;br /&gt;
|ascEnable||on, off ||globale ASC Steuerung bei den Rollläden aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|controlShading||on, off ||globale Beschattungsfunktion aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|hardLockOut || on, off ||Status des hardwareseitigen Aussperrschutzes / gilt nur für Rollläden mit dem Attribut bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist.&lt;br /&gt;
|-&lt;br /&gt;
|selfDefense || on, off ||globale Selbstschutzfunktion aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off || globaler Partymodus aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|state || ||Status des ASC-Devices: active, enabled, disabled oder weitere Statusinformationen wie z.B. Grund der letzen Fahrt.&lt;br /&gt;
|-&lt;br /&gt;
|room_... || ||Auflistung aller Rollläden, welche in den jeweiligen Räumen gefunden wurden, Bsp.: room_Schlafzimmer,Terrasse.&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday|| on,off ||globale Wochenendunterstützung aktiv oder inaktiv.&lt;br /&gt;
|-&lt;br /&gt;
|userAttrList || rolled out ||Das ASC-Modul verteilt an die gesteuerten Rollladen-Geräte diverse Benutzerattribute (userattr). In diesem Reading kann der Status dieser Verteilung geprüft werden.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings in den Rolllädendevices ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Enable ||Status von ASC_Enable (on,off).&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersLastDrive ||Grund der letzten Fahrt des Rollladens.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveDown ||Zeit wird abhängig von der eingestellten Attribute ASC_Time_Down angezeigt. Bei astro die Uhrzeit des Sonnenuntergangs, bei time und brightness die Zeit aus /ASC_Time_Down_Late &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveUp ||Zeit wird abhängig von der eingestellten Attribute ASC_Time_Up angezeigt. Bei astro die Uhrzeit des Sonnenaufgangs, bei time und brightness die Zeit aus /ASC_Time_Up_Early&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==set- und get-Befehle für das ASC-Device==&lt;br /&gt;
=== set-Anweisungen ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Beschreibung  &lt;br /&gt;
|-&lt;br /&gt;
|advDriveDown ||on, off ||Nachholen der durch ASC_Adv on ausgesetzten Fahrten.&lt;br /&gt;
|-&lt;br /&gt;
|ascEnable||on, off ||Aktiviert oder deaktiviert die globale ASC-Steuerung.&lt;br /&gt;
|-&lt;br /&gt;
|controlShading||on, off ||Aktiviert oder deaktiviert die globale Beschattungssteuerung.&lt;br /&gt;
|-&lt;br /&gt;
|createNewNotifyDev || ||Legt die interne Struktur für NOTIFYDEV neu an. (Diese Funktion steht nur zur Verfügung, wenn Attribut ASC_expert auf 1 gesetzt ist.)&lt;br /&gt;
|-&lt;br /&gt;
|hardLockOut ||on, off ||Aktiviert den hardwareseitigen Aussperrschutz für die Rollläden, bei denen das Attributs ASC_LockOut auf hard gesetzt ist. Mehr Informationen in der Beschreibung bei den Attributen für die Rollladengeräten.&lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off ||Aktiviert den globalen Partymodus. Alle Rollladen-Geräten, in welchen das Attribut ASC_Partymode auf on gesetzt ist, werden durch ASC nicht mehr gesteuert. Der letzte Schaltbefehl, der bspw. durch ein Fensterevent oder Wechsel des Bewohnerstatus an die Rollläden gesendet wurde, wird beim Deaktivieren des Partymodus ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|renewAllTimer || ||Erneuert bei allen Rollläden die Zeiten gemäß ASC_UP/ASC_DOWN und setzt die internen Timer neu.&lt;br /&gt;
|-&lt;br /&gt;
|renewTimer || ||Erneuert bei dem ausgewählten Rollladen die Zeiten gemäß ASC_UP/ASC_DOWN und setzt die internen Timer neu.&lt;br /&gt;
|-&lt;br /&gt;
|scanForShutters || ||Sucht alle FHEM Devices mit dem Attribut &#039;&#039;ASC&#039;&#039; &#039;&#039;1&#039;&#039; oder &#039;&#039;2&#039;&#039; und legt diese im ASC-Modul an&lt;br /&gt;
|-&lt;br /&gt;
|selfDefence ||on, off||Aktiviert bzw. deaktiviert die Selbstschutzfunktion. Beispiel 1: Wenn das Residents-Gerät &#039;&#039;gone&#039;&#039; meldet, alle Rollläden dann heruntergefahren.  Beispiel 2 : Wenn das Residents-Gerät &#039;&#039;absent&#039;&#039; meldet, das Attribut ASC_ShuttersPlace=terrace ist und ein Fenster im Haus noch geöffnet ist, so wird an diesem Fenster der Rollladen  dann heruntergefahren.&lt;br /&gt;
|-&lt;br /&gt;
|shutterASCenableToggle ||  ||Aktivieren oder deaktivieren der ASC Kontrolle des einzelnen Rollladens.&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday || on,off ||Aktiviert die Wochenendunterstützung. Dann wird das Attribut ASC_Time_Up_WE_Holiday am Rollladen-Device beachtet.&lt;br /&gt;
|-&lt;br /&gt;
|wiggle ||||Bewegt einen oder mehrere Rollläden um einen definierten Wert (Default: 5%) und nach einer Minute wieder zurück in die Ursprungsposition. Diese Funktion könnte bspw. zur Abschreckung in einem Alarmsystem eingesetzt werden.&lt;br /&gt;
|-&lt;br /&gt;
|||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get-Anweisungen ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| showNotifyDevsInformations ||Zeigt eine Übersicht der abgelegten NOTIFYDEV Struktur. Diese Funktion wird für das Debugging genutzt. Hierzu ist das Attribut ASC_expert = 1 zu setzen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
{{Hinweis|Die Attributnamen haben sich teilweise geändert, nachfolgend ist der Stand von Modulversion v0.8.x wiedergegeben.}}&lt;br /&gt;
{{Hinweis|In der commandref findet sich häufig die Schreibweise &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;ASC_BrightnessSensor Sensorname[:brightness [400:800]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Dabei sind die Angaben in den eckigen Klammern optional. Dies müssen also nicht angegeben werden, stattdessen verwendet das Modul dann Standardwerte (siehe cref), die in der cref zu findenden Angaben entsprechen dabei den defaults. Werden Werte angegeben, sind die eckigen Klammern &#039;&#039;&#039;wegzulassen&#039;&#039;&#039;! Beispiel: &amp;lt;code&amp;gt;ASC_BrightnessSensor hm_motion_1 70:100&amp;lt;/code&amp;gt; würde das brightness-Reading des Sensors hm_motion_1 verwenden und einen morgendlichen Schwellenwert von 70 bzw. 100 für abends.}}&lt;br /&gt;
===Attribute direkt am ASC-Device ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEvening || ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON ||nach welchem ASTRO-Modus soll die Abendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEveningHorizon || - 9 bis 9 || 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeEvening der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorning || ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON || nach welchem ASTRO-Modus soll die Morgendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorningHorizon || - 9 bis 9|| 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeMorning der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlComfort ||on, off || off ||schaltet die Komfortfunktion an. Bedeutet, dass ein Rollladen mit einem threestate-Sensor am Fenster beim Öffnen in eine Offenposition fährt. Hierzu muss beim Rollladen das Attribut ASC_ComfortOpen_Pos entsprechend konfiguriert sein. &lt;br /&gt;
|- &lt;br /&gt;
|ASC_autoShuttersControlEvening ||on, off || ||Aktiviert die automatische Steuerung durch das ASC-Modul am Abend.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlMorning ||on, off || ||Aktiviert die automatische Steuerung durch das ASC-Modul am Morgen.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_blockASCDrivesAfterManual ||0, 1 || ||wenn dieser Wert auf 1 gesetzt ist, dann werden Rollläden vom ASC-Modul nicht mehr gesteuert, wenn zuvor manuell eingegriffen wurde. Voraussetzung hierfür ist jedoch, dass im Reading ASC_ShuttersLastDrive der Status manual enthalten ist und sich der Rollladen auf eine unbekannte (nicht in den Attributen anderweitig konfigurierte) Position befindet.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_brightnessDriveUpDown || || || Werte (z.B. Lux) bei dem Schaltbedingungen für Sonnenauf- und -untergang geprüft werden sollen. Diese globale Einstellung kann durch die WERT-MORGENS:WERT-ABENDS Einstellung von ASC_BrightnessSensor im Rollladen selbst überschrieben werden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_debug ||0, 1 || 0||Aktiviert die erweiterte Logausgabe für Debugausgaben (nur nach Aufforderung nutzen) &lt;br /&gt;
|-&lt;br /&gt;
|ASC_expert ||0, 1 ||0 ||ist der Wert 1, so werden erweiterte Informationen bezüglich des NotifyDevs unter &#039;&#039;set und get&#039;&#039; angezeigt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_freezeTemp ||-5 bis 5 || ||Temperatur, ab welcher der Frostschutz greifen soll und der Rollladen nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_rainSensor || || ||DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS] - der Inhalt ist eine Kombination aus Devicename, Readingname, Wert ab dem getriggert werden soll, Hysterese Wert ab dem der Status Regenschutz aufgehoben werden soll und der &amp;quot;wegen Regen geschlossen Position&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|ASC_residentsDev  || || ||DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Devicenamen und Readingnamen des Residents-Device der obersten Ebene (z.B. rgr_Residents:state)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_shuttersDriveDelay  || || ||maximale Zufallsverzögerung in Sekunden bei der Berechnung der Fahrzeiten. 0 bedeutet keine Verzögerung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_tempSensor || || ||DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Device und Reading für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_twilightDevice || || ||das Device, welches die Informationen zum Sonnenstand liefert. Wird unter anderem für die Beschattung verwendet.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_windSensor || || ||DEVICE[:READING] - Sensor für die Windgeschwindigkeit. Kombination aus Device und Reading.&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Attribute in den Rolllädendevices===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC || 0, 1, 2|| ||&amp;quot;kein Anlegen der Attribute beim ersten Scan bzw. keine Beachtung eines Fahrbefehles&amp;quot;,1 = &amp;quot;Inverse oder Rollo - Bsp.: Rollo oben 0, Rollo unten 100 und der Befehl zum prozentualen Fahren ist position&amp;quot;,2 = &amp;quot;Homematic Style - Bsp.: Rollo oben 100, Rollo unten 0 und der Befehl zum prozentualen Fahren ist pct&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Adv || on, off||||bei on wird das runterfahren des Rollos während der Weihnachtszeit (1. Advent bis 6. Januar) ausgesetzt! Durch set &amp;lt;ASCDEVICE&amp;gt; advDriveDown werden alle ausgesetzten Fahrten nachgeholt.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze ||off, soft, hard, am, pm || ||Frostschutz, wenn soft fährt der Rollladen in die ASC_Antifreeze_Pos, bei hard/am/pm wird gar nicht oder innerhalb der entsprechenden Tageszeit nicht gefahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze_Pos || || ||Position des Rolllades die angefahren werden soll, wenn der Fahrbefehl komplett schließen lautet, aber der Frostschutz aktiv ist  !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEvening ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON || ||nach welchem ASTRO-Modus soll die Abendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEveningHorizon || - 9 bis 9 || 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeEvening der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorning ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON || || nach welchem ASTRO-Modus soll die Morgendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorningHorizon || - 9 bis 9|| 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeMorning der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_afterManual || ||1200 ||wie viel Sekunden soll die Automatik nach einer manuellen Fahrt aussetzen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforeDayOpen || ||3600 ||wie viel Sekunden vor dem morgendlichen öffnen soll keine schließen Fahrt mehr stattfinden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforeNightClose || ||3600 ||ie viel Sekunden vor dem nächtlichen schließen soll keine öffnen Fahrt mehr stattfinden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BrightnessSensor || ||none ||DEVICE[:READING] WERT-MORGENS:WERT-ABENDS / &#039;Sensorname[:brightness [400:800]]&#039; Angaben zum Helligkeitssensor mit (Readingname, optional) für die Beschattung und dem Fahren der Rollladen nach brightness und den optionalen Brightnesswerten für Sonnenauf- und Sonnenuntergang &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Closed_Pos || ||default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;||in 10er-Schritten von 0 bis 100 &lt;br /&gt;
wird angefahren wenn SelfDefense aktiv ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ComfortOpen_Pos || || || in 10er Schritten von 0 bis 100 !!! Die eingestellte Position wird bei einem threestate Sensor angefahren. Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Down || time, astro, brightness, roommate || astro||bei &#039;&#039;astro&#039;&#039; wird Sonnenuntergang berechnet, bei time wird der Wert aus ASC_Time_Down_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Down_Early und ASC_Time_Down_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Down_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Down_Early und ASC_Time_Down_Late geschaut, ob die als Attribut im Moduldevice hinterlegte ASC_brightnessDriveUpDown der Down Wert erreicht wurde. Wenn ja, wird der Rollladen runter gefahren.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_DiveUpMaxDuration || || 60||die Dauer des Hochfahrens des Rollladens plus 5 Sekunden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Drive_Delay || || -1|| maximaler Wert für einen zufällig ermittelte Verzögerungswert in Sekunden bei der Berechnung der Fahrzeiten, 0 bedeutet keine Verzögerung, -1 bedeutet, dass das ??gleichwertige Attribut?? aus dem ASC Device ausgewertet werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Drive_DelayStart || || -1|| in Sekunden verzögerter Wert ab welchen dann erst das Offset startet und dazu addiert wird. Funktioniert nur wenn gleichzeitig ASC_DriveDelay gesetzt wird.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ExternalTrigger || |||| DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE, Beispiel: &amp;quot;WohnzimmerTV:state on:off 66:100&amp;quot; bedeutet das wenn ein &amp;quot;state:on&amp;quot; Event kommt soll das Rollo in Position 66 fahren, kommt ein &amp;quot;state:off&amp;quot; Event soll es in Position 100 fahren. Es ist möglich die POSINACTIVE weg zu lassen dann fährt das Rollo in LastStatus Position.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_GuestRoom || on, off |||| aktuell noch nicht umgesetzt...&lt;br /&gt;
|-&lt;br /&gt;
|ASC_LockOut || soft, hard, off ||off || stellt entsprechend den Aussperrschutz ein. Bei global aktivem Aussperrschutz (set ASC-Device lockOut soft) und einem Fensterkontakt open bleibt dann der Rollladen oben. Dies gilt nur bei Steuerbefehlen über das ASC Modul. Stellt man global auf hard, wird bei entsprechender Möglichkeit versucht den Rollladen hardwareseitig zu blockieren. Dann ist auch ein Fahren über die Taster nicht mehr möglich&lt;br /&gt;
|-&lt;br /&gt;
|ASC_LockOut_Cmd || inhibit, blocked, protection ||none|| set Befehl für das Rollladen-Device zum Hardware sperren. Dieser Befehl wird gesetzt werden, wenn man &amp;quot;ASC_LockOut&amp;quot; auf hard setzt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Down ||absent, always, off, home || always ||Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Up ||absent, always, off, home || always ||Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Open_Pos || ||default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;||in 10er-Schritten von 0 bis 100&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Partymode || on, off || off ||schaltet den Partymodus an oder aus. Wird am ASC Device set ASC-DEVICE partyMode on geschalten, werden alle Fahrbefehle an den Rollläden, welche das Attribut auf on haben, zwischengespeichert und später erst ausgeführ&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Pos_Reading || || ||Name des Readings, welches die Position des Rollladen in Prozent angibt. Wird bei unbekannten Device-Typen auch als &#039;&#039;set&#039;&#039; Befehl zum Fahren verwendet&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDownValue_beforNightClose || || -1||wie viele Sekunden vor dem abendlichen schließen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:300 bedeutet 30 min vor night close oder bei unter einem Brightnesswert von 300&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDown_Pos || ||50||Position den Rollladens für den abendlichen Sichtschutz!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyUpValue_beforDay || || -1||wie viele Sekunden vor dem morgendlichen öffnen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:600 bedeutet 30 min vor day open oder bei über einem Brightnesswert von 600&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyUp_Pos || ||50||Position den Rollladens für den morgendlichen Sichtschutz!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_RainProtection ||on, off || ||soll der Rollladen beim Regenschutz beachtet werden. on=JA, off=NEIN.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Device || || none ||mit Komma getrennte Namen des/der Roommate-Device/s welche den/die Bewohner des Rollladen-Raumes wiedergibt. Macht nur Sinn in Schlaf- oder Kinderzimmern&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Reading || || ||Reading des Roommate-Device, welches den Status wieder gibt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Self_Defense_AbsentDelay || || 300||um wie viele Sekunden soll das fahren in Selfdefense bei Residents absent verzögert werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Self_Defense_Mode || || gone||ab welchen Residents Status soll Selfdefense aktiv werden ohne das Fenster auf sind&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_InOutAzimuth || ||95:265 ||Azimut Wert ab dem bei Überschreiten Beschattet und bei Unterschreiten Endschattet werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_MinMax_Elevation || ||25.0:100.0 ||ab welcher min Höhe des Sonnenstandes soll beschattet und ab welcher max Höhe wieder beendet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_MinOutsideTemperature_ || ||18 ||ab welcher Temperatur soll Beschattet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwert&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShadingMode ||absent, always, off, home || off||wann soll die Beschattung nur stattfinden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Pos || || ||Position des Rollladens für die Beschattung !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_StateChange_SunnyCloudy || ||35000:20000 ||Brightness Wert ab welchen die Beschattung stattfinden und aufgehoben werden soll, immer in Abhängigkeit der anderen einbezogenen Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_WaitingPeriod || ||1200 ||wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung stattfinden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shutter_IdleDetection || ||||READING:VALUE gibt das Reading an welches Auskunft über den Fahrstatus des Rollos gibt, sowie als zweites den Wert im Reading welcher aus sagt das das Rollo nicht fährt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersPlace || window, terrace || ||wenn dieses Attribut auf &#039;&#039;terrace&#039;&#039; gesetzt ist und das Residents-Device in den Status &#039;&#039;absent&#039;&#039; geht, &#039;&#039;selfDefence&#039;&#039; aktiv ist und das Fenster geöffnet ist, wird das Rollo  geschlossen. Wenn ein twostate Senso genutzt wird und dieses Attribut auf &#039;&#039;terrace&#039;&#039; gesetzt ist wird ASC_Ventilate_Pos ignoriert und das Rollo wird beim öffnen des Fenster komplett geöffnet. Wenn dieses Attribut auf &#039;&#039;window&#039;&#039; gesetzt ist wird ASC_Ventilate_Pos berücksichtigt und das Rollo wird entsprechend der ASC_Ventilate_Pos geöffnet. Wenn das Fenster wieder geschlossen wird, dann wird das Rollo unabhängig von &#039;&#039;windows oder terrace&#039;&#039; vollständig geschlossen.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Sleep_Pos || || ||in 10er-Schritten von 0 bis 100, default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC.&#039;&#039; Position wird angefahren wenn Bedingung für modeDown aktiv ist. Hiermit kann z.B. das komplette abendliche Schließen des Rollos begrenzt werden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_TempSensor || || ||DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Device und Reading für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Early || ||16:00 ||Sonnenuntergang frühste Zeit zum Runterfahren !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Late || ||22:00 ||Sonnenuntergang späteste Zeit zum Runterfahren !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Early || || 05:00||Sonnenaufgang frühste Zeit zum Hochfahren !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Late || ||08:30 ||Sonnenaufgang späteste Zeit zum Hochfahren  !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_WE_Holiday || ||08:00 ||Sonnenaufgang frühste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet).ACHTUNG!!! in Verbindung mit Brightness für ASC_Up muss die Uhrzeit kleiner sein wie die Uhrzeit aus ASC_Time_Up_Late !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!! &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Ventilate_Window_Open ||on, off ||on||auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WiggleValue || ||5 ||Wert, um welchen sich die Position des Rollladens bei &#039;&#039;Wiggle&#039;&#039; ändern soll &lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindParameters || ||5 ||TRIGGERMAX[:HYSTERESE] [DRIVEPOSITION] / Angabe von Max Wert ab dem für Wind getriggert werden soll, Hytsrese Wert ab dem der Windschutz aufgehoben werden soll TRIGGERMAX - HYSTERESE / Ist es bei einigen Rollläden nicht gewünscht das gefahren werden soll, so ist der TRIGGERMAX Wert mit -1 an zu geben. (default: &#039;50:20 ClosedPosition&#039;)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindProtection ||on, off || ||soll der Rollladen beim Windschutz beachtet werden. on=JA, off=NEIN.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec || ||none ||Name des Fensterkontakts, an welchen Fenster der Rollladen angebracht ist. WINDOWREC:[READING], Name des Fensterkontaktes, an dessen Fenster der Rollladen angebracht ist. Reading ist optional&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec_PosAfterDayClosed ||open, lastManual ||open ||Name des Fensterkontakts, an welchen Fenster der Rollladen angebracht ist. Sein Reading &#039;&#039;state&#039;&#039; muss die Werte &#039;&#039;open&#039;&#039;, &#039;&#039;closed&#039;&#039; oder &#039;&#039;tilted&#039;&#039; enthalten.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec_subType ||twostate, threestate ||twostate||Typ des verwendeten Fensterkontaktes: twostate (optisch oder magnetisch) oder threestate (Drehgriffkontakt)&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||    &lt;br /&gt;
|-  &lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||        &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hilfsmittel ==&lt;br /&gt;
{{Hinweis|Die Device-Namen sind auf die eigene Installation anzupassen.}}&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Codezeilen sind im [[Import von Code Snippets|RAW]]-Format.}}&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText= Stand 2019-05-03&lt;br /&gt;
* Erfolgreich getestet mit Homematic Devices, Beta-User&lt;br /&gt;
* Die Farbgebung entspricht dem Standard, wenn unter dem Style f18 der Farbpreset &#039;&#039;light&#039;&#039; gewählt wird.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Level ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Schliessen bis&amp;gt;,&amp;lt;Öffnen auf&amp;gt;,&amp;lt;Beschattung&amp;gt;,&amp;lt;Komfort&amp;gt;,&amp;lt;Lüften&amp;gt;,&amp;lt;Privacy&amp;gt; (Rollladen_.*|Jalousie_.*)..:level,!?ASC_Closed_Pos,!?ASC_Open_Pos,!?ASC_Shading_Pos,!?ASC_ComfortOpen_Pos,!?ASC_Ventilate_Pos,!?ASC_PrivacyDown_Pos&lt;br /&gt;
attr rg_ASC_Rolllaeden_Level commands {level =&amp;gt; &#039;pct:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_ComfortOpen_Pos =&amp;gt; &#039;ASC_ComfortOpen_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_PrivacyDown_Pos =&amp;gt; &#039;ASC_PrivacyDown_Pos:selectnumbers,0,5,100,0,lin&#039;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Zeiten ===&lt;br /&gt;
[[Bild:ReadingsGroup ASC times.png|thumb|right|ReadingsGroup - Zeitenbeispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Position&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Up_WE/Hol&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt; \&lt;br /&gt;
 (.*Rollo.*|.*Rollladen|Jalousie_.*):level,!?ASC_Time_Up_Early,!?ASC_Time_Up_Late,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times commands {level =&amp;gt; &#039;pct:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100&#039;, \&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, \&lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;, \&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,\&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:55,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,  \&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt; &#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;, \&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;, \&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039; }&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times room Rollladen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC RG Zeiten HM ZWave Siro.png|thumb|right|ReadingsGroup - CUL_HM+ZWave+Siro mit widgets]]Neue Version mit time-Widgets und pct/dim/position-widget (5-er Schritte), passend für CUL_HM, ZWave und Siro-Geräte:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Time_Up_Early  &amp;gt;,&amp;lt;Time_Up_WE  &amp;gt;,&amp;lt;Time_Up_Late  &amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt; (Rollo_.*|Jalousie_.*)..:(level|dim|position),!?ASC_Time_Up_Early,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Up_Late,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times commands {level =&amp;gt; &#039;pct:selectnumbers,0,5,100,0,lin&#039;, \&lt;br /&gt;
dim =&amp;gt; &#039;dim:selectnumbers,0,5,99,0,lin&#039;,\&lt;br /&gt;
position =&amp;gt; &#039;pct:selectnumbers,0,5,99,0,lin&#039;,\&lt;br /&gt;
ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;,\&lt;br /&gt;
ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039;,\&lt;br /&gt;
ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:time&#039;, \&lt;br /&gt;
ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:time&#039;,\&lt;br /&gt;
ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:time&#039;, \&lt;br /&gt;
ASC_Time_Up_Late =&amp;gt;&#039;ASC_Time_Up_Late:time&#039;,\&lt;br /&gt;
ASC_Time_Up_WE_Holiday =&amp;gt;&#039;ASC_Time_Up_WE_Holiday:time&#039;}&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times room Rollladen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  readingsGroup für die Beschattung ===&lt;br /&gt;
[[Datei:Shading.png.png|alternativtext=|mini|ReadingsGroup - Beschattungsbeispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;&lt;br /&gt;
defmod RG_test readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;InAzi&amp;gt;,&amp;lt;OutAzi&amp;gt;,&amp;lt;MinEle&amp;gt;,&amp;lt;MaxEle&amp;gt;,&amp;lt;Sunny&amp;gt;,&amp;lt;Cloudy&amp;gt;\&lt;br /&gt;
(Rollo|Jalousie)_.*..:&amp;lt;{ascAPIget(&#039;ShadingAzimuthLeft&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingAzimuthRight&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingMinElevation&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingMaxElevation&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingStateChangeSunny&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingStateChangeCloudy&#039;,$DEVICE)}&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  readingsGroup für FIBARO Roller Shutter FGR-222 Devices ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Getestet von majestro84, Stand 2019-01-28.&lt;br /&gt;
* {{Link2Forum|Topic=92628|Message=897099|LinkText=Forenbeitrag dazu}}&lt;br /&gt;
* Die Farbgebung entspricht dem Standard, wenn unter dem Style f18 der Farbpreset &#039;&#039;dark&#039;&#039; gewählt wird}}&lt;br /&gt;
[[Bild:ASC Jalousien Times.JPG|thumb|right|Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt;define ASC_Jalousien_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_WE&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt;,&amp;lt;PartyMode&amp;gt;,&amp;lt;LockOut&amp;gt; (.*_Jalousie.*):position,!?ASC_Time_Up_Early,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Up_Late,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up,!?ASC_Partymode,!?ASC_LockOut&lt;br /&gt;
&lt;br /&gt;
 attr ASC_Jalousien_Times commands {position =&amp;gt; &#039;dim:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;,&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039;,&lt;br /&gt;
 ASC_Partymode =&amp;gt; &#039;ASC_Partymode:on,off&#039;,&lt;br /&gt;
 ASC_LockOut =&amp;gt; &#039;ASC_LockOut:soft,hard,off&#039;,&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, &lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;,&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:45,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt;&#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;}&lt;br /&gt;
 attr ASC_Jalousien_Times room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC Jalousien Level.JPG|thumb|right|Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt; define Jalousien_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Closed_Pos&amp;gt;,&amp;lt;Open_Pos&amp;gt;,&amp;lt;Comfort_Pos&amp;gt;,&amp;lt;Ventilate_Pos&amp;gt;,&amp;lt;PrivacyDown_Pos&amp;gt;,&amp;lt;Shading_Pos&amp;gt; (.*_Jalousie.*):!?ASC_Closed_Pos,!?ASC_Open_Pos,!?ASC_ComfortOpen_Pos,!?ASC_Ventilate_Pos,!?ASC_PrivacyDown_Pos,!?ASC_Shading_Pos&lt;br /&gt;
 attr Jalousien_Level commands { ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_ComfortOpen_Pos =&amp;gt; &#039;ASC_ComfortOpen_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_PrivacyDown_Pos =&amp;gt; &#039;ASC_PrivacyDown_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;}&lt;br /&gt;
 attr Jalousien_Level room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einrichtungsbeispiel (nach Sonnenstand) ==&lt;br /&gt;
=== Ziel und Vorgaben ===&lt;br /&gt;
Es sollen die Rollläden und Jalousien innerhalb bestimmter zeitlicher Perioden sonnenstandsabhängig geöffnet und geschlossen werden. An den Wochenenden und an Ferientagen soll etwas später geöffnet werden. Es sind Tür- und Fensterkontakte vorhanden (Türkontakte: twoState, Fensterkontakte: threeState), wobei bei jeder Öffnung ein eventuell geschlossener Rollladen geöffnet werden soll. Bei allen Rollladenaktoren, Tür- und Fensterkontakten handelt es sich um CUL_HM-Geräte.&lt;br /&gt;
&lt;br /&gt;
=== Vorarbeiten ===&lt;br /&gt;
Im global-Device sind Angaben zu latitude und longitude vorhanden, holiday2we wie folgt&amp;lt;ref&amp;gt;&#039;&#039;ferien&#039;&#039; ist eine automatisiert erstellte holiday-Datei nach diesem {{Link2Forum|Topic=85759|Message=885883|LinkText=Foren-Beitrag}}.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr global holiday2we bw,ferien&lt;br /&gt;
Weitere Angaben werden zunächst nicht benötigt, das Astro-Device wird erst in der Beschattungskonfiguration definiert. &lt;br /&gt;
Dann erfolgt das &#039;&#039;Define des ASC-Devices&#039;&#039; wie oben beschrieben:&lt;br /&gt;
&amp;lt;code&amp;gt;define Rollladenautomatik AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Folgen die einzubindenden Rollladenaktoren einem einheitlichen Namensschema, können diese sodann z.B. mit &lt;br /&gt;
 attr (Jalousie|Rollladen)_.* ASC 2&lt;br /&gt;
auf einen Rutsch mit dem passenden ASC-Typ gekennzeichnet werden.  &lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Achtung: Das AutoShuttersControl-Device selbst darf kein ASC-Attribut bekommen!}}&lt;br /&gt;
&lt;br /&gt;
Dann werden mit &lt;br /&gt;
 set Rollladenautomatik scanForShutters&lt;br /&gt;
die nachfolgend weiter zu bearbeitenden Attribute angelegt.&lt;br /&gt;
=== Schließen morgens und abends ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Alternative: Fahren nach brightness:&lt;br /&gt;
Soll insgesamt oder an einzelnen Rollläden helligkeitsgesteuert gefahren werden, muß zentral oder für jeden Rollladen ein Helligkeitssensor definiert und die Helligkeitsgrenzwerte festgelegt sein (&#039;&#039;ASC_BrightnessSensor&#039;&#039; etc.), bei deren Überschreitung geöffnet bzw. Unterschreitung geschlossen werden soll.}}&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Sonnenstandsabhängige Fahrzeiten werden wie folgt aktiviert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeEvening CIVIL&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeMorning CIVIL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aus der Angabe &#039;&#039;CIVIL&#039;&#039; und den Vorgaben in den einzelnen Rollladen wird dabei mit Hilfe von [[SUNRISE_EL]] die effektive Fahrzeit berechnet, dort finden sich auch weitere Hinweise, zu den meisten anderen Optionen für die ersten beiden Attribute.&lt;br /&gt;
Bei allen Fensteröffnungen soll auf eine Lüften-Position gefahren werden, also schalten wir diese Funktion ebenfalls zentral an&amp;lt;ref&amp;gt;Sonst wird bei threeState-Sensoren nur bei &#039;&#039;tilted&#039;&#039; auf die in &#039;&#039;ASC_Ventilate_Pos&#039;&#039; gefahren.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr Rollladenautomatik ASC_autoShuttersControlComfort on &lt;br /&gt;
Zuletzt legen wir noch einen Temperatur-Sensor fest. Dieser wird beim Frostschutz sowie bei der Beschattung berücksichtigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_tempSensor Aussentemperatur_Nord:temperature&lt;br /&gt;
attr Rollladenautomatik ASC_freezeTemp 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{Hinweis|Achtung: Für jede weitere Sensor-Information (z.B. zu Regen oder Wind) muß ein eigenes Device verwendet werden. Sollen unterschiedliche Readings desselben Sensors ausgewertet werden, müssen diese in ein eigenes Device übertragen werden, z.B. über einen readingsProxy mit gesetztem event-on-update-reading-Attribut (sonst triggert dieser nicht bei Aktualisierung des Readings)!}} &lt;br /&gt;
&lt;br /&gt;
tbd: &lt;br /&gt;
* Rain&lt;br /&gt;
* Wind&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
{{Hinweis|Positionen dürfen sich innerhalb eines Rollos nicht überschneiden - Auch ASC_Closed_Pos 100 ASC_Shading_Pos 98 ASC_ComfortOpen_Pos 97 usw... sind bereits unterschiedliche Positionen.}}&lt;br /&gt;
&lt;br /&gt;
===== Fahrzeiten =====&lt;br /&gt;
Zur Konfiguration der Fahrzeiten bietet es sich an, eine ReadingsGroup zu nutzen, wie unter [[#Hilfsmittel|Hilfsmittel]] dargestellt. Alternativ kann man die Zeiten auch manuell in den einzelnen Rollläden hinterlegen.&lt;br /&gt;
===== Bewohner =====&lt;br /&gt;
Wird ein Raum von einer oder mehreren bestimmten Person/en bewohnt oder gibt es ein Sammel-Gerät für mehrere Bewohner, kann dies mit den Attributen &#039;&#039;ASC_Roommate_Device&#039;&#039; und &#039;&#039;ASC_Roommate_Reading&#039;&#039; einem Rollladen zugeordnet werden. Ist einer der Bewohner &#039;&#039;asleep&#039;&#039;, wird morgens erst geöffnet, wenn auch der letzte Roommate nicht mehr &#039;&#039;asleep&#039;&#039; ist.&lt;br /&gt;
===== Fensterkontakte  =====&lt;br /&gt;
Dann werden ggf. vorhandene Fensterkontakte mit &#039;&#039;ASC_WindowRec&#039;&#039; zugeordnet und der Sensortyp mit &#039;&#039;ASC_WindowRec_subType&#039;&#039; festgelegt. Im Falle von threeState-Sensoren wird das übergreifende &#039;&#039;ASC_autoShuttersControlComfort&#039;&#039; beachtet, wobei dann bei vollständiger Öffnung des Fensters auf den in &#039;&#039;ASC_ComfortOpen_Pos&#039;&#039; festgelegten Wert gefahren wird.&lt;br /&gt;
===== Frostschutz =====&lt;br /&gt;
Zuletzt können die Attribute &#039;&#039;ASC_Antifreeze&#039;&#039; und &#039;&#039;ASC_Antifreeze_Pos&#039;&#039; festgelegt werden, wenn die Frostschutzfunktion aktiviert werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Beschattung ===&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Im ASC DEVICE das Reading &amp;quot;controlShading&amp;quot; auf &#039;&#039;on&#039;&#039;, sowie ein Astro/Twilight Device im Attribut &amp;quot;ASC_twilightDevice&amp;quot; und das Attribut &amp;quot;ASC_tempSensor&amp;quot; definieren.&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
Es wird ein Helligkeitssensor als Attribut &amp;quot;ASC_BrightnessSensor&amp;quot; benötigt. Wird der Sensor nur für die Beschattung verwendet, ist der Wert DEVICENAME[:READING] ausreichend.&lt;br /&gt;
Alle weiteren Attribute sind optional und wenn nicht gesetzt mit Default-Werten belegt. Sie sollten entsprechend der Gegebenheiten angepasst werden. Die Werte für die Fensterposition und den Vor-/Nachlaufwinkel &#039;&#039;(ASC_Shading_InOutAzimuth)&#039;&#039; sowie die Grenzwerte für &amp;lt;code&amp;gt;&#039;&#039;ASC_shading_StateChange_SunnyCloudy&#039;&#039;&amp;lt;/code&amp;gt; sind besonders wichtig. &lt;br /&gt;
&lt;br /&gt;
==== Bedingungen ====&lt;br /&gt;
Damit die Beschattung startet müssen &#039;&#039;&#039;alle&#039;&#039;&#039; Bedingungen erfüllt sein. Entschattet wird, sobald &#039;&#039;&#039;eine&#039;&#039;&#039; der Bedingungen wegfällt und die Zeit entsprechend &amp;lt;code&amp;gt;ASC_Shading_WaitingPeriod&amp;lt;/code&amp;gt; abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
Der Sonnensensor &amp;lt;ASC_BrightnessSensor&amp;gt; muss mindestens zwei Messwerte geliefert haben, bevor das ASC-Modul in die Beschattungsposition fährt! Beim (zeitlich) ersten Messwert wird der Zustand &#039;&#039;in-reserved&#039;&#039; gesetzt. Erst beim zweiten Messwert wechselt der Zustand nach &#039;&#039;in shading&#039;&#039;. Die Anzahl der berücksichtigten Messwerte ist abhängig vom &amp;quot;moving average window&amp;quot;, der mit dem dritten Parameter des Attributs &#039;&#039;ASC_Shading_StateChange_SunnyCloudy&#039;&#039; konfiguriert wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Von Standardwerten ausgehend ist nachfolgender Ablauf angestrebt:&#039;&#039;&#039;&lt;br /&gt;
# Ein Event vom Astro oder Helligkeits Device kommt -&amp;gt; sind alle Werte innerhalb des Arbeitsbereiches, ändert sich der ASC Info-Zustand im Rollo von xx auf „in reserved“ (Beschattung vorbereitet)&lt;br /&gt;
# Ein erneutes Event vom Astro oder Helligkeits Device kommt -&amp;gt; Überprüfung der Werte -&amp;gt; sind diese weiterhin gegeben folgt der Wechsel von „in reserved“ auf „in“ (Beschattung aktiv)&lt;br /&gt;
# Bei Verwendung von &#039;&#039;ASC_Shading_StateChange_SunnyCloudy&#039;&#039; ist zu beachten, dass ein Durchschnitt über die letzten drei Brightness Events gerechnet wird. Möchte man das vermeiden muss man SUNNY:CLOUDY 1[2] setzen. &lt;br /&gt;
# Die Zeiten &#039;&#039;ASC_Shading_WaitingPeriod&#039;&#039; und &#039;&#039;ASC_BlockingTime_afterManual&#039;&#039; können hier zusätzlich für eine Verzögerung sorgen. &lt;br /&gt;
&#039;&#039;&#039;Wichtig zu beachten:&#039;&#039;&#039; Es müssen immer mehrere (mind. 2) Events für den Betrieb erfolgen. In den Standardeinstellungen vom Astro Modul erfolgt dieses z.B. nur 1 x pro Stunde. Kommt also ein Helligkeits-Event auch nur 1x pro Stunde, könnte es 2 Std dauern, bis die Beschattungsfunltion greift. &lt;br /&gt;
&lt;br /&gt;
Wenn das Rollo einmal aus der Beschattung manuell (im Rollo Device muss bei &#039;&#039;ASC_ShuttersLastDrive manuel&#039;&#039; stehen gefahren wurde wird das Rollo erst wieder nach einer Entschattung und erneuter Beschattung gefahren. Also es muss einmal shading out kommen und beim nächsten shading in fährt er dann wieder.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Funktionen ===&lt;br /&gt;
==== WeekendHoliday Funktion im Brightnessbetrieb ====&lt;br /&gt;
Am Wochenende oder Feiertag und wenn am ASC-Device sunriseTimeWeHoliday aktiviert sowie im Rollo das Attribut ASC_Time_Up_WE_Holiday gesetzt sind, wird zur angegebenen ASC_Time_Up_WE_Holiday Zeit das Rollo geöffnet, ungeachtet des Brightnesswertes.&lt;br /&gt;
&lt;br /&gt;
==== Privacy ====&lt;br /&gt;
Werden hierfür Werte festgelegt, werden die betreffenden Rollläden die festgelegte Zeit/Helligkeit vor dem abendlichen Schließen vorab teilweise geschlossen. Dies kann z.B. gewünscht sein, um Rollläden zur Straße hin mit viel Fußgängerverkehr zwar nicht vollständig abzudunkeln, aber gleichzeitig zu verhindern, dass von außen in Wohnräume geschaut werden kann, sobald dort das Licht angeschaltet wird&lt;br /&gt;
&lt;br /&gt;
==== BlockingTime====&lt;br /&gt;
Bewirkt, dass nach einer manuellen Fahrt, eine vom ASC Modul initiierte Fahrt zunächst ausgesetzt wird, bis die im Attribute angegebene Zeit überschritten ist. Erst dann wird eine vom ASC Modul initiierte Fahrt tatsächlich durchgeführt.&lt;br /&gt;
Genau so wird ein Hochfahren eines Rollos durch das ASC Modul nicht mehr ausgeführt, wenn es innerhalb der Zeit von ASC_BlockingTime_beforNightClose und das Runterfahren wird nicht mehr erfolgen, wenn es innerhalb von ASC_BlockingTime_beforDayOpen ist.&lt;br /&gt;
Beispiel: Meine Tochter geht früh außer Haus und Ihre Rollos sind nicht hochgefahren. Diese fahren auch nicht mehr hoch, da die ausschließlich bei home (anwesend) fahren sollen. Nun kommt sie am Nachmittag um 16:23 Uhr nach Hause. Eigentlich sollten nun die Rollos fahren. Doch die Sonnenuntergangsfahrt (schließen) wäre schon 16:51 Uhr und damit innerhalb der 3600 ASC_BlockingTime_beforNightClose. Die Rollos bleiben also unten. Es lohnt sich für die paar Minuten einfach nicht mehr.&lt;br /&gt;
&lt;br /&gt;
==== wiggle====&lt;br /&gt;
Mit einem &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; wiggle&amp;lt;/code&amp;gt; können alle Rollladen mit einem entsprechenden Attribut zu einer kurzen Fahrt veranlasst werden, nach Ablauf von einer Minute wieder um denselben Wert zurück. Dabei wird jeweils in die Richtung gefahren, die den weiteren Weg ermöglicht. Wenn also zu 70% geschlossen ist, wird der Rollladen hoch fahren.&lt;br /&gt;
==== Partymode ====&lt;br /&gt;
Dieser wird am ASC-Device selbst aktiviert mittels &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; partyMode on&amp;lt;/code&amp;gt;. Alle Rollladen-Devices, welche das Attribut &#039;&#039;ASC_Partymode&#039;&#039; auf &#039;&#039;on&#039;&#039; gestellt haben, werden nicht mehr gesteuert. Der letzte Schaltbefehl, der durch ein Fensterevent oder Bewohnerstatus an die Rollläden gesendet wurde, beim Beenden des Modus durch &amp;lt;code&amp;gt;set ASC-Device partyMode off&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
==== lock-out ====&lt;br /&gt;
Man kann mit dem Befehl &amp;lt;code&amp;gt; set &amp;lt;ASC-Device&amp;gt; hardLockOut&amp;lt;/code&amp;gt; auf einen Schlag alle Rollos sperren welche &amp;lt;code&amp;gt; attr &amp;lt;ROLLO-Device&amp;gt; ASC_LockOut hard&amp;lt;/code&amp;gt; gesetzt haben.&lt;br /&gt;
Das ist dafür gedacht, wenn Du eine gewisse Zeit den Rolloaktor sperren willst. Zum Beispiel das die Kinder nicht schalten sollen.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Hinweise und Problemlösungen ==&lt;br /&gt;
* Werden Attribute geändert, kann es vereinzelt vorkommen, dass das ASC-Modul dies nicht mitbekommt und das tatsächliche Verhalten nicht den Erwartungen entspricht. In so einem Fall empfielt es sich, das NOTIFYDEV nochmals aufbauen zu lassen. Dazu werden zunächst mit &amp;lt;code&amp;gt;set &amp;lt;ASC-Modul&amp;gt; expert 1&amp;lt;/code&amp;gt; erweiterte Informationen bezüglich des NotifyDevs unter set und get aktiviert und anschließend ein &amp;lt;code&amp;gt;set &amp;lt;ASC-Modul&amp;gt; createNewNotifyDev&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
&lt;br /&gt;
* Hin und wieder berichten Nutzer davon, wenn Sie die &#039;&#039;Privacy Funktion&#039;&#039; nutzen, dass sich im NOTIFYDEV anstelle des Device Namen ein Raumname befindet. Diese Problem kann damit gelöst werden, dass in dem betroffenen &#039;&#039;&#039;Rollo Device&#039;&#039;&#039; das Atribut  &amp;lt;code&amp;gt;attr event-on-change .*&amp;lt;/code&amp;gt; gesetzt wird.&lt;br /&gt;
&#039;&#039;&#039;Wichtig!&#039;&#039;&#039; Nicht verwechseln mit dem ASC Device dort darf &amp;lt;code&amp;gt;attr event-on-change&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; gesetzt sein!&lt;br /&gt;
* Wenn mehrere Rollladen gleichzeitig den Fahrbefehl bekommen, kann es (z. B. bei zwave) dazu kommen, dass ein Rollladen seinen Befehl nicht bekommt. Dies kann durch eine zeitverzögerte Aussendung der Fahrbefehle vermieden werden. Dazu in den jeweiligen Rollo Devices das Attribut ASC_Drive_DelayStart wie folgt benutzen im: ersten Rollo Device braucht das Attribut nicht gesetzt werden, im zweiten Rollo Device im Attribut ASC_Drive_DelayStart dann 4 Sekunden eintragen, im dritten Rollo Device im Attribut ASC_Drive_DelayStart 8 Sekunden eintragen, usw. Ein Abstand von 3-4 Sekunden ist dabei zielführend.&lt;br /&gt;
&lt;br /&gt;
==== Spezielle Hardware ====&lt;br /&gt;
{{Link2Forum|Topic=101182|LinkText=&amp;quot;Thread zu getesteter Hardware im Forum&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Link2Forum|Topic=92628|LinkText=&amp;quot;Thread zum Modul im Forum&amp;quot;}}&lt;br /&gt;
* {{Link2Forum|Topic=90751|LinkText=&amp;quot;Thread zur Entwicklung im Forum&amp;quot;}} &lt;br /&gt;
* {{Link2Forum|Topic=73964|LinkText=&amp;quot;Thread zu den Scripten von user cluni&amp;quot;}}, die der Entwicklung des Moduls zugrunde liegen&lt;br /&gt;
* Daten zum Sonnenstand z.B. hier https://www.sonnenverlauf.de/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:Shading.png.png&amp;diff=35810</id>
		<title>Datei:Shading.png.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:Shading.png.png&amp;diff=35810"/>
		<updated>2021-06-14T19:36:59Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ReadingsGroup -Beschattungsbeispiel&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=35809</id>
		<title>AutoShuttersControl</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=35809"/>
		<updated>2021-06-14T19:34:06Z</updated>

		<summary type="html">&lt;p&gt;TomLee: Änderung 35808 von TomLee (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Rollläden&lt;br /&gt;
|ModCategory=Automatisierung&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=73_AutoShuttersControl.pm&lt;br /&gt;
|ModOwner=CoolTux ({{Link2FU|13684|Forum}}/[[Benutzer Diskussion:CoolTux|Wiki]])}}&lt;br /&gt;
Mit [[AutoShuttersControl]] oder kurz &#039;&#039;&#039;ASC&#039;&#039;&#039; können Rollläden automatisch hoch und herunter gefahren werden. Zum Beispiel Öffnen bei Sonnenaufgang, Schließen bei Sonnenuntergang, Beschatten abhängig vom Sonnenstand oder Anfahren von Lüftungspositionen nach Öffnen des zugehörigen Fensters. &lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
{{Hinweis|Das Modul befindet sich derzeit noch in der Entwicklung; der derzeit aktuelle Stand ist  diesem {{Link2Forum|Topic=112325|LinkText=&amp;quot;Thread im Forum&amp;quot;}} zu entnehmen.}}&lt;br /&gt;
Als Voraussetzung sollten folgende FHEM-Devices bereits vorhanden sein:&lt;br /&gt;
* Rollläden,&lt;br /&gt;
* Fensterkontakte,&lt;br /&gt;
* Bewohnerstatus auf Basis von Residents/Roomates in englisch. Ersatzweise andere Devices, z.B. Dummys, welche als &#039;&#039;state&#039;&#039; &#039;&#039;home&#039;&#039;, &#039;&#039;absent&#039;&#039;, &#039;&#039;asleep&#039;&#039;, &#039;&#039;gotosleep&#039;&#039; und &#039;&#039;awoken&#039;&#039; setzen sowie ein Reading &#039;&#039;lastState&#039;&#039;.&lt;br /&gt;
* Helligkeitssensor (Steuerung nach Helligkeit für Beschattung)&lt;br /&gt;
* Ein Device zur Bestimmung des Sonnenstands (nur für Beschattung). Unterstützt werden derzeit [[Modul Astro|Astro]] und [[Twilight]]&amp;lt;ref&amp;gt;Dabei müssen ggf. in [[Global|global]] auch Angaben zu &#039;&#039;longitude&#039;&#039; und &#039;&#039;latitude&#039;&#039; vorhanden sein&amp;lt;/ref&amp;gt;. &lt;br /&gt;
* Wenn Feiertage berücksichtigt werden sollen: Ein oder mehrere {{Link2CmdRef|Anker=holiday2we|Lang=en|Label=holiday2we}}-Angaben in [[Global|global]] samt entsprechender [[Wochenende, Feiertage und Schulferien#Feiertage mittels holiday-Datei|holiday]]-Dateien&amp;lt;ref&amp;gt;Es kann auch z.B. ein Dummy-Device verwendet werden, dieses sollte dann aber neben dem eigentlichen Feiertags-&#039;&#039;state&#039;&#039; auch in einem Reading &#039;&#039;tomorrow&#039;&#039; Angaben zu anstehenden Feiertagen enthalten.&amp;lt;/ref&amp;gt; &amp;lt;ref&amp;gt;Bitte verfahren Sie entsprechend, wenn Urlaubs- oder Ferientage wie Feiertage behandelt werden sollen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung des Moduls bzw. dessen Funktionalität erfolgt in mehreren Schritten:&lt;br /&gt;
* Definition des ASC-Devices&lt;br /&gt;
* Einstellung zentraler Vorgaben am ASC-Device&lt;br /&gt;
* Markieren der zukünftig zu steuernden Rollladen-Devices&lt;br /&gt;
* Einbinden der Rollladen-Devices in das ASC-Device&lt;br /&gt;
* Einstellen der individuellen Vorgaben je Rollladen (am Rollladen-Device)&lt;br /&gt;
Dabei geht man am einfachsten schrittweise vor und erweitert die Funktionalität nach und nach um die gewünschten Funktionen. Dann benötigt man jeweils nur einen kleinen Teil der vielen per Attribut einstellbaren Optionen, und kann die Auswirkungen der jeweiligen Änderung besser nachvollziehen. &lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
{{Hinweis|ASC kann auch verwendet werden, um lediglich Teilaufgaben der Rollladensteuerung zu erfüllen, also z.B. nur das morgendliche Öffnen der Rollläden. Allerdings geht dabei ein erheblicher Teil des Komforts verloren, der dadurch entsteht, dass die Steuerung innerhalb der vollintegrierten Lösung jeweils nachvollzieht, aus welchem Grund eine Fahrt erfolgt war und dies ggf. bei der nächsten Aktion berücksichtigt.}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung ===&lt;br /&gt;
Zunächst sollten die in den [[#Basics|Basics]] beschriebenen Geräte vorhanden und funktionsfähig sein. &lt;br /&gt;
&lt;br /&gt;
=== Define des ASC-Devices ===&lt;br /&gt;
Es genügt ein einfaches define ohne weitere Parameter.&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Dies bewirkt neben der Anlage des Devices selbst auch, dass als weiteres globales Attribut &#039;&#039;ASC&#039;&#039; verfügbar wird.&lt;br /&gt;
&lt;br /&gt;
=== Einstellung zentraler Vorgaben ===&lt;br /&gt;
Mit Attributen am ASC-Device wird das Verhalten des ASC-Devices eingestellt, z.B. Vermeiden von morgendlichen oder abendlichen Fahrten, Frostschutzfunktion bei Gefahr von festgefrorenen Rollläden oder die Reaktion auf Fensterkontakte. Details sind der Commandref zu entnehmen.&lt;br /&gt;
Diese Attribute können jederzeit geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Auswählen zu steuernder Rollladen-Devices ===&lt;br /&gt;
Für jeden vom ASC-Device kontrollierten Rollladen muss das globale Attribut &#039;&#039;ASC&#039;&#039; gesetzt werden. Das steht nach dem Definieren des ASC-Devices zur Verfügung. Das Attribut ist mit 1 oder 2 festzulegen: &lt;br /&gt;
# Je &#039;&#039;kleiner&#039;&#039; der &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Wert um so weiter ist der Rollladen geschlossen. Typischerweise ist dann 0 &#039;&#039;offen&#039;&#039; und 100 &#039;&#039;geschlossen&#039;&#039;. Dies ist z.B. die  passende Wahl für ROLLO-Devices&lt;br /&gt;
# Je &#039;&#039;größer&#039;&#039; der &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Wert desto weiter ist der Rollladen geschlossen, also &#039;&#039;offen&#039;&#039; für &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; pct 100&amp;lt;/code&amp;gt;. Typische Vertreter dieses Typs sind HomeMatic (CUL_HM-) Geräte oder die Shelly2-Aktoren.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dem Parameter leitet das Modul bestimmte Voreinstellungen (&#039;&#039;defaults&#039;&#039;) für den Rollladen ab. Es genügt daher, nur jeweils die Einstellungen zu verändern, die anders gewünscht werden oder für den Rollladenaktortyp anders sein müssen (z.B. &#039;&#039;dim 99&#039;&#039; für vollständiges Öffnen eines ZWave-Aktors).&lt;br /&gt;
{{Hinweis|Das Vorstehende gilt jeweils für den nicht-invertierten Modus! Wer z.B. ein HomeMatic-Gerät mit &#039;&#039;levelinverse&#039;&#039; betreibt, sollte &#039;&#039;ASC&#039;&#039; auf &amp;quot;1&amp;quot; setzen usw.. Maßgeblich ist letztlich nur die Frage, ob die Offen-Positionsangabe nummerisch kleiner oder größer als die Geschlossen-Positionsangabe ist; die konkreten Zahlenwerte spielen dabei keine Rolle, die Angabe &#039;&#039;position&#039;&#039; oder &#039;&#039;pct&#039;&#039; kann auch später über ein weiteres Attribut passend eingestellt werden.}}&lt;br /&gt;
&lt;br /&gt;
=== Einbinden in das ASC-Device ===&lt;br /&gt;
Nachdem das ASC Attribut für die betreffenden Rollladen-Devices gesetzt ist, muss mit &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; scanForShutters&amp;lt;/code&amp;gt; ein Suchlauf gestartet werden, mit dem diese Rollläden in die Steuerungslogik eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellen der individuellen Vorgaben ===&lt;br /&gt;
Die gefundenen Rollladen-Devices erhalten weitere Attribute, mit denen für den jeweiligen Rollladen benötigte Einstellungen vorgenommen werden. &lt;br /&gt;
Diese Attribute sind in der commandref beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
===Readings im zentralen ASC-Device ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|..._nextAstroTimeEvent || || Zeit wird abhängig von der eingestellten Attribute ASC_Time_Up/ASC_Time_Down angezeigt. Bei &#039;&#039;astro&#039;&#039; die Uhrzeit des  Sonnenauf- oder Sonnenuntergang, bei &#039;&#039;time&#039;&#039; und &#039;&#039;brightness&#039;&#039; die Zeit aus ASC_Time_Up_Early/ASC_Time_Down_Late pro Rollonamen&lt;br /&gt;
|-&lt;br /&gt;
|..._lastPosValue || || Position pro Rollonamen, bevor ASC die Rollläden verfahren hat.&lt;br /&gt;
|-&lt;br /&gt;
|..._PosValue || ||aktuelle Position pro Rollonamen.&lt;br /&gt;
|-&lt;br /&gt;
|ascEnable||on, off ||globale ASC Steuerung bei den Rollläden aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|controlShading||on, off ||globale Beschattungsfunktion aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|hardLockOut || on, off ||Status des hardwareseitigen Aussperrschutzes / gilt nur für Rollläden mit dem Attribut bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist.&lt;br /&gt;
|-&lt;br /&gt;
|selfDefense || on, off ||globale Selbstschutzfunktion aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off || globaler Partymodus aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|state || ||Status des ASC-Devices: active, enabled, disabled oder weitere Statusinformationen wie z.B. Grund der letzen Fahrt.&lt;br /&gt;
|-&lt;br /&gt;
|room_... || ||Auflistung aller Rollläden, welche in den jeweiligen Räumen gefunden wurden, Bsp.: room_Schlafzimmer,Terrasse.&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday|| on,off ||globale Wochenendunterstützung aktiv oder inaktiv.&lt;br /&gt;
|-&lt;br /&gt;
|userAttrList || rolled out ||Das ASC-Modul verteilt an die gesteuerten Rollladen-Geräte diverse Benutzerattribute (userattr). In diesem Reading kann der Status dieser Verteilung geprüft werden.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings in den Rolllädendevices ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Enable ||Status von ASC_Enable (on,off).&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersLastDrive ||Grund der letzten Fahrt des Rollladens.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveDown ||Zeit wird abhängig von der eingestellten Attribute ASC_Time_Down angezeigt. Bei astro die Uhrzeit des Sonnenuntergangs, bei time und brightness die Zeit aus /ASC_Time_Down_Late &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveUp ||Zeit wird abhängig von der eingestellten Attribute ASC_Time_Up angezeigt. Bei astro die Uhrzeit des Sonnenaufgangs, bei time und brightness die Zeit aus /ASC_Time_Up_Early&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==set- und get-Befehle für das ASC-Device==&lt;br /&gt;
=== set-Anweisungen ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Beschreibung  &lt;br /&gt;
|-&lt;br /&gt;
|advDriveDown ||on, off ||Nachholen der durch ASC_Adv on ausgesetzten Fahrten.&lt;br /&gt;
|-&lt;br /&gt;
|ascEnable||on, off ||Aktiviert oder deaktiviert die globale ASC-Steuerung.&lt;br /&gt;
|-&lt;br /&gt;
|controlShading||on, off ||Aktiviert oder deaktiviert die globale Beschattungssteuerung.&lt;br /&gt;
|-&lt;br /&gt;
|createNewNotifyDev || ||Legt die interne Struktur für NOTIFYDEV neu an. (Diese Funktion steht nur zur Verfügung, wenn Attribut ASC_expert auf 1 gesetzt ist.)&lt;br /&gt;
|-&lt;br /&gt;
|hardLockOut ||on, off ||Aktiviert den hardwareseitigen Aussperrschutz für die Rollläden, bei denen das Attributs ASC_LockOut auf hard gesetzt ist. Mehr Informationen in der Beschreibung bei den Attributen für die Rollladengeräten.&lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off ||Aktiviert den globalen Partymodus. Alle Rollladen-Geräten, in welchen das Attribut ASC_Partymode auf on gesetzt ist, werden durch ASC nicht mehr gesteuert. Der letzte Schaltbefehl, der bspw. durch ein Fensterevent oder Wechsel des Bewohnerstatus an die Rollläden gesendet wurde, wird beim Deaktivieren des Partymodus ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|renewAllTimer || ||Erneuert bei allen Rollläden die Zeiten gemäß ASC_UP/ASC_DOWN und setzt die internen Timer neu.&lt;br /&gt;
|-&lt;br /&gt;
|renewTimer || ||Erneuert bei dem ausgewählten Rollladen die Zeiten gemäß ASC_UP/ASC_DOWN und setzt die internen Timer neu.&lt;br /&gt;
|-&lt;br /&gt;
|scanForShutters || ||Sucht alle FHEM Devices mit dem Attribut &#039;&#039;ASC&#039;&#039; &#039;&#039;1&#039;&#039; oder &#039;&#039;2&#039;&#039; und legt diese im ASC-Modul an&lt;br /&gt;
|-&lt;br /&gt;
|selfDefence ||on, off||Aktiviert bzw. deaktiviert die Selbstschutzfunktion. Beispiel 1: Wenn das Residents-Gerät &#039;&#039;gone&#039;&#039; meldet, alle Rollläden dann heruntergefahren.  Beispiel 2 : Wenn das Residents-Gerät &#039;&#039;absent&#039;&#039; meldet, das Attribut ASC_ShuttersPlace=terrace ist und ein Fenster im Haus noch geöffnet ist, so wird an diesem Fenster der Rollladen  dann heruntergefahren.&lt;br /&gt;
|-&lt;br /&gt;
|shutterASCenableToggle ||  ||Aktivieren oder deaktivieren der ASC Kontrolle des einzelnen Rollladens.&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday || on,off ||Aktiviert die Wochenendunterstützung. Dann wird das Attribut ASC_Time_Up_WE_Holiday am Rollladen-Device beachtet.&lt;br /&gt;
|-&lt;br /&gt;
|wiggle ||||Bewegt einen oder mehrere Rollläden um einen definierten Wert (Default: 5%) und nach einer Minute wieder zurück in die Ursprungsposition. Diese Funktion könnte bspw. zur Abschreckung in einem Alarmsystem eingesetzt werden.&lt;br /&gt;
|-&lt;br /&gt;
|||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get-Anweisungen ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| showNotifyDevsInformations ||Zeigt eine Übersicht der abgelegten NOTIFYDEV Struktur. Diese Funktion wird für das Debugging genutzt. Hierzu ist das Attribut ASC_expert = 1 zu setzen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
{{Hinweis|Die Attributnamen haben sich teilweise geändert, nachfolgend ist der Stand von Modulversion v0.8.x wiedergegeben.}}&lt;br /&gt;
{{Hinweis|In der commandref findet sich häufig die Schreibweise &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;ASC_BrightnessSensor Sensorname[:brightness [400:800]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Dabei sind die Angaben in den eckigen Klammern optional. Dies müssen also nicht angegeben werden, stattdessen verwendet das Modul dann Standardwerte (siehe cref), die in der cref zu findenden Angaben entsprechen dabei den defaults. Werden Werte angegeben, sind die eckigen Klammern &#039;&#039;&#039;wegzulassen&#039;&#039;&#039;! Beispiel: &amp;lt;code&amp;gt;ASC_BrightnessSensor hm_motion_1 70:100&amp;lt;/code&amp;gt; würde das brightness-Reading des Sensors hm_motion_1 verwenden und einen morgendlichen Schwellenwert von 70 bzw. 100 für abends.}}&lt;br /&gt;
===Attribute direkt am ASC-Device ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEvening || ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON ||nach welchem ASTRO-Modus soll die Abendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEveningHorizon || - 9 bis 9 || 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeEvening der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorning || ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON || nach welchem ASTRO-Modus soll die Morgendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorningHorizon || - 9 bis 9|| 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeMorning der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlComfort ||on, off || off ||schaltet die Komfortfunktion an. Bedeutet, dass ein Rollladen mit einem threestate-Sensor am Fenster beim Öffnen in eine Offenposition fährt. Hierzu muss beim Rollladen das Attribut ASC_ComfortOpen_Pos entsprechend konfiguriert sein. &lt;br /&gt;
|- &lt;br /&gt;
|ASC_autoShuttersControlEvening ||on, off || ||Aktiviert die automatische Steuerung durch das ASC-Modul am Abend.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlMorning ||on, off || ||Aktiviert die automatische Steuerung durch das ASC-Modul am Morgen.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_blockASCDrivesAfterManual ||0, 1 || ||wenn dieser Wert auf 1 gesetzt ist, dann werden Rollläden vom ASC-Modul nicht mehr gesteuert, wenn zuvor manuell eingegriffen wurde. Voraussetzung hierfür ist jedoch, dass im Reading ASC_ShuttersLastDrive der Status manual enthalten ist und sich der Rollladen auf eine unbekannte (nicht in den Attributen anderweitig konfigurierte) Position befindet.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_brightnessDriveUpDown || || || Werte (z.B. Lux) bei dem Schaltbedingungen für Sonnenauf- und -untergang geprüft werden sollen. Diese globale Einstellung kann durch die WERT-MORGENS:WERT-ABENDS Einstellung von ASC_BrightnessSensor im Rollladen selbst überschrieben werden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_debug ||0, 1 || 0||Aktiviert die erweiterte Logausgabe für Debugausgaben (nur nach Aufforderung nutzen) &lt;br /&gt;
|-&lt;br /&gt;
|ASC_expert ||0, 1 ||0 ||ist der Wert 1, so werden erweiterte Informationen bezüglich des NotifyDevs unter &#039;&#039;set und get&#039;&#039; angezeigt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_freezeTemp ||-5 bis 5 || ||Temperatur, ab welcher der Frostschutz greifen soll und der Rollladen nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_rainSensor || || ||DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS] - der Inhalt ist eine Kombination aus Devicename, Readingname, Wert ab dem getriggert werden soll, Hysterese Wert ab dem der Status Regenschutz aufgehoben werden soll und der &amp;quot;wegen Regen geschlossen Position&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|ASC_residentsDev  || || ||DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Devicenamen und Readingnamen des Residents-Device der obersten Ebene (z.B. rgr_Residents:state)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_shuttersDriveDelay  || || ||maximale Zufallsverzögerung in Sekunden bei der Berechnung der Fahrzeiten. 0 bedeutet keine Verzögerung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_tempSensor || || ||DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Device und Reading für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_twilightDevice || || ||das Device, welches die Informationen zum Sonnenstand liefert. Wird unter anderem für die Beschattung verwendet.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_windSensor || || ||DEVICE[:READING] - Sensor für die Windgeschwindigkeit. Kombination aus Device und Reading.&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Attribute in den Rolllädendevices===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC || 0, 1, 2|| ||&amp;quot;kein Anlegen der Attribute beim ersten Scan bzw. keine Beachtung eines Fahrbefehles&amp;quot;,1 = &amp;quot;Inverse oder Rollo - Bsp.: Rollo oben 0, Rollo unten 100 und der Befehl zum prozentualen Fahren ist position&amp;quot;,2 = &amp;quot;Homematic Style - Bsp.: Rollo oben 100, Rollo unten 0 und der Befehl zum prozentualen Fahren ist pct&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Adv || on, off||||bei on wird das runterfahren des Rollos während der Weihnachtszeit (1. Advent bis 6. Januar) ausgesetzt! Durch set &amp;lt;ASCDEVICE&amp;gt; advDriveDown werden alle ausgesetzten Fahrten nachgeholt.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze ||off, soft, hard, am, pm || ||Frostschutz, wenn soft fährt der Rollladen in die ASC_Antifreeze_Pos, bei hard/am/pm wird gar nicht oder innerhalb der entsprechenden Tageszeit nicht gefahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze_Pos || || ||Position des Rolllades die angefahren werden soll, wenn der Fahrbefehl komplett schließen lautet, aber der Frostschutz aktiv ist  !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEvening ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON || ||nach welchem ASTRO-Modus soll die Abendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEveningHorizon || - 9 bis 9 || 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeEvening der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorning ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON || || nach welchem ASTRO-Modus soll die Morgendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorningHorizon || - 9 bis 9|| 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeMorning der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_afterManual || ||1200 ||wie viel Sekunden soll die Automatik nach einer manuellen Fahrt aussetzen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforeDayOpen || ||3600 ||wie viel Sekunden vor dem morgendlichen öffnen soll keine schließen Fahrt mehr stattfinden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforeNightClose || ||3600 ||ie viel Sekunden vor dem nächtlichen schließen soll keine öffnen Fahrt mehr stattfinden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BrightnessSensor || ||none ||DEVICE[:READING] WERT-MORGENS:WERT-ABENDS / &#039;Sensorname[:brightness [400:800]]&#039; Angaben zum Helligkeitssensor mit (Readingname, optional) für die Beschattung und dem Fahren der Rollladen nach brightness und den optionalen Brightnesswerten für Sonnenauf- und Sonnenuntergang &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Closed_Pos || ||default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;||in 10er-Schritten von 0 bis 100 &lt;br /&gt;
wird angefahren wenn SelfDefense aktiv ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ComfortOpen_Pos || || || in 10er Schritten von 0 bis 100 !!! Die eingestellte Position wird bei einem threestate Sensor angefahren. Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Down || time, astro, brightness, roommate || astro||bei &#039;&#039;astro&#039;&#039; wird Sonnenuntergang berechnet, bei time wird der Wert aus ASC_Time_Down_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Down_Early und ASC_Time_Down_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Down_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Down_Early und ASC_Time_Down_Late geschaut, ob die als Attribut im Moduldevice hinterlegte ASC_brightnessDriveUpDown der Down Wert erreicht wurde. Wenn ja, wird der Rollladen runter gefahren.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_DiveUpMaxDuration || || 60||die Dauer des Hochfahrens des Rollladens plus 5 Sekunden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Drive_Delay || || -1|| maximaler Wert für einen zufällig ermittelte Verzögerungswert in Sekunden bei der Berechnung der Fahrzeiten, 0 bedeutet keine Verzögerung, -1 bedeutet, dass das ??gleichwertige Attribut?? aus dem ASC Device ausgewertet werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Drive_DelayStart || || -1|| in Sekunden verzögerter Wert ab welchen dann erst das Offset startet und dazu addiert wird. Funktioniert nur wenn gleichzeitig ASC_DriveDelay gesetzt wird.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ExternalTrigger || |||| DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE, Beispiel: &amp;quot;WohnzimmerTV:state on:off 66:100&amp;quot; bedeutet das wenn ein &amp;quot;state:on&amp;quot; Event kommt soll das Rollo in Position 66 fahren, kommt ein &amp;quot;state:off&amp;quot; Event soll es in Position 100 fahren. Es ist möglich die POSINACTIVE weg zu lassen dann fährt das Rollo in LastStatus Position.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_GuestRoom || on, off |||| aktuell noch nicht umgesetzt...&lt;br /&gt;
|-&lt;br /&gt;
|ASC_LockOut || soft, hard, off ||off || stellt entsprechend den Aussperrschutz ein. Bei global aktivem Aussperrschutz (set ASC-Device lockOut soft) und einem Fensterkontakt open bleibt dann der Rollladen oben. Dies gilt nur bei Steuerbefehlen über das ASC Modul. Stellt man global auf hard, wird bei entsprechender Möglichkeit versucht den Rollladen hardwareseitig zu blockieren. Dann ist auch ein Fahren über die Taster nicht mehr möglich&lt;br /&gt;
|-&lt;br /&gt;
|ASC_LockOut_Cmd || inhibit, blocked, protection ||none|| set Befehl für das Rollladen-Device zum Hardware sperren. Dieser Befehl wird gesetzt werden, wenn man &amp;quot;ASC_LockOut&amp;quot; auf hard setzt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Down ||absent, always, off, home || always ||Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Up ||absent, always, off, home || always ||Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Open_Pos || ||default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;||in 10er-Schritten von 0 bis 100&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Partymode || on, off || off ||schaltet den Partymodus an oder aus. Wird am ASC Device set ASC-DEVICE partyMode on geschalten, werden alle Fahrbefehle an den Rollläden, welche das Attribut auf on haben, zwischengespeichert und später erst ausgeführ&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Pos_Reading || || ||Name des Readings, welches die Position des Rollladen in Prozent angibt. Wird bei unbekannten Device-Typen auch als &#039;&#039;set&#039;&#039; Befehl zum Fahren verwendet&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDownValue_beforNightClose || || -1||wie viele Sekunden vor dem abendlichen schließen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:300 bedeutet 30 min vor night close oder bei unter einem Brightnesswert von 300&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDown_Pos || ||50||Position den Rollladens für den abendlichen Sichtschutz!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyUpValue_beforDay || || -1||wie viele Sekunden vor dem morgendlichen öffnen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:600 bedeutet 30 min vor day open oder bei über einem Brightnesswert von 600&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyUp_Pos || ||50||Position den Rollladens für den morgendlichen Sichtschutz!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_RainProtection ||on, off || ||soll der Rollladen beim Regenschutz beachtet werden. on=JA, off=NEIN.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Device || || none ||mit Komma getrennte Namen des/der Roommate-Device/s welche den/die Bewohner des Rollladen-Raumes wiedergibt. Macht nur Sinn in Schlaf- oder Kinderzimmern&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Reading || || ||Reading des Roommate-Device, welches den Status wieder gibt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Self_Defense_AbsentDelay || || 300||um wie viele Sekunden soll das fahren in Selfdefense bei Residents absent verzögert werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Self_Defense_Mode || || gone||ab welchen Residents Status soll Selfdefense aktiv werden ohne das Fenster auf sind&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_InOutAzimuth || ||95:265 ||Azimut Wert ab dem bei Überschreiten Beschattet und bei Unterschreiten Endschattet werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_MinMax_Elevation || ||25.0:100.0 ||ab welcher min Höhe des Sonnenstandes soll beschattet und ab welcher max Höhe wieder beendet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_MinOutsideTemperature_ || ||18 ||ab welcher Temperatur soll Beschattet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwert&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShadingMode ||absent, always, off, home || off||wann soll die Beschattung nur stattfinden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Pos || || ||Position des Rollladens für die Beschattung !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_StateChange_SunnyCloudy || ||35000:20000 ||Brightness Wert ab welchen die Beschattung stattfinden und aufgehoben werden soll, immer in Abhängigkeit der anderen einbezogenen Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_WaitingPeriod || ||1200 ||wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung stattfinden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shutter_IdleDetection || ||||READING:VALUE gibt das Reading an welches Auskunft über den Fahrstatus des Rollos gibt, sowie als zweites den Wert im Reading welcher aus sagt das das Rollo nicht fährt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersPlace || window, terrace || ||wenn dieses Attribut auf &#039;&#039;terrace&#039;&#039; gesetzt ist und das Residents-Device in den Status &#039;&#039;absent&#039;&#039; geht, &#039;&#039;selfDefence&#039;&#039; aktiv ist und das Fenster geöffnet ist, wird das Rollo  geschlossen. Wenn ein twostate Senso genutzt wird und dieses Attribut auf &#039;&#039;terrace&#039;&#039; gesetzt ist wird ASC_Ventilate_Pos ignoriert und das Rollo wird beim öffnen des Fenster komplett geöffnet. Wenn dieses Attribut auf &#039;&#039;window&#039;&#039; gesetzt ist wird ASC_Ventilate_Pos berücksichtigt und das Rollo wird entsprechend der ASC_Ventilate_Pos geöffnet. Wenn das Fenster wieder geschlossen wird, dann wird das Rollo unabhängig von &#039;&#039;windows oder terrace&#039;&#039; vollständig geschlossen.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Sleep_Pos || || ||in 10er-Schritten von 0 bis 100, default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC.&#039;&#039; Position wird angefahren wenn Bedingung für modeDown aktiv ist. Hiermit kann z.B. das komplette abendliche Schließen des Rollos begrenzt werden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_TempSensor || || ||DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Device und Reading für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Early || ||16:00 ||Sonnenuntergang frühste Zeit zum Runterfahren !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Late || ||22:00 ||Sonnenuntergang späteste Zeit zum Runterfahren !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Early || || 05:00||Sonnenaufgang frühste Zeit zum Hochfahren !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Late || ||08:30 ||Sonnenaufgang späteste Zeit zum Hochfahren  !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_WE_Holiday || ||08:00 ||Sonnenaufgang frühste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet).ACHTUNG!!! in Verbindung mit Brightness für ASC_Up muss die Uhrzeit kleiner sein wie die Uhrzeit aus ASC_Time_Up_Late !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!! &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Ventilate_Window_Open ||on, off ||on||auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WiggleValue || ||5 ||Wert, um welchen sich die Position des Rollladens bei &#039;&#039;Wiggle&#039;&#039; ändern soll &lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindParameters || ||5 ||TRIGGERMAX[:HYSTERESE] [DRIVEPOSITION] / Angabe von Max Wert ab dem für Wind getriggert werden soll, Hytsrese Wert ab dem der Windschutz aufgehoben werden soll TRIGGERMAX - HYSTERESE / Ist es bei einigen Rollläden nicht gewünscht das gefahren werden soll, so ist der TRIGGERMAX Wert mit -1 an zu geben. (default: &#039;50:20 ClosedPosition&#039;)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindProtection ||on, off || ||soll der Rollladen beim Windschutz beachtet werden. on=JA, off=NEIN.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec || ||none ||Name des Fensterkontakts, an welchen Fenster der Rollladen angebracht ist. WINDOWREC:[READING], Name des Fensterkontaktes, an dessen Fenster der Rollladen angebracht ist. Reading ist optional&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec_PosAfterDayClosed ||open, lastManual ||open ||Name des Fensterkontakts, an welchen Fenster der Rollladen angebracht ist. Sein Reading &#039;&#039;state&#039;&#039; muss die Werte &#039;&#039;open&#039;&#039;, &#039;&#039;closed&#039;&#039; oder &#039;&#039;tilted&#039;&#039; enthalten.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec_subType ||twostate, threestate ||twostate||Typ des verwendeten Fensterkontaktes: twostate (optisch oder magnetisch) oder threestate (Drehgriffkontakt)&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||    &lt;br /&gt;
|-  &lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||        &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hilfsmittel ==&lt;br /&gt;
{{Hinweis|Die Device-Namen sind auf die eigene Installation anzupassen.}}&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Codezeilen sind im [[Import von Code Snippets|RAW]]-Format.}}&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText= Stand 2019-05-03&lt;br /&gt;
* Erfolgreich getestet mit Homematic Devices, Beta-User&lt;br /&gt;
* Die Farbgebung entspricht dem Standard, wenn unter dem Style f18 der Farbpreset &#039;&#039;light&#039;&#039; gewählt wird.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Level ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Schliessen bis&amp;gt;,&amp;lt;Öffnen auf&amp;gt;,&amp;lt;Beschattung&amp;gt;,&amp;lt;Komfort&amp;gt;,&amp;lt;Lüften&amp;gt;,&amp;lt;Privacy&amp;gt; (Rollladen_.*|Jalousie_.*)..:level,!?ASC_Closed_Pos,!?ASC_Open_Pos,!?ASC_Shading_Pos,!?ASC_ComfortOpen_Pos,!?ASC_Ventilate_Pos,!?ASC_PrivacyDown_Pos&lt;br /&gt;
attr rg_ASC_Rolllaeden_Level commands {level =&amp;gt; &#039;pct:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_ComfortOpen_Pos =&amp;gt; &#039;ASC_ComfortOpen_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_PrivacyDown_Pos =&amp;gt; &#039;ASC_PrivacyDown_Pos:selectnumbers,0,5,100,0,lin&#039;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Zeiten ===&lt;br /&gt;
[[Bild:ReadingsGroup ASC times.png|thumb|right|ReadingsGroup - Zeitenbeispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Position&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Up_WE/Hol&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt; \&lt;br /&gt;
 (.*Rollo.*|.*Rollladen|Jalousie_.*):level,!?ASC_Time_Up_Early,!?ASC_Time_Up_Late,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times commands {level =&amp;gt; &#039;pct:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100&#039;, \&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, \&lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;, \&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,\&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:55,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,  \&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt; &#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;, \&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;, \&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039; }&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times room Rollladen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC RG Zeiten HM ZWave Siro.png|thumb|right|ReadingsGroup - CUL_HM+ZWave+Siro mit widgets]]Neue Version mit time-Widgets und pct/dim/position-widget (5-er Schritte), passend für CUL_HM, ZWave und Siro-Geräte:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Time_Up_Early  &amp;gt;,&amp;lt;Time_Up_WE  &amp;gt;,&amp;lt;Time_Up_Late  &amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt; (Rollo_.*|Jalousie_.*)..:(level|dim|position),!?ASC_Time_Up_Early,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Up_Late,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times commands {level =&amp;gt; &#039;pct:selectnumbers,0,5,100,0,lin&#039;, \&lt;br /&gt;
dim =&amp;gt; &#039;dim:selectnumbers,0,5,99,0,lin&#039;,\&lt;br /&gt;
position =&amp;gt; &#039;pct:selectnumbers,0,5,99,0,lin&#039;,\&lt;br /&gt;
ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;,\&lt;br /&gt;
ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039;,\&lt;br /&gt;
ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:time&#039;, \&lt;br /&gt;
ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:time&#039;,\&lt;br /&gt;
ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:time&#039;, \&lt;br /&gt;
ASC_Time_Up_Late =&amp;gt;&#039;ASC_Time_Up_Late:time&#039;,\&lt;br /&gt;
ASC_Time_Up_WE_Holiday =&amp;gt;&#039;ASC_Time_Up_WE_Holiday:time&#039;}&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times room Rollladen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  readingsGroup für die Beschattung ===&lt;br /&gt;
[[Bild:ReadingsGroup ASC shading.png|thumb|right|ReadingsGroup - Beschattungsbeispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;&lt;br /&gt;
defmod RG_test readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;InAzi&amp;gt;,&amp;lt;OutAzi&amp;gt;,&amp;lt;MinEle&amp;gt;,&amp;lt;MaxEle&amp;gt;,&amp;lt;Sunny&amp;gt;,&amp;lt;Cloudy&amp;gt;\&lt;br /&gt;
(Rollo|Jalousie)_.*..:&amp;lt;{ascAPIget(&#039;ShadingAzimuthLeft&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingAzimuthRight&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingMinElevation&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingMaxElevation&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingStateChangeSunny&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingStateChangeCloudy&#039;,$DEVICE)}&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  readingsGroup für FIBARO Roller Shutter FGR-222 Devices ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Getestet von majestro84, Stand 2019-01-28.&lt;br /&gt;
* {{Link2Forum|Topic=92628|Message=897099|LinkText=Forenbeitrag dazu}}&lt;br /&gt;
* Die Farbgebung entspricht dem Standard, wenn unter dem Style f18 der Farbpreset &#039;&#039;dark&#039;&#039; gewählt wird}}&lt;br /&gt;
[[Bild:ASC Jalousien Times.JPG|thumb|right|Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt;define ASC_Jalousien_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_WE&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt;,&amp;lt;PartyMode&amp;gt;,&amp;lt;LockOut&amp;gt; (.*_Jalousie.*):position,!?ASC_Time_Up_Early,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Up_Late,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up,!?ASC_Partymode,!?ASC_LockOut&lt;br /&gt;
&lt;br /&gt;
 attr ASC_Jalousien_Times commands {position =&amp;gt; &#039;dim:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;,&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039;,&lt;br /&gt;
 ASC_Partymode =&amp;gt; &#039;ASC_Partymode:on,off&#039;,&lt;br /&gt;
 ASC_LockOut =&amp;gt; &#039;ASC_LockOut:soft,hard,off&#039;,&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, &lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;,&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:45,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt;&#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;}&lt;br /&gt;
 attr ASC_Jalousien_Times room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC Jalousien Level.JPG|thumb|right|Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt; define Jalousien_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Closed_Pos&amp;gt;,&amp;lt;Open_Pos&amp;gt;,&amp;lt;Comfort_Pos&amp;gt;,&amp;lt;Ventilate_Pos&amp;gt;,&amp;lt;PrivacyDown_Pos&amp;gt;,&amp;lt;Shading_Pos&amp;gt; (.*_Jalousie.*):!?ASC_Closed_Pos,!?ASC_Open_Pos,!?ASC_ComfortOpen_Pos,!?ASC_Ventilate_Pos,!?ASC_PrivacyDown_Pos,!?ASC_Shading_Pos&lt;br /&gt;
 attr Jalousien_Level commands { ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_ComfortOpen_Pos =&amp;gt; &#039;ASC_ComfortOpen_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_PrivacyDown_Pos =&amp;gt; &#039;ASC_PrivacyDown_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;}&lt;br /&gt;
 attr Jalousien_Level room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einrichtungsbeispiel (nach Sonnenstand) ==&lt;br /&gt;
=== Ziel und Vorgaben ===&lt;br /&gt;
Es sollen die Rollläden und Jalousien innerhalb bestimmter zeitlicher Perioden sonnenstandsabhängig geöffnet und geschlossen werden. An den Wochenenden und an Ferientagen soll etwas später geöffnet werden. Es sind Tür- und Fensterkontakte vorhanden (Türkontakte: twoState, Fensterkontakte: threeState), wobei bei jeder Öffnung ein eventuell geschlossener Rollladen geöffnet werden soll. Bei allen Rollladenaktoren, Tür- und Fensterkontakten handelt es sich um CUL_HM-Geräte.&lt;br /&gt;
&lt;br /&gt;
=== Vorarbeiten ===&lt;br /&gt;
Im global-Device sind Angaben zu latitude und longitude vorhanden, holiday2we wie folgt&amp;lt;ref&amp;gt;&#039;&#039;ferien&#039;&#039; ist eine automatisiert erstellte holiday-Datei nach diesem {{Link2Forum|Topic=85759|Message=885883|LinkText=Foren-Beitrag}}.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr global holiday2we bw,ferien&lt;br /&gt;
Weitere Angaben werden zunächst nicht benötigt, das Astro-Device wird erst in der Beschattungskonfiguration definiert. &lt;br /&gt;
Dann erfolgt das &#039;&#039;Define des ASC-Devices&#039;&#039; wie oben beschrieben:&lt;br /&gt;
&amp;lt;code&amp;gt;define Rollladenautomatik AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Folgen die einzubindenden Rollladenaktoren einem einheitlichen Namensschema, können diese sodann z.B. mit &lt;br /&gt;
 attr (Jalousie|Rollladen)_.* ASC 2&lt;br /&gt;
auf einen Rutsch mit dem passenden ASC-Typ gekennzeichnet werden.  &lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Achtung: Das AutoShuttersControl-Device selbst darf kein ASC-Attribut bekommen!}}&lt;br /&gt;
&lt;br /&gt;
Dann werden mit &lt;br /&gt;
 set Rollladenautomatik scanForShutters&lt;br /&gt;
die nachfolgend weiter zu bearbeitenden Attribute angelegt.&lt;br /&gt;
=== Schließen morgens und abends ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Alternative: Fahren nach brightness:&lt;br /&gt;
Soll insgesamt oder an einzelnen Rollläden helligkeitsgesteuert gefahren werden, muß zentral oder für jeden Rollladen ein Helligkeitssensor definiert und die Helligkeitsgrenzwerte festgelegt sein (&#039;&#039;ASC_BrightnessSensor&#039;&#039; etc.), bei deren Überschreitung geöffnet bzw. Unterschreitung geschlossen werden soll.}}&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Sonnenstandsabhängige Fahrzeiten werden wie folgt aktiviert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeEvening CIVIL&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeMorning CIVIL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aus der Angabe &#039;&#039;CIVIL&#039;&#039; und den Vorgaben in den einzelnen Rollladen wird dabei mit Hilfe von [[SUNRISE_EL]] die effektive Fahrzeit berechnet, dort finden sich auch weitere Hinweise, zu den meisten anderen Optionen für die ersten beiden Attribute.&lt;br /&gt;
Bei allen Fensteröffnungen soll auf eine Lüften-Position gefahren werden, also schalten wir diese Funktion ebenfalls zentral an&amp;lt;ref&amp;gt;Sonst wird bei threeState-Sensoren nur bei &#039;&#039;tilted&#039;&#039; auf die in &#039;&#039;ASC_Ventilate_Pos&#039;&#039; gefahren.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr Rollladenautomatik ASC_autoShuttersControlComfort on &lt;br /&gt;
Zuletzt legen wir noch einen Temperatur-Sensor fest. Dieser wird beim Frostschutz sowie bei der Beschattung berücksichtigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_tempSensor Aussentemperatur_Nord:temperature&lt;br /&gt;
attr Rollladenautomatik ASC_freezeTemp 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{Hinweis|Achtung: Für jede weitere Sensor-Information (z.B. zu Regen oder Wind) muß ein eigenes Device verwendet werden. Sollen unterschiedliche Readings desselben Sensors ausgewertet werden, müssen diese in ein eigenes Device übertragen werden, z.B. über einen readingsProxy mit gesetztem event-on-update-reading-Attribut (sonst triggert dieser nicht bei Aktualisierung des Readings)!}} &lt;br /&gt;
&lt;br /&gt;
tbd: &lt;br /&gt;
* Rain&lt;br /&gt;
* Wind&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
{{Hinweis|Positionen dürfen sich innerhalb eines Rollos nicht überschneiden - Auch ASC_Closed_Pos 100 ASC_Shading_Pos 98 ASC_ComfortOpen_Pos 97 usw... sind bereits unterschiedliche Positionen.}}&lt;br /&gt;
&lt;br /&gt;
===== Fahrzeiten =====&lt;br /&gt;
Zur Konfiguration der Fahrzeiten bietet es sich an, eine ReadingsGroup zu nutzen, wie unter [[#Hilfsmittel|Hilfsmittel]] dargestellt. Alternativ kann man die Zeiten auch manuell in den einzelnen Rollläden hinterlegen.&lt;br /&gt;
===== Bewohner =====&lt;br /&gt;
Wird ein Raum von einer oder mehreren bestimmten Person/en bewohnt oder gibt es ein Sammel-Gerät für mehrere Bewohner, kann dies mit den Attributen &#039;&#039;ASC_Roommate_Device&#039;&#039; und &#039;&#039;ASC_Roommate_Reading&#039;&#039; einem Rollladen zugeordnet werden. Ist einer der Bewohner &#039;&#039;asleep&#039;&#039;, wird morgens erst geöffnet, wenn auch der letzte Roommate nicht mehr &#039;&#039;asleep&#039;&#039; ist.&lt;br /&gt;
===== Fensterkontakte  =====&lt;br /&gt;
Dann werden ggf. vorhandene Fensterkontakte mit &#039;&#039;ASC_WindowRec&#039;&#039; zugeordnet und der Sensortyp mit &#039;&#039;ASC_WindowRec_subType&#039;&#039; festgelegt. Im Falle von threeState-Sensoren wird das übergreifende &#039;&#039;ASC_autoShuttersControlComfort&#039;&#039; beachtet, wobei dann bei vollständiger Öffnung des Fensters auf den in &#039;&#039;ASC_ComfortOpen_Pos&#039;&#039; festgelegten Wert gefahren wird.&lt;br /&gt;
===== Frostschutz =====&lt;br /&gt;
Zuletzt können die Attribute &#039;&#039;ASC_Antifreeze&#039;&#039; und &#039;&#039;ASC_Antifreeze_Pos&#039;&#039; festgelegt werden, wenn die Frostschutzfunktion aktiviert werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Beschattung ===&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Im ASC DEVICE das Reading &amp;quot;controlShading&amp;quot; auf &#039;&#039;on&#039;&#039;, sowie ein Astro/Twilight Device im Attribut &amp;quot;ASC_twilightDevice&amp;quot; und das Attribut &amp;quot;ASC_tempSensor&amp;quot; definieren.&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
Es wird ein Helligkeitssensor als Attribut &amp;quot;ASC_BrightnessSensor&amp;quot; benötigt. Wird der Sensor nur für die Beschattung verwendet, ist der Wert DEVICENAME[:READING] ausreichend.&lt;br /&gt;
Alle weiteren Attribute sind optional und wenn nicht gesetzt mit Default-Werten belegt. Sie sollten entsprechend der Gegebenheiten angepasst werden. Die Werte für die Fensterposition und den Vor-/Nachlaufwinkel &#039;&#039;(ASC_Shading_InOutAzimuth)&#039;&#039; sowie die Grenzwerte für &amp;lt;code&amp;gt;&#039;&#039;ASC_shading_StateChange_SunnyCloudy&#039;&#039;&amp;lt;/code&amp;gt; sind besonders wichtig. &lt;br /&gt;
&lt;br /&gt;
==== Bedingungen ====&lt;br /&gt;
Damit die Beschattung startet müssen &#039;&#039;&#039;alle&#039;&#039;&#039; Bedingungen erfüllt sein. Entschattet wird, sobald &#039;&#039;&#039;eine&#039;&#039;&#039; der Bedingungen wegfällt und die Zeit entsprechend &amp;lt;code&amp;gt;ASC_Shading_WaitingPeriod&amp;lt;/code&amp;gt; abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
Der Sonnensensor &amp;lt;ASC_BrightnessSensor&amp;gt; muss mindestens zwei Messwerte geliefert haben, bevor das ASC-Modul in die Beschattungsposition fährt! Beim (zeitlich) ersten Messwert wird der Zustand &#039;&#039;in-reserved&#039;&#039; gesetzt. Erst beim zweiten Messwert wechselt der Zustand nach &#039;&#039;in shading&#039;&#039;. Die Anzahl der berücksichtigten Messwerte ist abhängig vom &amp;quot;moving average window&amp;quot;, der mit dem dritten Parameter des Attributs &#039;&#039;ASC_Shading_StateChange_SunnyCloudy&#039;&#039; konfiguriert wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Von Standardwerten ausgehend ist nachfolgender Ablauf angestrebt:&#039;&#039;&#039;&lt;br /&gt;
# Ein Event vom Astro oder Helligkeits Device kommt -&amp;gt; sind alle Werte innerhalb des Arbeitsbereiches, ändert sich der ASC Info-Zustand im Rollo von xx auf „in reserved“ (Beschattung vorbereitet)&lt;br /&gt;
# Ein erneutes Event vom Astro oder Helligkeits Device kommt -&amp;gt; Überprüfung der Werte -&amp;gt; sind diese weiterhin gegeben folgt der Wechsel von „in reserved“ auf „in“ (Beschattung aktiv)&lt;br /&gt;
# Bei Verwendung von &#039;&#039;ASC_Shading_StateChange_SunnyCloudy&#039;&#039; ist zu beachten, dass ein Durchschnitt über die letzten drei Brightness Events gerechnet wird. Möchte man das vermeiden muss man SUNNY:CLOUDY 1[2] setzen. &lt;br /&gt;
# Die Zeiten &#039;&#039;ASC_Shading_WaitingPeriod&#039;&#039; und &#039;&#039;ASC_BlockingTime_afterManual&#039;&#039; können hier zusätzlich für eine Verzögerung sorgen. &lt;br /&gt;
&#039;&#039;&#039;Wichtig zu beachten:&#039;&#039;&#039; Es müssen immer mehrere (mind. 2) Events für den Betrieb erfolgen. In den Standardeinstellungen vom Astro Modul erfolgt dieses z.B. nur 1 x pro Stunde. Kommt also ein Helligkeits-Event auch nur 1x pro Stunde, könnte es 2 Std dauern, bis die Beschattungsfunltion greift. &lt;br /&gt;
&lt;br /&gt;
Wenn das Rollo einmal aus der Beschattung manuell (im Rollo Device muss bei &#039;&#039;ASC_ShuttersLastDrive manuel&#039;&#039; stehen gefahren wurde wird das Rollo erst wieder nach einer Entschattung und erneuter Beschattung gefahren. Also es muss einmal shading out kommen und beim nächsten shading in fährt er dann wieder.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Funktionen ===&lt;br /&gt;
==== WeekendHoliday Funktion im Brightnessbetrieb ====&lt;br /&gt;
Am Wochenende oder Feiertag und wenn am ASC-Device sunriseTimeWeHoliday aktiviert sowie im Rollo das Attribut ASC_Time_Up_WE_Holiday gesetzt sind, wird zur angegebenen ASC_Time_Up_WE_Holiday Zeit das Rollo geöffnet, ungeachtet des Brightnesswertes.&lt;br /&gt;
&lt;br /&gt;
==== Privacy ====&lt;br /&gt;
Werden hierfür Werte festgelegt, werden die betreffenden Rollläden die festgelegte Zeit/Helligkeit vor dem abendlichen Schließen vorab teilweise geschlossen. Dies kann z.B. gewünscht sein, um Rollläden zur Straße hin mit viel Fußgängerverkehr zwar nicht vollständig abzudunkeln, aber gleichzeitig zu verhindern, dass von außen in Wohnräume geschaut werden kann, sobald dort das Licht angeschaltet wird&lt;br /&gt;
&lt;br /&gt;
==== BlockingTime====&lt;br /&gt;
Bewirkt, dass nach einer manuellen Fahrt, eine vom ASC Modul initiierte Fahrt zunächst ausgesetzt wird, bis die im Attribute angegebene Zeit überschritten ist. Erst dann wird eine vom ASC Modul initiierte Fahrt tatsächlich durchgeführt.&lt;br /&gt;
Genau so wird ein Hochfahren eines Rollos durch das ASC Modul nicht mehr ausgeführt, wenn es innerhalb der Zeit von ASC_BlockingTime_beforNightClose und das Runterfahren wird nicht mehr erfolgen, wenn es innerhalb von ASC_BlockingTime_beforDayOpen ist.&lt;br /&gt;
Beispiel: Meine Tochter geht früh außer Haus und Ihre Rollos sind nicht hochgefahren. Diese fahren auch nicht mehr hoch, da die ausschließlich bei home (anwesend) fahren sollen. Nun kommt sie am Nachmittag um 16:23 Uhr nach Hause. Eigentlich sollten nun die Rollos fahren. Doch die Sonnenuntergangsfahrt (schließen) wäre schon 16:51 Uhr und damit innerhalb der 3600 ASC_BlockingTime_beforNightClose. Die Rollos bleiben also unten. Es lohnt sich für die paar Minuten einfach nicht mehr.&lt;br /&gt;
&lt;br /&gt;
==== wiggle====&lt;br /&gt;
Mit einem &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; wiggle&amp;lt;/code&amp;gt; können alle Rollladen mit einem entsprechenden Attribut zu einer kurzen Fahrt veranlasst werden, nach Ablauf von einer Minute wieder um denselben Wert zurück. Dabei wird jeweils in die Richtung gefahren, die den weiteren Weg ermöglicht. Wenn also zu 70% geschlossen ist, wird der Rollladen hoch fahren.&lt;br /&gt;
==== Partymode ====&lt;br /&gt;
Dieser wird am ASC-Device selbst aktiviert mittels &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; partyMode on&amp;lt;/code&amp;gt;. Alle Rollladen-Devices, welche das Attribut &#039;&#039;ASC_Partymode&#039;&#039; auf &#039;&#039;on&#039;&#039; gestellt haben, werden nicht mehr gesteuert. Der letzte Schaltbefehl, der durch ein Fensterevent oder Bewohnerstatus an die Rollläden gesendet wurde, beim Beenden des Modus durch &amp;lt;code&amp;gt;set ASC-Device partyMode off&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
==== lock-out ====&lt;br /&gt;
Man kann mit dem Befehl &amp;lt;code&amp;gt; set &amp;lt;ASC-Device&amp;gt; hardLockOut&amp;lt;/code&amp;gt; auf einen Schlag alle Rollos sperren welche &amp;lt;code&amp;gt; attr &amp;lt;ROLLO-Device&amp;gt; ASC_LockOut hard&amp;lt;/code&amp;gt; gesetzt haben.&lt;br /&gt;
Das ist dafür gedacht, wenn Du eine gewisse Zeit den Rolloaktor sperren willst. Zum Beispiel das die Kinder nicht schalten sollen.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Hinweise und Problemlösungen ==&lt;br /&gt;
* Werden Attribute geändert, kann es vereinzelt vorkommen, dass das ASC-Modul dies nicht mitbekommt und das tatsächliche Verhalten nicht den Erwartungen entspricht. In so einem Fall empfielt es sich, das NOTIFYDEV nochmals aufbauen zu lassen. Dazu werden zunächst mit &amp;lt;code&amp;gt;set &amp;lt;ASC-Modul&amp;gt; expert 1&amp;lt;/code&amp;gt; erweiterte Informationen bezüglich des NotifyDevs unter set und get aktiviert und anschließend ein &amp;lt;code&amp;gt;set &amp;lt;ASC-Modul&amp;gt; createNewNotifyDev&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
&lt;br /&gt;
* Hin und wieder berichten Nutzer davon, wenn Sie die &#039;&#039;Privacy Funktion&#039;&#039; nutzen, dass sich im NOTIFYDEV anstelle des Device Namen ein Raumname befindet. Diese Problem kann damit gelöst werden, dass in dem betroffenen &#039;&#039;&#039;Rollo Device&#039;&#039;&#039; das Atribut  &amp;lt;code&amp;gt;attr event-on-change .*&amp;lt;/code&amp;gt; gesetzt wird.&lt;br /&gt;
&#039;&#039;&#039;Wichtig!&#039;&#039;&#039; Nicht verwechseln mit dem ASC Device dort darf &amp;lt;code&amp;gt;attr event-on-change&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; gesetzt sein!&lt;br /&gt;
* Wenn mehrere Rollladen gleichzeitig den Fahrbefehl bekommen, kann es (z. B. bei zwave) dazu kommen, dass ein Rollladen seinen Befehl nicht bekommt. Dies kann durch eine zeitverzögerte Aussendung der Fahrbefehle vermieden werden. Dazu in den jeweiligen Rollo Devices das Attribut ASC_Drive_DelayStart wie folgt benutzen im: ersten Rollo Device braucht das Attribut nicht gesetzt werden, im zweiten Rollo Device im Attribut ASC_Drive_DelayStart dann 4 Sekunden eintragen, im dritten Rollo Device im Attribut ASC_Drive_DelayStart 8 Sekunden eintragen, usw. Ein Abstand von 3-4 Sekunden ist dabei zielführend.&lt;br /&gt;
&lt;br /&gt;
==== Spezielle Hardware ====&lt;br /&gt;
{{Link2Forum|Topic=101182|LinkText=&amp;quot;Thread zu getesteter Hardware im Forum&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Link2Forum|Topic=92628|LinkText=&amp;quot;Thread zum Modul im Forum&amp;quot;}}&lt;br /&gt;
* {{Link2Forum|Topic=90751|LinkText=&amp;quot;Thread zur Entwicklung im Forum&amp;quot;}} &lt;br /&gt;
* {{Link2Forum|Topic=73964|LinkText=&amp;quot;Thread zu den Scripten von user cluni&amp;quot;}}, die der Entwicklung des Moduls zugrunde liegen&lt;br /&gt;
* Daten zum Sonnenstand z.B. hier https://www.sonnenverlauf.de/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=35808</id>
		<title>AutoShuttersControl</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=35808"/>
		<updated>2021-06-14T19:19:31Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* readingsGroup für die Beschattung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Rollläden&lt;br /&gt;
|ModCategory=Automatisierung&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=73_AutoShuttersControl.pm&lt;br /&gt;
|ModOwner=CoolTux ({{Link2FU|13684|Forum}}/[[Benutzer Diskussion:CoolTux|Wiki]])}}&lt;br /&gt;
Mit [[AutoShuttersControl]] oder kurz &#039;&#039;&#039;ASC&#039;&#039;&#039; können Rollläden automatisch hoch und herunter gefahren werden. Zum Beispiel Öffnen bei Sonnenaufgang, Schließen bei Sonnenuntergang, Beschatten abhängig vom Sonnenstand oder Anfahren von Lüftungspositionen nach Öffnen des zugehörigen Fensters. &lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
{{Hinweis|Das Modul befindet sich derzeit noch in der Entwicklung; der derzeit aktuelle Stand ist  diesem {{Link2Forum|Topic=112325|LinkText=&amp;quot;Thread im Forum&amp;quot;}} zu entnehmen.}}&lt;br /&gt;
Als Voraussetzung sollten folgende FHEM-Devices bereits vorhanden sein:&lt;br /&gt;
* Rollläden,&lt;br /&gt;
* Fensterkontakte,&lt;br /&gt;
* Bewohnerstatus auf Basis von Residents/Roomates in englisch. Ersatzweise andere Devices, z.B. Dummys, welche als &#039;&#039;state&#039;&#039; &#039;&#039;home&#039;&#039;, &#039;&#039;absent&#039;&#039;, &#039;&#039;asleep&#039;&#039;, &#039;&#039;gotosleep&#039;&#039; und &#039;&#039;awoken&#039;&#039; setzen sowie ein Reading &#039;&#039;lastState&#039;&#039;.&lt;br /&gt;
* Helligkeitssensor (Steuerung nach Helligkeit für Beschattung)&lt;br /&gt;
* Ein Device zur Bestimmung des Sonnenstands (nur für Beschattung). Unterstützt werden derzeit [[Modul Astro|Astro]] und [[Twilight]]&amp;lt;ref&amp;gt;Dabei müssen ggf. in [[Global|global]] auch Angaben zu &#039;&#039;longitude&#039;&#039; und &#039;&#039;latitude&#039;&#039; vorhanden sein&amp;lt;/ref&amp;gt;. &lt;br /&gt;
* Wenn Feiertage berücksichtigt werden sollen: Ein oder mehrere {{Link2CmdRef|Anker=holiday2we|Lang=en|Label=holiday2we}}-Angaben in [[Global|global]] samt entsprechender [[Wochenende, Feiertage und Schulferien#Feiertage mittels holiday-Datei|holiday]]-Dateien&amp;lt;ref&amp;gt;Es kann auch z.B. ein Dummy-Device verwendet werden, dieses sollte dann aber neben dem eigentlichen Feiertags-&#039;&#039;state&#039;&#039; auch in einem Reading &#039;&#039;tomorrow&#039;&#039; Angaben zu anstehenden Feiertagen enthalten.&amp;lt;/ref&amp;gt; &amp;lt;ref&amp;gt;Bitte verfahren Sie entsprechend, wenn Urlaubs- oder Ferientage wie Feiertage behandelt werden sollen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung des Moduls bzw. dessen Funktionalität erfolgt in mehreren Schritten:&lt;br /&gt;
* Definition des ASC-Devices&lt;br /&gt;
* Einstellung zentraler Vorgaben am ASC-Device&lt;br /&gt;
* Markieren der zukünftig zu steuernden Rollladen-Devices&lt;br /&gt;
* Einbinden der Rollladen-Devices in das ASC-Device&lt;br /&gt;
* Einstellen der individuellen Vorgaben je Rollladen (am Rollladen-Device)&lt;br /&gt;
Dabei geht man am einfachsten schrittweise vor und erweitert die Funktionalität nach und nach um die gewünschten Funktionen. Dann benötigt man jeweils nur einen kleinen Teil der vielen per Attribut einstellbaren Optionen, und kann die Auswirkungen der jeweiligen Änderung besser nachvollziehen. &lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
{{Hinweis|ASC kann auch verwendet werden, um lediglich Teilaufgaben der Rollladensteuerung zu erfüllen, also z.B. nur das morgendliche Öffnen der Rollläden. Allerdings geht dabei ein erheblicher Teil des Komforts verloren, der dadurch entsteht, dass die Steuerung innerhalb der vollintegrierten Lösung jeweils nachvollzieht, aus welchem Grund eine Fahrt erfolgt war und dies ggf. bei der nächsten Aktion berücksichtigt.}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung ===&lt;br /&gt;
Zunächst sollten die in den [[#Basics|Basics]] beschriebenen Geräte vorhanden und funktionsfähig sein. &lt;br /&gt;
&lt;br /&gt;
=== Define des ASC-Devices ===&lt;br /&gt;
Es genügt ein einfaches define ohne weitere Parameter.&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Dies bewirkt neben der Anlage des Devices selbst auch, dass als weiteres globales Attribut &#039;&#039;ASC&#039;&#039; verfügbar wird.&lt;br /&gt;
&lt;br /&gt;
=== Einstellung zentraler Vorgaben ===&lt;br /&gt;
Mit Attributen am ASC-Device wird das Verhalten des ASC-Devices eingestellt, z.B. Vermeiden von morgendlichen oder abendlichen Fahrten, Frostschutzfunktion bei Gefahr von festgefrorenen Rollläden oder die Reaktion auf Fensterkontakte. Details sind der Commandref zu entnehmen.&lt;br /&gt;
Diese Attribute können jederzeit geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Auswählen zu steuernder Rollladen-Devices ===&lt;br /&gt;
Für jeden vom ASC-Device kontrollierten Rollladen muss das globale Attribut &#039;&#039;ASC&#039;&#039; gesetzt werden. Das steht nach dem Definieren des ASC-Devices zur Verfügung. Das Attribut ist mit 1 oder 2 festzulegen: &lt;br /&gt;
# Je &#039;&#039;kleiner&#039;&#039; der &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Wert um so weiter ist der Rollladen geschlossen. Typischerweise ist dann 0 &#039;&#039;offen&#039;&#039; und 100 &#039;&#039;geschlossen&#039;&#039;. Dies ist z.B. die  passende Wahl für ROLLO-Devices&lt;br /&gt;
# Je &#039;&#039;größer&#039;&#039; der &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Wert desto weiter ist der Rollladen geschlossen, also &#039;&#039;offen&#039;&#039; für &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; pct 100&amp;lt;/code&amp;gt;. Typische Vertreter dieses Typs sind HomeMatic (CUL_HM-) Geräte oder die Shelly2-Aktoren.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dem Parameter leitet das Modul bestimmte Voreinstellungen (&#039;&#039;defaults&#039;&#039;) für den Rollladen ab. Es genügt daher, nur jeweils die Einstellungen zu verändern, die anders gewünscht werden oder für den Rollladenaktortyp anders sein müssen (z.B. &#039;&#039;dim 99&#039;&#039; für vollständiges Öffnen eines ZWave-Aktors).&lt;br /&gt;
{{Hinweis|Das Vorstehende gilt jeweils für den nicht-invertierten Modus! Wer z.B. ein HomeMatic-Gerät mit &#039;&#039;levelinverse&#039;&#039; betreibt, sollte &#039;&#039;ASC&#039;&#039; auf &amp;quot;1&amp;quot; setzen usw.. Maßgeblich ist letztlich nur die Frage, ob die Offen-Positionsangabe nummerisch kleiner oder größer als die Geschlossen-Positionsangabe ist; die konkreten Zahlenwerte spielen dabei keine Rolle, die Angabe &#039;&#039;position&#039;&#039; oder &#039;&#039;pct&#039;&#039; kann auch später über ein weiteres Attribut passend eingestellt werden.}}&lt;br /&gt;
&lt;br /&gt;
=== Einbinden in das ASC-Device ===&lt;br /&gt;
Nachdem das ASC Attribut für die betreffenden Rollladen-Devices gesetzt ist, muss mit &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; scanForShutters&amp;lt;/code&amp;gt; ein Suchlauf gestartet werden, mit dem diese Rollläden in die Steuerungslogik eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellen der individuellen Vorgaben ===&lt;br /&gt;
Die gefundenen Rollladen-Devices erhalten weitere Attribute, mit denen für den jeweiligen Rollladen benötigte Einstellungen vorgenommen werden. &lt;br /&gt;
Diese Attribute sind in der commandref beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
===Readings im zentralen ASC-Device ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|..._nextAstroTimeEvent || || Zeit wird abhängig von der eingestellten Attribute ASC_Time_Up/ASC_Time_Down angezeigt. Bei &#039;&#039;astro&#039;&#039; die Uhrzeit des  Sonnenauf- oder Sonnenuntergang, bei &#039;&#039;time&#039;&#039; und &#039;&#039;brightness&#039;&#039; die Zeit aus ASC_Time_Up_Early/ASC_Time_Down_Late pro Rollonamen&lt;br /&gt;
|-&lt;br /&gt;
|..._lastPosValue || || Position pro Rollonamen, bevor ASC die Rollläden verfahren hat.&lt;br /&gt;
|-&lt;br /&gt;
|..._PosValue || ||aktuelle Position pro Rollonamen.&lt;br /&gt;
|-&lt;br /&gt;
|ascEnable||on, off ||globale ASC Steuerung bei den Rollläden aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|controlShading||on, off ||globale Beschattungsfunktion aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|hardLockOut || on, off ||Status des hardwareseitigen Aussperrschutzes / gilt nur für Rollläden mit dem Attribut bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist.&lt;br /&gt;
|-&lt;br /&gt;
|selfDefense || on, off ||globale Selbstschutzfunktion aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off || globaler Partymodus aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|state || ||Status des ASC-Devices: active, enabled, disabled oder weitere Statusinformationen wie z.B. Grund der letzen Fahrt.&lt;br /&gt;
|-&lt;br /&gt;
|room_... || ||Auflistung aller Rollläden, welche in den jeweiligen Räumen gefunden wurden, Bsp.: room_Schlafzimmer,Terrasse.&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday|| on,off ||globale Wochenendunterstützung aktiv oder inaktiv.&lt;br /&gt;
|-&lt;br /&gt;
|userAttrList || rolled out ||Das ASC-Modul verteilt an die gesteuerten Rollladen-Geräte diverse Benutzerattribute (userattr). In diesem Reading kann der Status dieser Verteilung geprüft werden.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings in den Rolllädendevices ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Enable ||Status von ASC_Enable (on,off).&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersLastDrive ||Grund der letzten Fahrt des Rollladens.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveDown ||Zeit wird abhängig von der eingestellten Attribute ASC_Time_Down angezeigt. Bei astro die Uhrzeit des Sonnenuntergangs, bei time und brightness die Zeit aus /ASC_Time_Down_Late &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveUp ||Zeit wird abhängig von der eingestellten Attribute ASC_Time_Up angezeigt. Bei astro die Uhrzeit des Sonnenaufgangs, bei time und brightness die Zeit aus /ASC_Time_Up_Early&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==set- und get-Befehle für das ASC-Device==&lt;br /&gt;
=== set-Anweisungen ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Beschreibung  &lt;br /&gt;
|-&lt;br /&gt;
|advDriveDown ||on, off ||Nachholen der durch ASC_Adv on ausgesetzten Fahrten.&lt;br /&gt;
|-&lt;br /&gt;
|ascEnable||on, off ||Aktiviert oder deaktiviert die globale ASC-Steuerung.&lt;br /&gt;
|-&lt;br /&gt;
|controlShading||on, off ||Aktiviert oder deaktiviert die globale Beschattungssteuerung.&lt;br /&gt;
|-&lt;br /&gt;
|createNewNotifyDev || ||Legt die interne Struktur für NOTIFYDEV neu an. (Diese Funktion steht nur zur Verfügung, wenn Attribut ASC_expert auf 1 gesetzt ist.)&lt;br /&gt;
|-&lt;br /&gt;
|hardLockOut ||on, off ||Aktiviert den hardwareseitigen Aussperrschutz für die Rollläden, bei denen das Attributs ASC_LockOut auf hard gesetzt ist. Mehr Informationen in der Beschreibung bei den Attributen für die Rollladengeräten.&lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off ||Aktiviert den globalen Partymodus. Alle Rollladen-Geräten, in welchen das Attribut ASC_Partymode auf on gesetzt ist, werden durch ASC nicht mehr gesteuert. Der letzte Schaltbefehl, der bspw. durch ein Fensterevent oder Wechsel des Bewohnerstatus an die Rollläden gesendet wurde, wird beim Deaktivieren des Partymodus ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|renewAllTimer || ||Erneuert bei allen Rollläden die Zeiten gemäß ASC_UP/ASC_DOWN und setzt die internen Timer neu.&lt;br /&gt;
|-&lt;br /&gt;
|renewTimer || ||Erneuert bei dem ausgewählten Rollladen die Zeiten gemäß ASC_UP/ASC_DOWN und setzt die internen Timer neu.&lt;br /&gt;
|-&lt;br /&gt;
|scanForShutters || ||Sucht alle FHEM Devices mit dem Attribut &#039;&#039;ASC&#039;&#039; &#039;&#039;1&#039;&#039; oder &#039;&#039;2&#039;&#039; und legt diese im ASC-Modul an&lt;br /&gt;
|-&lt;br /&gt;
|selfDefence ||on, off||Aktiviert bzw. deaktiviert die Selbstschutzfunktion. Beispiel 1: Wenn das Residents-Gerät &#039;&#039;gone&#039;&#039; meldet, alle Rollläden dann heruntergefahren.  Beispiel 2 : Wenn das Residents-Gerät &#039;&#039;absent&#039;&#039; meldet, das Attribut ASC_ShuttersPlace=terrace ist und ein Fenster im Haus noch geöffnet ist, so wird an diesem Fenster der Rollladen  dann heruntergefahren.&lt;br /&gt;
|-&lt;br /&gt;
|shutterASCenableToggle ||  ||Aktivieren oder deaktivieren der ASC Kontrolle des einzelnen Rollladens.&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday || on,off ||Aktiviert die Wochenendunterstützung. Dann wird das Attribut ASC_Time_Up_WE_Holiday am Rollladen-Device beachtet.&lt;br /&gt;
|-&lt;br /&gt;
|wiggle ||||Bewegt einen oder mehrere Rollläden um einen definierten Wert (Default: 5%) und nach einer Minute wieder zurück in die Ursprungsposition. Diese Funktion könnte bspw. zur Abschreckung in einem Alarmsystem eingesetzt werden.&lt;br /&gt;
|-&lt;br /&gt;
|||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get-Anweisungen ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| showNotifyDevsInformations ||Zeigt eine Übersicht der abgelegten NOTIFYDEV Struktur. Diese Funktion wird für das Debugging genutzt. Hierzu ist das Attribut ASC_expert = 1 zu setzen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
{{Hinweis|Die Attributnamen haben sich teilweise geändert, nachfolgend ist der Stand von Modulversion v0.8.x wiedergegeben.}}&lt;br /&gt;
{{Hinweis|In der commandref findet sich häufig die Schreibweise &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;ASC_BrightnessSensor Sensorname[:brightness [400:800]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Dabei sind die Angaben in den eckigen Klammern optional. Dies müssen also nicht angegeben werden, stattdessen verwendet das Modul dann Standardwerte (siehe cref), die in der cref zu findenden Angaben entsprechen dabei den defaults. Werden Werte angegeben, sind die eckigen Klammern &#039;&#039;&#039;wegzulassen&#039;&#039;&#039;! Beispiel: &amp;lt;code&amp;gt;ASC_BrightnessSensor hm_motion_1 70:100&amp;lt;/code&amp;gt; würde das brightness-Reading des Sensors hm_motion_1 verwenden und einen morgendlichen Schwellenwert von 70 bzw. 100 für abends.}}&lt;br /&gt;
===Attribute direkt am ASC-Device ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEvening || ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON ||nach welchem ASTRO-Modus soll die Abendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEveningHorizon || - 9 bis 9 || 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeEvening der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorning || ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON || nach welchem ASTRO-Modus soll die Morgendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorningHorizon || - 9 bis 9|| 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeMorning der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlComfort ||on, off || off ||schaltet die Komfortfunktion an. Bedeutet, dass ein Rollladen mit einem threestate-Sensor am Fenster beim Öffnen in eine Offenposition fährt. Hierzu muss beim Rollladen das Attribut ASC_ComfortOpen_Pos entsprechend konfiguriert sein. &lt;br /&gt;
|- &lt;br /&gt;
|ASC_autoShuttersControlEvening ||on, off || ||Aktiviert die automatische Steuerung durch das ASC-Modul am Abend.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlMorning ||on, off || ||Aktiviert die automatische Steuerung durch das ASC-Modul am Morgen.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_blockASCDrivesAfterManual ||0, 1 || ||wenn dieser Wert auf 1 gesetzt ist, dann werden Rollläden vom ASC-Modul nicht mehr gesteuert, wenn zuvor manuell eingegriffen wurde. Voraussetzung hierfür ist jedoch, dass im Reading ASC_ShuttersLastDrive der Status manual enthalten ist und sich der Rollladen auf eine unbekannte (nicht in den Attributen anderweitig konfigurierte) Position befindet.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_brightnessDriveUpDown || || || Werte (z.B. Lux) bei dem Schaltbedingungen für Sonnenauf- und -untergang geprüft werden sollen. Diese globale Einstellung kann durch die WERT-MORGENS:WERT-ABENDS Einstellung von ASC_BrightnessSensor im Rollladen selbst überschrieben werden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_debug ||0, 1 || 0||Aktiviert die erweiterte Logausgabe für Debugausgaben (nur nach Aufforderung nutzen) &lt;br /&gt;
|-&lt;br /&gt;
|ASC_expert ||0, 1 ||0 ||ist der Wert 1, so werden erweiterte Informationen bezüglich des NotifyDevs unter &#039;&#039;set und get&#039;&#039; angezeigt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_freezeTemp ||-5 bis 5 || ||Temperatur, ab welcher der Frostschutz greifen soll und der Rollladen nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_rainSensor || || ||DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS] - der Inhalt ist eine Kombination aus Devicename, Readingname, Wert ab dem getriggert werden soll, Hysterese Wert ab dem der Status Regenschutz aufgehoben werden soll und der &amp;quot;wegen Regen geschlossen Position&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|ASC_residentsDev  || || ||DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Devicenamen und Readingnamen des Residents-Device der obersten Ebene (z.B. rgr_Residents:state)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_shuttersDriveDelay  || || ||maximale Zufallsverzögerung in Sekunden bei der Berechnung der Fahrzeiten. 0 bedeutet keine Verzögerung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_tempSensor || || ||DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Device und Reading für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_twilightDevice || || ||das Device, welches die Informationen zum Sonnenstand liefert. Wird unter anderem für die Beschattung verwendet.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_windSensor || || ||DEVICE[:READING] - Sensor für die Windgeschwindigkeit. Kombination aus Device und Reading.&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Attribute in den Rolllädendevices===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC || 0, 1, 2|| ||&amp;quot;kein Anlegen der Attribute beim ersten Scan bzw. keine Beachtung eines Fahrbefehles&amp;quot;,1 = &amp;quot;Inverse oder Rollo - Bsp.: Rollo oben 0, Rollo unten 100 und der Befehl zum prozentualen Fahren ist position&amp;quot;,2 = &amp;quot;Homematic Style - Bsp.: Rollo oben 100, Rollo unten 0 und der Befehl zum prozentualen Fahren ist pct&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Adv || on, off||||bei on wird das runterfahren des Rollos während der Weihnachtszeit (1. Advent bis 6. Januar) ausgesetzt! Durch set &amp;lt;ASCDEVICE&amp;gt; advDriveDown werden alle ausgesetzten Fahrten nachgeholt.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze ||off, soft, hard, am, pm || ||Frostschutz, wenn soft fährt der Rollladen in die ASC_Antifreeze_Pos, bei hard/am/pm wird gar nicht oder innerhalb der entsprechenden Tageszeit nicht gefahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze_Pos || || ||Position des Rolllades die angefahren werden soll, wenn der Fahrbefehl komplett schließen lautet, aber der Frostschutz aktiv ist  !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEvening ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON || ||nach welchem ASTRO-Modus soll die Abendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEveningHorizon || - 9 bis 9 || 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeEvening der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorning ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON || || nach welchem ASTRO-Modus soll die Morgendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorningHorizon || - 9 bis 9|| 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeMorning der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_afterManual || ||1200 ||wie viel Sekunden soll die Automatik nach einer manuellen Fahrt aussetzen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforeDayOpen || ||3600 ||wie viel Sekunden vor dem morgendlichen öffnen soll keine schließen Fahrt mehr stattfinden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforeNightClose || ||3600 ||ie viel Sekunden vor dem nächtlichen schließen soll keine öffnen Fahrt mehr stattfinden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BrightnessSensor || ||none ||DEVICE[:READING] WERT-MORGENS:WERT-ABENDS / &#039;Sensorname[:brightness [400:800]]&#039; Angaben zum Helligkeitssensor mit (Readingname, optional) für die Beschattung und dem Fahren der Rollladen nach brightness und den optionalen Brightnesswerten für Sonnenauf- und Sonnenuntergang &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Closed_Pos || ||default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;||in 10er-Schritten von 0 bis 100 &lt;br /&gt;
wird angefahren wenn SelfDefense aktiv ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ComfortOpen_Pos || || || in 10er Schritten von 0 bis 100 !!! Die eingestellte Position wird bei einem threestate Sensor angefahren. Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Down || time, astro, brightness, roommate || astro||bei &#039;&#039;astro&#039;&#039; wird Sonnenuntergang berechnet, bei time wird der Wert aus ASC_Time_Down_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Down_Early und ASC_Time_Down_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Down_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Down_Early und ASC_Time_Down_Late geschaut, ob die als Attribut im Moduldevice hinterlegte ASC_brightnessDriveUpDown der Down Wert erreicht wurde. Wenn ja, wird der Rollladen runter gefahren.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_DiveUpMaxDuration || || 60||die Dauer des Hochfahrens des Rollladens plus 5 Sekunden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Drive_Delay || || -1|| maximaler Wert für einen zufällig ermittelte Verzögerungswert in Sekunden bei der Berechnung der Fahrzeiten, 0 bedeutet keine Verzögerung, -1 bedeutet, dass das ??gleichwertige Attribut?? aus dem ASC Device ausgewertet werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Drive_DelayStart || || -1|| in Sekunden verzögerter Wert ab welchen dann erst das Offset startet und dazu addiert wird. Funktioniert nur wenn gleichzeitig ASC_DriveDelay gesetzt wird.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ExternalTrigger || |||| DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE, Beispiel: &amp;quot;WohnzimmerTV:state on:off 66:100&amp;quot; bedeutet das wenn ein &amp;quot;state:on&amp;quot; Event kommt soll das Rollo in Position 66 fahren, kommt ein &amp;quot;state:off&amp;quot; Event soll es in Position 100 fahren. Es ist möglich die POSINACTIVE weg zu lassen dann fährt das Rollo in LastStatus Position.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_GuestRoom || on, off |||| aktuell noch nicht umgesetzt...&lt;br /&gt;
|-&lt;br /&gt;
|ASC_LockOut || soft, hard, off ||off || stellt entsprechend den Aussperrschutz ein. Bei global aktivem Aussperrschutz (set ASC-Device lockOut soft) und einem Fensterkontakt open bleibt dann der Rollladen oben. Dies gilt nur bei Steuerbefehlen über das ASC Modul. Stellt man global auf hard, wird bei entsprechender Möglichkeit versucht den Rollladen hardwareseitig zu blockieren. Dann ist auch ein Fahren über die Taster nicht mehr möglich&lt;br /&gt;
|-&lt;br /&gt;
|ASC_LockOut_Cmd || inhibit, blocked, protection ||none|| set Befehl für das Rollladen-Device zum Hardware sperren. Dieser Befehl wird gesetzt werden, wenn man &amp;quot;ASC_LockOut&amp;quot; auf hard setzt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Down ||absent, always, off, home || always ||Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Up ||absent, always, off, home || always ||Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Open_Pos || ||default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;||in 10er-Schritten von 0 bis 100&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Partymode || on, off || off ||schaltet den Partymodus an oder aus. Wird am ASC Device set ASC-DEVICE partyMode on geschalten, werden alle Fahrbefehle an den Rollläden, welche das Attribut auf on haben, zwischengespeichert und später erst ausgeführ&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Pos_Reading || || ||Name des Readings, welches die Position des Rollladen in Prozent angibt. Wird bei unbekannten Device-Typen auch als &#039;&#039;set&#039;&#039; Befehl zum Fahren verwendet&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDownValue_beforNightClose || || -1||wie viele Sekunden vor dem abendlichen schließen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:300 bedeutet 30 min vor night close oder bei unter einem Brightnesswert von 300&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDown_Pos || ||50||Position den Rollladens für den abendlichen Sichtschutz!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyUpValue_beforDay || || -1||wie viele Sekunden vor dem morgendlichen öffnen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:600 bedeutet 30 min vor day open oder bei über einem Brightnesswert von 600&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyUp_Pos || ||50||Position den Rollladens für den morgendlichen Sichtschutz!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_RainProtection ||on, off || ||soll der Rollladen beim Regenschutz beachtet werden. on=JA, off=NEIN.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Device || || none ||mit Komma getrennte Namen des/der Roommate-Device/s welche den/die Bewohner des Rollladen-Raumes wiedergibt. Macht nur Sinn in Schlaf- oder Kinderzimmern&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Reading || || ||Reading des Roommate-Device, welches den Status wieder gibt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Self_Defense_AbsentDelay || || 300||um wie viele Sekunden soll das fahren in Selfdefense bei Residents absent verzögert werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Self_Defense_Mode || || gone||ab welchen Residents Status soll Selfdefense aktiv werden ohne das Fenster auf sind&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_InOutAzimuth || ||95:265 ||Azimut Wert ab dem bei Überschreiten Beschattet und bei Unterschreiten Endschattet werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_MinMax_Elevation || ||25.0:100.0 ||ab welcher min Höhe des Sonnenstandes soll beschattet und ab welcher max Höhe wieder beendet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_MinOutsideTemperature_ || ||18 ||ab welcher Temperatur soll Beschattet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwert&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShadingMode ||absent, always, off, home || off||wann soll die Beschattung nur stattfinden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Pos || || ||Position des Rollladens für die Beschattung !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_StateChange_SunnyCloudy || ||35000:20000 ||Brightness Wert ab welchen die Beschattung stattfinden und aufgehoben werden soll, immer in Abhängigkeit der anderen einbezogenen Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_WaitingPeriod || ||1200 ||wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung stattfinden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shutter_IdleDetection || ||||READING:VALUE gibt das Reading an welches Auskunft über den Fahrstatus des Rollos gibt, sowie als zweites den Wert im Reading welcher aus sagt das das Rollo nicht fährt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersPlace || window, terrace || ||wenn dieses Attribut auf &#039;&#039;terrace&#039;&#039; gesetzt ist und das Residents-Device in den Status &#039;&#039;absent&#039;&#039; geht, &#039;&#039;selfDefence&#039;&#039; aktiv ist und das Fenster geöffnet ist, wird das Rollo  geschlossen. Wenn ein twostate Senso genutzt wird und dieses Attribut auf &#039;&#039;terrace&#039;&#039; gesetzt ist wird ASC_Ventilate_Pos ignoriert und das Rollo wird beim öffnen des Fenster komplett geöffnet. Wenn dieses Attribut auf &#039;&#039;window&#039;&#039; gesetzt ist wird ASC_Ventilate_Pos berücksichtigt und das Rollo wird entsprechend der ASC_Ventilate_Pos geöffnet. Wenn das Fenster wieder geschlossen wird, dann wird das Rollo unabhängig von &#039;&#039;windows oder terrace&#039;&#039; vollständig geschlossen.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Sleep_Pos || || ||in 10er-Schritten von 0 bis 100, default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC.&#039;&#039; Position wird angefahren wenn Bedingung für modeDown aktiv ist. Hiermit kann z.B. das komplette abendliche Schließen des Rollos begrenzt werden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_TempSensor || || ||DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Device und Reading für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Early || ||16:00 ||Sonnenuntergang frühste Zeit zum Runterfahren !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Late || ||22:00 ||Sonnenuntergang späteste Zeit zum Runterfahren !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Early || || 05:00||Sonnenaufgang frühste Zeit zum Hochfahren !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Late || ||08:30 ||Sonnenaufgang späteste Zeit zum Hochfahren  !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_WE_Holiday || ||08:00 ||Sonnenaufgang frühste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet).ACHTUNG!!! in Verbindung mit Brightness für ASC_Up muss die Uhrzeit kleiner sein wie die Uhrzeit aus ASC_Time_Up_Late !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!! &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Ventilate_Window_Open ||on, off ||on||auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WiggleValue || ||5 ||Wert, um welchen sich die Position des Rollladens bei &#039;&#039;Wiggle&#039;&#039; ändern soll &lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindParameters || ||5 ||TRIGGERMAX[:HYSTERESE] [DRIVEPOSITION] / Angabe von Max Wert ab dem für Wind getriggert werden soll, Hytsrese Wert ab dem der Windschutz aufgehoben werden soll TRIGGERMAX - HYSTERESE / Ist es bei einigen Rollläden nicht gewünscht das gefahren werden soll, so ist der TRIGGERMAX Wert mit -1 an zu geben. (default: &#039;50:20 ClosedPosition&#039;)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindProtection ||on, off || ||soll der Rollladen beim Windschutz beachtet werden. on=JA, off=NEIN.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec || ||none ||Name des Fensterkontakts, an welchen Fenster der Rollladen angebracht ist. WINDOWREC:[READING], Name des Fensterkontaktes, an dessen Fenster der Rollladen angebracht ist. Reading ist optional&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec_PosAfterDayClosed ||open, lastManual ||open ||Name des Fensterkontakts, an welchen Fenster der Rollladen angebracht ist. Sein Reading &#039;&#039;state&#039;&#039; muss die Werte &#039;&#039;open&#039;&#039;, &#039;&#039;closed&#039;&#039; oder &#039;&#039;tilted&#039;&#039; enthalten.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec_subType ||twostate, threestate ||twostate||Typ des verwendeten Fensterkontaktes: twostate (optisch oder magnetisch) oder threestate (Drehgriffkontakt)&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||    &lt;br /&gt;
|-  &lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||        &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hilfsmittel ==&lt;br /&gt;
{{Hinweis|Die Device-Namen sind auf die eigene Installation anzupassen.}}&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Codezeilen sind im [[Import von Code Snippets|RAW]]-Format.}}&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText= Stand 2019-05-03&lt;br /&gt;
* Erfolgreich getestet mit Homematic Devices, Beta-User&lt;br /&gt;
* Die Farbgebung entspricht dem Standard, wenn unter dem Style f18 der Farbpreset &#039;&#039;light&#039;&#039; gewählt wird.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Level ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Schliessen bis&amp;gt;,&amp;lt;Öffnen auf&amp;gt;,&amp;lt;Beschattung&amp;gt;,&amp;lt;Komfort&amp;gt;,&amp;lt;Lüften&amp;gt;,&amp;lt;Privacy&amp;gt; (Rollladen_.*|Jalousie_.*)..:level,!?ASC_Closed_Pos,!?ASC_Open_Pos,!?ASC_Shading_Pos,!?ASC_ComfortOpen_Pos,!?ASC_Ventilate_Pos,!?ASC_PrivacyDown_Pos&lt;br /&gt;
attr rg_ASC_Rolllaeden_Level commands {level =&amp;gt; &#039;pct:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_ComfortOpen_Pos =&amp;gt; &#039;ASC_ComfortOpen_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_PrivacyDown_Pos =&amp;gt; &#039;ASC_PrivacyDown_Pos:selectnumbers,0,5,100,0,lin&#039;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Zeiten ===&lt;br /&gt;
[[Bild:ReadingsGroup ASC times.png|thumb|right|ReadingsGroup - Zeitenbeispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Position&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Up_WE/Hol&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt; \&lt;br /&gt;
 (.*Rollo.*|.*Rollladen|Jalousie_.*):level,!?ASC_Time_Up_Early,!?ASC_Time_Up_Late,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times commands {level =&amp;gt; &#039;pct:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100&#039;, \&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, \&lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;, \&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,\&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:55,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,  \&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt; &#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;, \&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;, \&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039; }&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times room Rollladen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC RG Zeiten HM ZWave Siro.png|thumb|right|ReadingsGroup - CUL_HM+ZWave+Siro mit widgets]]Neue Version mit time-Widgets und pct/dim/position-widget (5-er Schritte), passend für CUL_HM, ZWave und Siro-Geräte:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Time_Up_Early  &amp;gt;,&amp;lt;Time_Up_WE  &amp;gt;,&amp;lt;Time_Up_Late  &amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt; (Rollo_.*|Jalousie_.*)..:(level|dim|position),!?ASC_Time_Up_Early,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Up_Late,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times commands {level =&amp;gt; &#039;pct:selectnumbers,0,5,100,0,lin&#039;, \&lt;br /&gt;
dim =&amp;gt; &#039;dim:selectnumbers,0,5,99,0,lin&#039;,\&lt;br /&gt;
position =&amp;gt; &#039;pct:selectnumbers,0,5,99,0,lin&#039;,\&lt;br /&gt;
ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;,\&lt;br /&gt;
ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039;,\&lt;br /&gt;
ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:time&#039;, \&lt;br /&gt;
ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:time&#039;,\&lt;br /&gt;
ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:time&#039;, \&lt;br /&gt;
ASC_Time_Up_Late =&amp;gt;&#039;ASC_Time_Up_Late:time&#039;,\&lt;br /&gt;
ASC_Time_Up_WE_Holiday =&amp;gt;&#039;ASC_Time_Up_WE_Holiday:time&#039;}&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times room Rollladen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  readingsGroup für FIBARO Roller Shutter FGR-222 Devices ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Getestet von majestro84, Stand 2019-01-28.&lt;br /&gt;
* {{Link2Forum|Topic=92628|Message=897099|LinkText=Forenbeitrag dazu}}&lt;br /&gt;
* Die Farbgebung entspricht dem Standard, wenn unter dem Style f18 der Farbpreset &#039;&#039;dark&#039;&#039; gewählt wird}}&lt;br /&gt;
[[Bild:ASC Jalousien Times.JPG|thumb|right|Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt;define ASC_Jalousien_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_WE&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt;,&amp;lt;PartyMode&amp;gt;,&amp;lt;LockOut&amp;gt; (.*_Jalousie.*):position,!?ASC_Time_Up_Early,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Up_Late,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up,!?ASC_Partymode,!?ASC_LockOut&lt;br /&gt;
&lt;br /&gt;
 attr ASC_Jalousien_Times commands {position =&amp;gt; &#039;dim:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;,&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039;,&lt;br /&gt;
 ASC_Partymode =&amp;gt; &#039;ASC_Partymode:on,off&#039;,&lt;br /&gt;
 ASC_LockOut =&amp;gt; &#039;ASC_LockOut:soft,hard,off&#039;,&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, &lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;,&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:45,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt;&#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;}&lt;br /&gt;
 attr ASC_Jalousien_Times room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC Jalousien Level.JPG|thumb|right|Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt; define Jalousien_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Closed_Pos&amp;gt;,&amp;lt;Open_Pos&amp;gt;,&amp;lt;Comfort_Pos&amp;gt;,&amp;lt;Ventilate_Pos&amp;gt;,&amp;lt;PrivacyDown_Pos&amp;gt;,&amp;lt;Shading_Pos&amp;gt; (.*_Jalousie.*):!?ASC_Closed_Pos,!?ASC_Open_Pos,!?ASC_ComfortOpen_Pos,!?ASC_Ventilate_Pos,!?ASC_PrivacyDown_Pos,!?ASC_Shading_Pos&lt;br /&gt;
 attr Jalousien_Level commands { ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_ComfortOpen_Pos =&amp;gt; &#039;ASC_ComfortOpen_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_PrivacyDown_Pos =&amp;gt; &#039;ASC_PrivacyDown_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;}&lt;br /&gt;
 attr Jalousien_Level room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einrichtungsbeispiel (nach Sonnenstand) ==&lt;br /&gt;
=== Ziel und Vorgaben ===&lt;br /&gt;
Es sollen die Rollläden und Jalousien innerhalb bestimmter zeitlicher Perioden sonnenstandsabhängig geöffnet und geschlossen werden. An den Wochenenden und an Ferientagen soll etwas später geöffnet werden. Es sind Tür- und Fensterkontakte vorhanden (Türkontakte: twoState, Fensterkontakte: threeState), wobei bei jeder Öffnung ein eventuell geschlossener Rollladen geöffnet werden soll. Bei allen Rollladenaktoren, Tür- und Fensterkontakten handelt es sich um CUL_HM-Geräte.&lt;br /&gt;
&lt;br /&gt;
=== Vorarbeiten ===&lt;br /&gt;
Im global-Device sind Angaben zu latitude und longitude vorhanden, holiday2we wie folgt&amp;lt;ref&amp;gt;&#039;&#039;ferien&#039;&#039; ist eine automatisiert erstellte holiday-Datei nach diesem {{Link2Forum|Topic=85759|Message=885883|LinkText=Foren-Beitrag}}.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr global holiday2we bw,ferien&lt;br /&gt;
Weitere Angaben werden zunächst nicht benötigt, das Astro-Device wird erst in der Beschattungskonfiguration definiert. &lt;br /&gt;
Dann erfolgt das &#039;&#039;Define des ASC-Devices&#039;&#039; wie oben beschrieben:&lt;br /&gt;
&amp;lt;code&amp;gt;define Rollladenautomatik AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Folgen die einzubindenden Rollladenaktoren einem einheitlichen Namensschema, können diese sodann z.B. mit &lt;br /&gt;
 attr (Jalousie|Rollladen)_.* ASC 2&lt;br /&gt;
auf einen Rutsch mit dem passenden ASC-Typ gekennzeichnet werden.  &lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Achtung: Das AutoShuttersControl-Device selbst darf kein ASC-Attribut bekommen!}}&lt;br /&gt;
&lt;br /&gt;
Dann werden mit &lt;br /&gt;
 set Rollladenautomatik scanForShutters&lt;br /&gt;
die nachfolgend weiter zu bearbeitenden Attribute angelegt.&lt;br /&gt;
=== Schließen morgens und abends ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Alternative: Fahren nach brightness:&lt;br /&gt;
Soll insgesamt oder an einzelnen Rollläden helligkeitsgesteuert gefahren werden, muß zentral oder für jeden Rollladen ein Helligkeitssensor definiert und die Helligkeitsgrenzwerte festgelegt sein (&#039;&#039;ASC_BrightnessSensor&#039;&#039; etc.), bei deren Überschreitung geöffnet bzw. Unterschreitung geschlossen werden soll.}}&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Sonnenstandsabhängige Fahrzeiten werden wie folgt aktiviert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeEvening CIVIL&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeMorning CIVIL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aus der Angabe &#039;&#039;CIVIL&#039;&#039; und den Vorgaben in den einzelnen Rollladen wird dabei mit Hilfe von [[SUNRISE_EL]] die effektive Fahrzeit berechnet, dort finden sich auch weitere Hinweise, zu den meisten anderen Optionen für die ersten beiden Attribute.&lt;br /&gt;
Bei allen Fensteröffnungen soll auf eine Lüften-Position gefahren werden, also schalten wir diese Funktion ebenfalls zentral an&amp;lt;ref&amp;gt;Sonst wird bei threeState-Sensoren nur bei &#039;&#039;tilted&#039;&#039; auf die in &#039;&#039;ASC_Ventilate_Pos&#039;&#039; gefahren.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr Rollladenautomatik ASC_autoShuttersControlComfort on &lt;br /&gt;
Zuletzt legen wir noch einen Temperatur-Sensor fest. Dieser wird beim Frostschutz sowie bei der Beschattung berücksichtigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_tempSensor Aussentemperatur_Nord:temperature&lt;br /&gt;
attr Rollladenautomatik ASC_freezeTemp 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{Hinweis|Achtung: Für jede weitere Sensor-Information (z.B. zu Regen oder Wind) muß ein eigenes Device verwendet werden. Sollen unterschiedliche Readings desselben Sensors ausgewertet werden, müssen diese in ein eigenes Device übertragen werden, z.B. über einen readingsProxy mit gesetztem event-on-update-reading-Attribut (sonst triggert dieser nicht bei Aktualisierung des Readings)!}} &lt;br /&gt;
&lt;br /&gt;
tbd: &lt;br /&gt;
* Rain&lt;br /&gt;
* Wind&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
{{Hinweis|Positionen dürfen sich innerhalb eines Rollos nicht überschneiden - Auch ASC_Closed_Pos 100 ASC_Shading_Pos 98 ASC_ComfortOpen_Pos 97 usw... sind bereits unterschiedliche Positionen.}}&lt;br /&gt;
&lt;br /&gt;
===== Fahrzeiten =====&lt;br /&gt;
Zur Konfiguration der Fahrzeiten bietet es sich an, eine ReadingsGroup zu nutzen, wie unter [[#Hilfsmittel|Hilfsmittel]] dargestellt. Alternativ kann man die Zeiten auch manuell in den einzelnen Rollläden hinterlegen.&lt;br /&gt;
===== Bewohner =====&lt;br /&gt;
Wird ein Raum von einer oder mehreren bestimmten Person/en bewohnt oder gibt es ein Sammel-Gerät für mehrere Bewohner, kann dies mit den Attributen &#039;&#039;ASC_Roommate_Device&#039;&#039; und &#039;&#039;ASC_Roommate_Reading&#039;&#039; einem Rollladen zugeordnet werden. Ist einer der Bewohner &#039;&#039;asleep&#039;&#039;, wird morgens erst geöffnet, wenn auch der letzte Roommate nicht mehr &#039;&#039;asleep&#039;&#039; ist.&lt;br /&gt;
===== Fensterkontakte  =====&lt;br /&gt;
Dann werden ggf. vorhandene Fensterkontakte mit &#039;&#039;ASC_WindowRec&#039;&#039; zugeordnet und der Sensortyp mit &#039;&#039;ASC_WindowRec_subType&#039;&#039; festgelegt. Im Falle von threeState-Sensoren wird das übergreifende &#039;&#039;ASC_autoShuttersControlComfort&#039;&#039; beachtet, wobei dann bei vollständiger Öffnung des Fensters auf den in &#039;&#039;ASC_ComfortOpen_Pos&#039;&#039; festgelegten Wert gefahren wird.&lt;br /&gt;
===== Frostschutz =====&lt;br /&gt;
Zuletzt können die Attribute &#039;&#039;ASC_Antifreeze&#039;&#039; und &#039;&#039;ASC_Antifreeze_Pos&#039;&#039; festgelegt werden, wenn die Frostschutzfunktion aktiviert werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Beschattung ===&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Im ASC DEVICE das Reading &amp;quot;controlShading&amp;quot; auf &#039;&#039;on&#039;&#039;, sowie ein Astro/Twilight Device im Attribut &amp;quot;ASC_twilightDevice&amp;quot; und das Attribut &amp;quot;ASC_tempSensor&amp;quot; definieren.&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
Es wird ein Helligkeitssensor als Attribut &amp;quot;ASC_BrightnessSensor&amp;quot; benötigt. Wird der Sensor nur für die Beschattung verwendet, ist der Wert DEVICENAME[:READING] ausreichend.&lt;br /&gt;
Alle weiteren Attribute sind optional und wenn nicht gesetzt mit Default-Werten belegt. Sie sollten entsprechend der Gegebenheiten angepasst werden. Die Werte für die Fensterposition und den Vor-/Nachlaufwinkel &#039;&#039;(ASC_Shading_InOutAzimuth)&#039;&#039; sowie die Grenzwerte für &amp;lt;code&amp;gt;&#039;&#039;ASC_shading_StateChange_SunnyCloudy&#039;&#039;&amp;lt;/code&amp;gt; sind besonders wichtig. &lt;br /&gt;
&lt;br /&gt;
==== Bedingungen ====&lt;br /&gt;
Damit die Beschattung startet müssen &#039;&#039;&#039;alle&#039;&#039;&#039; Bedingungen erfüllt sein. Entschattet wird, sobald &#039;&#039;&#039;eine&#039;&#039;&#039; der Bedingungen wegfällt und die Zeit entsprechend &amp;lt;code&amp;gt;ASC_Shading_WaitingPeriod&amp;lt;/code&amp;gt; abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
Der Sonnensensor &amp;lt;ASC_BrightnessSensor&amp;gt; muss mindestens zwei Messwerte geliefert haben, bevor das ASC-Modul in die Beschattungsposition fährt! Beim (zeitlich) ersten Messwert wird der Zustand &#039;&#039;in-reserved&#039;&#039; gesetzt. Erst beim zweiten Messwert wechselt der Zustand nach &#039;&#039;in shading&#039;&#039;. Die Anzahl der berücksichtigten Messwerte ist abhängig vom &amp;quot;moving average window&amp;quot;, der mit dem dritten Parameter des Attributs &#039;&#039;ASC_Shading_StateChange_SunnyCloudy&#039;&#039; konfiguriert wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Von Standardwerten ausgehend ist nachfolgender Ablauf angestrebt:&#039;&#039;&#039;&lt;br /&gt;
# Ein Event vom Astro oder Helligkeits Device kommt -&amp;gt; sind alle Werte innerhalb des Arbeitsbereiches, ändert sich der ASC Info-Zustand im Rollo von xx auf „in reserved“ (Beschattung vorbereitet)&lt;br /&gt;
# Ein erneutes Event vom Astro oder Helligkeits Device kommt -&amp;gt; Überprüfung der Werte -&amp;gt; sind diese weiterhin gegeben folgt der Wechsel von „in reserved“ auf „in“ (Beschattung aktiv)&lt;br /&gt;
# Bei Verwendung von &#039;&#039;ASC_Shading_StateChange_SunnyCloudy&#039;&#039; ist zu beachten, dass ein Durchschnitt über die letzten drei Brightness Events gerechnet wird. Möchte man das vermeiden muss man SUNNY:CLOUDY 1[2] setzen. &lt;br /&gt;
# Die Zeiten &#039;&#039;ASC_Shading_WaitingPeriod&#039;&#039; und &#039;&#039;ASC_BlockingTime_afterManual&#039;&#039; können hier zusätzlich für eine Verzögerung sorgen. &lt;br /&gt;
&#039;&#039;&#039;Wichtig zu beachten:&#039;&#039;&#039; Es müssen immer mehrere (mind. 2) Events für den Betrieb erfolgen. In den Standardeinstellungen vom Astro Modul erfolgt dieses z.B. nur 1 x pro Stunde. Kommt also ein Helligkeits-Event auch nur 1x pro Stunde, könnte es 2 Std dauern, bis die Beschattungsfunltion greift. &lt;br /&gt;
&lt;br /&gt;
Wenn das Rollo einmal aus der Beschattung manuell (im Rollo Device muss bei &#039;&#039;ASC_ShuttersLastDrive manuel&#039;&#039; stehen gefahren wurde wird das Rollo erst wieder nach einer Entschattung und erneuter Beschattung gefahren. Also es muss einmal shading out kommen und beim nächsten shading in fährt er dann wieder.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Funktionen ===&lt;br /&gt;
==== WeekendHoliday Funktion im Brightnessbetrieb ====&lt;br /&gt;
Am Wochenende oder Feiertag und wenn am ASC-Device sunriseTimeWeHoliday aktiviert sowie im Rollo das Attribut ASC_Time_Up_WE_Holiday gesetzt sind, wird zur angegebenen ASC_Time_Up_WE_Holiday Zeit das Rollo geöffnet, ungeachtet des Brightnesswertes.&lt;br /&gt;
&lt;br /&gt;
==== Privacy ====&lt;br /&gt;
Werden hierfür Werte festgelegt, werden die betreffenden Rollläden die festgelegte Zeit/Helligkeit vor dem abendlichen Schließen vorab teilweise geschlossen. Dies kann z.B. gewünscht sein, um Rollläden zur Straße hin mit viel Fußgängerverkehr zwar nicht vollständig abzudunkeln, aber gleichzeitig zu verhindern, dass von außen in Wohnräume geschaut werden kann, sobald dort das Licht angeschaltet wird&lt;br /&gt;
&lt;br /&gt;
==== BlockingTime====&lt;br /&gt;
Bewirkt, dass nach einer manuellen Fahrt, eine vom ASC Modul initiierte Fahrt zunächst ausgesetzt wird, bis die im Attribute angegebene Zeit überschritten ist. Erst dann wird eine vom ASC Modul initiierte Fahrt tatsächlich durchgeführt.&lt;br /&gt;
Genau so wird ein Hochfahren eines Rollos durch das ASC Modul nicht mehr ausgeführt, wenn es innerhalb der Zeit von ASC_BlockingTime_beforNightClose und das Runterfahren wird nicht mehr erfolgen, wenn es innerhalb von ASC_BlockingTime_beforDayOpen ist.&lt;br /&gt;
Beispiel: Meine Tochter geht früh außer Haus und Ihre Rollos sind nicht hochgefahren. Diese fahren auch nicht mehr hoch, da die ausschließlich bei home (anwesend) fahren sollen. Nun kommt sie am Nachmittag um 16:23 Uhr nach Hause. Eigentlich sollten nun die Rollos fahren. Doch die Sonnenuntergangsfahrt (schließen) wäre schon 16:51 Uhr und damit innerhalb der 3600 ASC_BlockingTime_beforNightClose. Die Rollos bleiben also unten. Es lohnt sich für die paar Minuten einfach nicht mehr.&lt;br /&gt;
&lt;br /&gt;
==== wiggle====&lt;br /&gt;
Mit einem &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; wiggle&amp;lt;/code&amp;gt; können alle Rollladen mit einem entsprechenden Attribut zu einer kurzen Fahrt veranlasst werden, nach Ablauf von einer Minute wieder um denselben Wert zurück. Dabei wird jeweils in die Richtung gefahren, die den weiteren Weg ermöglicht. Wenn also zu 70% geschlossen ist, wird der Rollladen hoch fahren.&lt;br /&gt;
==== Partymode ====&lt;br /&gt;
Dieser wird am ASC-Device selbst aktiviert mittels &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; partyMode on&amp;lt;/code&amp;gt;. Alle Rollladen-Devices, welche das Attribut &#039;&#039;ASC_Partymode&#039;&#039; auf &#039;&#039;on&#039;&#039; gestellt haben, werden nicht mehr gesteuert. Der letzte Schaltbefehl, der durch ein Fensterevent oder Bewohnerstatus an die Rollläden gesendet wurde, beim Beenden des Modus durch &amp;lt;code&amp;gt;set ASC-Device partyMode off&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
==== lock-out ====&lt;br /&gt;
Man kann mit dem Befehl &amp;lt;code&amp;gt; set &amp;lt;ASC-Device&amp;gt; hardLockOut&amp;lt;/code&amp;gt; auf einen Schlag alle Rollos sperren welche &amp;lt;code&amp;gt; attr &amp;lt;ROLLO-Device&amp;gt; ASC_LockOut hard&amp;lt;/code&amp;gt; gesetzt haben.&lt;br /&gt;
Das ist dafür gedacht, wenn Du eine gewisse Zeit den Rolloaktor sperren willst. Zum Beispiel das die Kinder nicht schalten sollen.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Hinweise und Problemlösungen ==&lt;br /&gt;
* Werden Attribute geändert, kann es vereinzelt vorkommen, dass das ASC-Modul dies nicht mitbekommt und das tatsächliche Verhalten nicht den Erwartungen entspricht. In so einem Fall empfielt es sich, das NOTIFYDEV nochmals aufbauen zu lassen. Dazu werden zunächst mit &amp;lt;code&amp;gt;set &amp;lt;ASC-Modul&amp;gt; expert 1&amp;lt;/code&amp;gt; erweiterte Informationen bezüglich des NotifyDevs unter set und get aktiviert und anschließend ein &amp;lt;code&amp;gt;set &amp;lt;ASC-Modul&amp;gt; createNewNotifyDev&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
&lt;br /&gt;
* Hin und wieder berichten Nutzer davon, wenn Sie die &#039;&#039;Privacy Funktion&#039;&#039; nutzen, dass sich im NOTIFYDEV anstelle des Device Namen ein Raumname befindet. Diese Problem kann damit gelöst werden, dass in dem betroffenen &#039;&#039;&#039;Rollo Device&#039;&#039;&#039; das Atribut  &amp;lt;code&amp;gt;attr event-on-change .*&amp;lt;/code&amp;gt; gesetzt wird.&lt;br /&gt;
&#039;&#039;&#039;Wichtig!&#039;&#039;&#039; Nicht verwechseln mit dem ASC Device dort darf &amp;lt;code&amp;gt;attr event-on-change&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; gesetzt sein!&lt;br /&gt;
* Wenn mehrere Rollladen gleichzeitig den Fahrbefehl bekommen, kann es (z. B. bei zwave) dazu kommen, dass ein Rollladen seinen Befehl nicht bekommt. Dies kann durch eine zeitverzögerte Aussendung der Fahrbefehle vermieden werden. Dazu in den jeweiligen Rollo Devices das Attribut ASC_Drive_DelayStart wie folgt benutzen im: ersten Rollo Device braucht das Attribut nicht gesetzt werden, im zweiten Rollo Device im Attribut ASC_Drive_DelayStart dann 4 Sekunden eintragen, im dritten Rollo Device im Attribut ASC_Drive_DelayStart 8 Sekunden eintragen, usw. Ein Abstand von 3-4 Sekunden ist dabei zielführend.&lt;br /&gt;
&lt;br /&gt;
==== Spezielle Hardware ====&lt;br /&gt;
{{Link2Forum|Topic=101182|LinkText=&amp;quot;Thread zu getesteter Hardware im Forum&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Link2Forum|Topic=92628|LinkText=&amp;quot;Thread zum Modul im Forum&amp;quot;}}&lt;br /&gt;
* {{Link2Forum|Topic=90751|LinkText=&amp;quot;Thread zur Entwicklung im Forum&amp;quot;}} &lt;br /&gt;
* {{Link2Forum|Topic=73964|LinkText=&amp;quot;Thread zu den Scripten von user cluni&amp;quot;}}, die der Entwicklung des Moduls zugrunde liegen&lt;br /&gt;
* Daten zum Sonnenstand z.B. hier https://www.sonnenverlauf.de/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Notify&amp;diff=35701</id>
		<title>Notify</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Notify&amp;diff=35701"/>
		<updated>2021-05-09T19:16:19Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:notify}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Ausführung von Anweisung(en) als Reaktion auf Ereignisse&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=notify&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=91_notify.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
{{Hinweis|Weitere grundlegende Informationen/Beispiele zu notify enthält [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM]}}&lt;br /&gt;
Das Hilfsmodul notify dient dazu [[Ereignis|Ereignisse]] über ein Suchmuster zu erkennen und bei einem Treffer eine Aktion auszulösen. Mit &#039;&#039;notify&#039;&#039; und anderen [[Eventhandler|Eventhandlern]] &amp;lt;ref&amp;gt;hierzu gehören u.a. auch [[DOIF]], [[THRESHOLD]] und [[watchdog]]&amp;lt;/ref&amp;gt; ist es möglich, Logikfunktionen im FHEM abzubilden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039; &lt;br /&gt;
* Wird das Licht in der Küche eingeschaltet, soll FHEM dort auch das Radio einschalten. &lt;br /&gt;
* Bei Druck auf einen Taster soll die Umwälzpumpe für das Warmwasser eingeschaltet werden. &lt;br /&gt;
* Erweiterte Möglichkeiten: Aber nur, wenn das Radio aus ist bzw. die Temperatur im Rücklauf des Warmwassers unterhalb einer bestimmten Schwelle liegt&amp;lt;ref&amp;gt;vgl. hierzu z.B. {{Link2CmdRef|Anker=devspec|Label=FILTER}} und [[if-condition]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; notify &amp;lt;Suchmuster&amp;gt; &amp;lt;command&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;[[Regulärer Ausdruck|Suchmuster]]&#039;&#039;  (häufig als Regexp = regular expression = regulärer Ausdruck bezeichnet) ist sehr wichtig: Es ist entweder der Name des auslösenden (&amp;quot;triggernden&amp;quot;) Gerätes oder die Kombination aus Gerät und auslösendem Ereignis (Event) &amp;lt;code&amp;gt;Gerätename:Event&amp;lt;/code&amp;gt;. Die Events kann man dem [[Event_monitor|Event-Monitor]] entnehmen. Wenn dort z.B. &amp;lt;code&amp;gt;Rollo1&amp;lt;/code&amp;gt; steht, dann reagiert &#039;&#039;notify&#039;&#039; auf &amp;lt;code&amp;gt;Rollo1 on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Rollo1 off&amp;lt;/code&amp;gt; usw.&lt;br /&gt;
&lt;br /&gt;
Wenn man mehrere Suchmuster kombinieren möchte, kann man diese in Klammer schreiben, als Trenner wird dann Pipe (|) genutzt: &amp;lt;code&amp;gt;(Rollo1|Rollo2|Steckdose5)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auch die Verwendung von Platzhaltern ist möglich&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;code&amp;gt;Rollo.&amp;lt;/code&amp;gt; → das notify reagiert auf alles was mit Rollo und &#039;&#039;&#039;einem&#039;&#039;&#039; weiteren beliebigen Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg&lt;br /&gt;
* &amp;lt;code&amp;gt;Rollo.*&amp;lt;/code&amp;gt; → notify reagiert auf alles das mit Rollo beginnt&lt;br /&gt;
* &amp;lt;code&amp;gt;.*isch&amp;lt;/code&amp;gt; → auf alles das mit isch aufhört (Tisch, Fisch)&lt;br /&gt;
* &amp;lt;code&amp;gt;Schalter(1|2|3)&amp;lt;/code&amp;gt; → hört auf Schalter1, Schalter2 und Schalter3&lt;br /&gt;
* &amp;lt;code&amp;gt;dimmer:pct:.(100|7[6-9]|[89][0-9])&amp;lt;/code&amp;gt;  → reagiert, wenn pct einen Wert über 75 annimmt.&lt;br /&gt;
&lt;br /&gt;
Suchmuster/Regex kann man im Internet beispielsweise auf [http://regexpal.com/| http://regexpal.com/] testen.&lt;br /&gt;
&lt;br /&gt;
Es gibt seit Juli 2020 eine Perlfunktion notifyRegexpCheck zum Testen, wie FHEM über das Suchmuster &amp;quot;denkt&amp;quot; - siehe {{Link2Forum|Topic=111938|Message=1074202|LinkText=diesen Beitrag}} im Forum.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Das &#039;&#039;&#039;Suchmuster&#039;&#039;&#039; wird notify-intern um das Zeichen ^ (beginnt mit) und das Zeichen $ (endet mit) ergänzt&amp;lt;ref&amp;gt;Der Eventhandler [[DOIF]] verwendet die in Perl übliche Syntax für reguläre Ausdrücke als DOIF-Suchmuster.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Deshalb darf das Suchmuster nicht mit einem üblichen [[Regulärer Ausdruck|&#039;&#039;&#039;Regulären Ausdruck&#039;&#039;&#039;]], wie er in Perl&amp;lt;ref&amp;gt;https://perldoc.perl.org/perlre.html&amp;lt;/ref&amp;gt; verwendet wird, gleichgesetzt werden, da die Ergänzung zu einem grundsätzlich unterschiedlichen Verhalten führt, siehe nachstehendes Beispiel.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel für das unterschiedliche Verhalten von &#039;&#039;Suchmuster&#039;&#039; und &#039;&#039;regulären Ausdruck&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für einen &#039;&#039;&#039;regulären Audruck&#039;&#039;&#039; gilt: Wenn  der reguläre Ausdruck &#039;&#039;lampe&#039;&#039; ist und das [[Ereignis]] &#039;&#039;tischlampe&#039;&#039; dann passen &#039;&#039;tischlampe&#039;&#039; und &#039;&#039;lampe&#039;&#039; zueinander.&lt;br /&gt;
&lt;br /&gt;
Für das &#039;&#039;&#039;Suchmuster&#039;&#039;&#039; gilt: Wenn  das Suchmuster &#039;&#039;lampe&#039;&#039; ist und das [[Ereignis]] &#039;&#039;tischlampe&#039;&#039; dann passen &#039;&#039;tischlampe&#039;&#039; und &#039;&#039;lampe&#039;&#039; &#039;&#039;&#039;nicht&#039;&#039;&#039; zueinander, weil das Suchmuster zu ^lampe$ ergänzt wird und damit exakt nur auf &#039;&#039;lampe&#039;&#039; matcht (passt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen Zuordnung zum Event&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  2020-01-21 22:40:39 HUEDevice VibrationTest1 battery: 88&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !!$NAME !! colspan=&amp;quot;2&amp;quot; |$EVENT&lt;br /&gt;
|-&lt;br /&gt;
| ||||$EVTPART0 ||$EVTPART1&lt;br /&gt;
|-&lt;br /&gt;
|2020-01-21 22:40:39 HUEDevice|| VibrationTest1|| battery:|| 88&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 2&#039;&#039;&#039;&lt;br /&gt;
  2021-05-09 19:11:43 FB_CALLMONITOR cm_example external_name: Graf Herzog von und zu ...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !!$NAME !! colspan=&amp;quot;7&amp;quot; |$EVENT&lt;br /&gt;
|-&lt;br /&gt;
| ||||$EVTPART0 ||$EVTPART1 || $EVTPART2|| $EVTPART3 || $EVTPART4|| $EVTPART5|| ...&lt;br /&gt;
|-&lt;br /&gt;
|2021-05-09 19:11:43 FB_CALLMONITOR|| cm_example|| external_name:|| Graf|| Herzog|| von|| und|| zu|| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FHEMWEB-unterstütztes Anlegen eines notify ==&lt;br /&gt;
{{Hinweis|Die Erstellung eines notify und insbesondere die korrekte Angabe des Suchmusters (Regex) führt gerade bei Einsteigern immer wieder zu Schwierigkeiten. Zur Fehlerminimierung empfiehlt es sich zum einen, die [[Konfiguration]] nicht direkt zu bearbeiten, sondern die &amp;quot;Befehl-Eingabezeile&amp;quot;, die &amp;quot;Objektdetails&amp;quot; oder den [[Import von Code Snippets|Import von RAW-Definitionen]] zur Bearbeitung zu nutzen.}}&lt;br /&gt;
&lt;br /&gt;
=== Event Monitor ===&lt;br /&gt;
Die komfortabelste Möglichkeit, die häufigsten Event-Handler zu erstellen, bietet der [[Event monitor|Event-Monitor]]. Die Vorgehensweis ist in dem zugehörigen Artikel dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Regexp wizard ===&lt;br /&gt;
Zudem enthält FHEM einen Regexp wizard mit dem Regex anhand der in FHEM vorhandenen Devices und deren Events aus einer Auswahlbox selektiert werden können. Voraussetzungen sind:&lt;br /&gt;
* Aktivierung des Hilfsmoduls [[eventTypes]] (bei allen Neuinstallationen Standard) &lt;br /&gt;
* das gesuchte Ereignis (Event) ist nach Aktivierung des Hilfsmoduls bereits mindestens einmal eingetreten&lt;br /&gt;
&lt;br /&gt;
Schrittweise Darstellung der Nutzung des Regexp wizard zur Anlage eines &amp;quot;notify&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
In das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] eingeben und mit {{Taste|Enter}} bestätigen:&lt;br /&gt;
 define ntest notify a b&lt;br /&gt;
Als Beispiel wird ein notify mit &amp;lt;name&amp;gt; &amp;quot;ntest&amp;quot; angelegt. &amp;quot;a&amp;quot; und &amp;quot;b&amp;quot; sind beliebige Platzhalter für &amp;lt;Suchmuster&amp;gt; und &amp;lt;Command&amp;gt;, die bei der weiteren Bearbeitung mit dem endgültigen Werten ersetzt werden.&lt;br /&gt;
Der Regexp wizard öffnet sich:&lt;br /&gt;
[[Datei:Regexp wizard1.JPG|400px|thumb|center]]&lt;br /&gt;
Nun in der Auswahlbox das auslösende Event (Ereignis) auswählen; zunächst das Device und dann das gewünschte Regex. Hier soll das notify bei jeder Veränderung der Temperatur (temperature.*) des Device BTHR918N reagieren. Abschließend mit einem Mausklick auf {{Taste|set}} bestätigen. Wählt man mehrere Regex in dieser Weise aus, so wird das &amp;quot;notify&amp;quot; bei Eintritt jedes dieser Events ausgeführt:&lt;br /&gt;
[[Datei:Regexp wizard2.JPG|400px|thumb|center]]&lt;br /&gt;
Anschließend den Platzhalter &amp;quot;a&amp;quot; mit Klick auf den Link &amp;quot;removeRegexpPart&amp;quot; löschen:&lt;br /&gt;
[[Datei:Regexp wizard3.JPG|400px|thumb|center]]&lt;br /&gt;
Den Link &amp;quot;DEF&amp;quot; anklicken, damit sich der DEF-Editor öffnet:&lt;br /&gt;
[[Datei:Regexp wizard4.JPG|400px|thumb|center]]&lt;br /&gt;
Jetzt den auszuführenden Befehl im &amp;quot;DEF&amp;quot;-Bereich durch Überschreiben des Platzhalters &amp;quot;b&amp;quot; eintragen und mit Klick auf {{Taste|modify ntest}} abschließen:&lt;br /&gt;
[[Datei:Regexp wizard5.JPG|400px|thumb|center]]&lt;br /&gt;
Das fertige und sofort aktive &amp;quot;notify&amp;quot; sieht abschließend folgendermaßen aus:&lt;br /&gt;
[[Datei:Regexp wizard6.JPG|400px|thumb|center]]&lt;br /&gt;
Am Schluss das Speichern über {{Taste|Save config}} nicht vergessen.&lt;br /&gt;
&lt;br /&gt;
== Mein notify geht nicht - wie kann ich mir selbst helfen: Debugging ==&lt;br /&gt;
Funktioniert ein notify nicht wie gewünscht, kann es nur zwei Hauptursachen haben: &lt;br /&gt;
* Entweder das Suchmuster paßt nicht zum gewünschten Auslöser (FHEM Device), und/oder&lt;br /&gt;
* die Anweisung enthält einen Fehler. &lt;br /&gt;
Sollte kein Fehler im Logfile auftauchen aber das notify ausgelöst werden, stimmt meist der Übertragungsweg zum Zieldevice nicht.&lt;br /&gt;
Der STATE des notify zeigt normalerweise mit Datum/Uhrzeit die letzte Auslösung an.&lt;br /&gt;
&lt;br /&gt;
Beim Debuggen sollte man daher beide Elemente getrennt untersuchen. Hier ein Beispiel welches nicht wie gewünscht funktioniert:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt; define n_test notify n_test:muster Ausführungsteil&amp;lt;/source&amp;gt;&lt;br /&gt;
Zum debuggen benötigen wir &lt;br /&gt;
* den [[Event monitor]]&lt;br /&gt;
* das [https://fhem.de/commandref.html#trigger trigger-Kommando] - kann man jederzeit verwenden um das Suchmuster als Event unabhängig vom Auslöser zu erzeugen.&lt;br /&gt;
* die FHEM Kommandozeile&lt;br /&gt;
* den [[DEF-Editor]]&lt;br /&gt;
* eventuell einen Texteditor um Codeblöcke zwischen zu lagern und Notizen zu machen.&lt;br /&gt;
&lt;br /&gt;
Das Suchmuster im Beispiel notify triggert auf sich selbst, es soll auf jeden Event mit dem Inhalt &#039;&#039;&#039;muster&#039;&#039;&#039; ausgelöst werden, Beispiel:&lt;br /&gt;
  2018-07-14 14:31:03 notify n_test muster bild&lt;br /&gt;
&lt;br /&gt;
=== Suchmuster ===&lt;br /&gt;
Sollte das notify nicht funktionieren:&lt;br /&gt;
* keine Reaktion wie gewünscht&lt;br /&gt;
* keine Fehlermeldung in der Weboberfläche beim Anlegen, keine Fehlermeldung im Logfile&lt;br /&gt;
* STATE ist unverändert auf active oder einem altem Datum/Uhrzeit&lt;br /&gt;
liegt der Fehler mit Sicherheit im Suchmuster. Man hat die Chance das Suchmuster mit dem trigger Befehl zu erzeugen und zu schauen ob die Anweisung ausgeführt wird. Dabei ist zu beachten: Der erste &amp;quot;:&amp;quot; im Suchmuster ist zusätzlich zwischen Gerät und Event als Trennung. Jeder weiter : ist, wenn vorhanden, Bestandteil des Events! Siehe dazu den Abschnitt [https://fhem.de/commandref_DE.html#notify Hinweise in der commandref]&lt;br /&gt;
*Im Beispiel: Event: n_test muster -&amp;gt; Suchmuster n_test:muster&lt;br /&gt;
Um aus dem [[Event]] ein passendes Suchmuster zu erzeugen kann der [[Event monitor|Event-Monitor]] direkt verwendet werden. Man kann ein neues notify erzeugen oder ein Bestehendes modifizieren lassen.&lt;br /&gt;
&lt;br /&gt;
Unser Regex im Beispiel ist zu spezifisch, es triggert nur exakt auf &#039;&#039;&#039;muster&#039;&#039;&#039;. Dieser Trigger erzeugt den folgenden Eintrag im Eventmonitor, entspricht exakt dem Suchmuster und löst das notify aus:&lt;br /&gt;
  trigger n_test muster&lt;br /&gt;
  2018-07-13 11:52:08 notify n_test muster&lt;br /&gt;
Das Suchmuster für unsere Anforderung muss in &amp;lt;code&amp;gt;n_test:muster.*&amp;lt;/code&amp;gt; geändert werden, damit jeder Event der mit muster beginnt das notify auslöst.&lt;br /&gt;
Der . im Regex steht für jedes beliebige Zeichen und der * für eine beliebige Anzahl des Zeichens davor: also beliebig viele beliebige Zeichen nach muster.&lt;br /&gt;
&lt;br /&gt;
Das Suchmuster wird häufig in ein komplizierteres Regex umgewandelt um im notify mehrere Aktionen zu starten. Das eigene Regex kann z.B. mit http://regexpal.com/ oder https://regex101.com/ getestet werden.&lt;br /&gt;
&lt;br /&gt;
Funktioniert der Auslöser, das notify tut aber noch nicht was es soll, müssen wir die Anweisung untersuchen. In unserem korrigierten Beispiel&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt; defmod n_test notify n_test:muster.* Ausführungsteil&amp;lt;/source&amp;gt;&lt;br /&gt;
folgt beim Kommando &amp;lt;code&amp;gt;trigger n_test muster bild&amp;lt;/code&amp;gt; ein Eintrag im Log:&lt;br /&gt;
  2018.07.13 11:47:57 3: n_test return value: Unknown command Ausführungsteil, try help.&lt;br /&gt;
Das notify wurde zwar getriggert aber die Anweisung war nicht ausführbar. &lt;br /&gt;
&lt;br /&gt;
Ein richtiges Suchmuster und eine fehlerhafte Anweisung wird also normalerweise einen Fehlereintrag im Logfile erzeugen!&lt;br /&gt;
&lt;br /&gt;
=== Spezialfall: notify löst zwar aus - aber zu oft ===&lt;br /&gt;
In dem Fall ist das Suchmuster (regExp) zu unscharf oder das triggernde Gerät löst das Event zu oft aus. Das regExp sollte so genau wie möglich konstruiert werden, device:.* ist eine einfache aber oft keine gute Wahl!&lt;br /&gt;
&lt;br /&gt;
Im Device, welches den Event auslöst, kann mit den Attributen event-on-.* die Häufigkeit gesteuert werden. Insbesondere ist hier das regExp .* eine Art Standardwahl um aufeinanderfolgende gleichartige Events zu verhindern.&lt;br /&gt;
:&amp;lt;code&amp;gt;attr device event-on-change-reading .*&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039;: durch falsche Angaben kann man Events ganz leicht völlig verhindern!&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[event-on-change-reading]]&lt;br /&gt;
&lt;br /&gt;
=== Anweisung ===&lt;br /&gt;
Wird das notify getriggert oder will man ganz schnell mal ein notify testen, kann man die Anweisung durch folgenden Code ersetzen, man öffnet also einfach nur die DEF, kopiert den ursprünglichen Inhalt an einen sicheren Ort und ersetzt die Anweisung durch eine der beiden Zeilen. Die erste Zeile kann man auch einfach mal in der Kommandozeile testen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;{Log 1, &amp;quot;Das Notify n_test hat ausgeloest.&amp;quot;}&lt;br /&gt;
{Log 1, &amp;quot;Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT&amp;quot;}&amp;lt;/source&amp;gt;&lt;br /&gt;
Wird das notify ausgelöst, muss anschließend im Logfile ein Eintrag zu finden sein:&lt;br /&gt;
  2018.07.13 10:28:57 1: Das Notify n_test hat ausgeloest, der Event sah so aus: muster&lt;br /&gt;
Unsere Anweisung &amp;lt;code&amp;gt;Ausführungsteil&amp;lt;/code&amp;gt; liefert in der Kommandozeile selbst einen Fehler:&lt;br /&gt;
&amp;lt;code&amp;gt;Unknown command Ausführungsteil, try help.&amp;lt;/code&amp;gt;&lt;br /&gt;
Ein Versuch mit geschweiften Klammern &amp;lt;code&amp;gt;{Ausführungsteil}&amp;lt;/code&amp;gt; liefert wieder einen Fehler:&lt;br /&gt;
&amp;lt;code&amp;gt;Unrecognized character \xC3; marked by &amp;lt;-- HERE after {Ausf&amp;lt;-- HERE near column 6 at (eval 5977) line 1.&amp;lt;/code&amp;gt;&lt;br /&gt;
Diese Variante &amp;lt;code&amp;gt;{&amp;quot;Ausführungsteil&amp;quot;}&amp;lt;/code&amp;gt; liefert den String Ausführungsteil ohne Fehler: Das notify arbeitet fehler- aber sinnfrei.&lt;br /&gt;
Der fertige Code:&lt;br /&gt;
  defmod n_test notify n_test:muster.* {&amp;quot;Ausführungsteil&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Man kann die Anweisung, normalerweise so wie sie ist, in der FHEM Kommandozeile testen. Sind im Perl Code (in geschweiften Klammern) im DEF Editor Semikolon enthalten muss man diese für den Test in der Kommandozeile (oder Raw Def) verdoppeln.&lt;br /&gt;
Laufzeitabhängige Variablen sind in der Kommandozeile meist nicht verfügbar, diese sollte man für den Test einfach durch passende Inhalte austauschen. So kann man die komfortable Variante (loggt den Namen und das komplette Event) nicht in der Kommandozeile ausführen. &lt;br /&gt;
&lt;br /&gt;
Funktioniert ein FHEM Befehl in der Kommandozeile nicht (z.B. Lampe geht nicht an) kann es im notify auch nicht funktionieren, dann muss die Fehlersuche an anderer Stelle fortgeführt werden. &lt;br /&gt;
&lt;br /&gt;
Komplexeren Code im Ausführungsteil sollte man beim Testen in Teilabschnitte aufteilen, von der Laufzeit abhängige Variable ($NAME, $EVENT, $EVTPART) durch Strings (&amp;quot;TestWort&amp;quot;) ersetzen, die Teilabschnitte separat testen und anschließend schrittweise wieder komplettieren.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
{{Hinweis|Für die nachfolgenden Beispiele wurden einige unterschiedliche Technologien verwendet. Sie können aber recht einfach auf alle anderen Systeme übertragen werden, dabei sollte ggf. darauf geachtet werden, dass sich Schaltbefehle und Events teilweise je nach konkret eingesetzter Technologie unterscheiden können. Dann ist ggf. eine Erweiterung, z.B. durch eine [[if-condition|if-Abfrage]] erforderlich.}}&lt;br /&gt;
&lt;br /&gt;
=== Schalter entprellen ===&lt;br /&gt;
Will man ein notify innerhalb eines bestimmten Zeitraumes nur einmal auslösen lassen, auch wenn er in diesem Zeitraum mehrfach getriggered werden sollte, so bietet sich das Attribut disabledAfterTrigger an,&lt;br /&gt;
 attr &amp;lt;notify_device&amp;gt; disabledAfterTrigger &amp;lt;Anzahl Sekunden&amp;gt;&lt;br /&gt;
In dem Zeitraum wird dann nur einmal (beim ersten Mal) der Befehl ausgelöst, auch wenn mehrfach getriggered wurde. Der Zeitraum kann Bruchteile von Sekunden umfassen.&lt;br /&gt;
&lt;br /&gt;
=== Etwas schalten, wenn ein anderes Gerät geschaltet wird ===&lt;br /&gt;
&lt;br /&gt;
==== Vorbedingungen ====&lt;br /&gt;
Dieses Beispiel verwendet eine einfache InterTechno-kompatible Funksteckdose für das Radio und einen HM-Aktor für das Licht:&lt;br /&gt;
&lt;br /&gt;
 define RadioKueche IT 000000FFFF 0F F0&lt;br /&gt;
 define LichtKueche CUL_HM 3A37D6&lt;br /&gt;
Beachte: beide kennen als Event bzw. Schaltbefehle &#039;&#039;on&#039;&#039; und &#039;&#039;off&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define LichtamRadioan notify LichtKueche set RadioKueche $EVENT &lt;br /&gt;
oder alternativ: &lt;br /&gt;
 define LichtamRadioan notify LichtKueche { fhem &amp;quot;set RadioKueche $EVENT&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
* Der Name des &#039;&#039;notify&#039;&#039; &amp;quot;LichtamRadioan&amp;quot; kann frei gewählt werden, er dient nur dazu, das notify in FHEM eindeutig zu identifizieren.&lt;br /&gt;
* &amp;quot;$EVENT&amp;quot; ist ein Platzhalter für den Zustand vom Pattern. $EVENT enthält ein &amp;quot;off&amp;quot; wenn das LichtKueche aus- und ein &amp;quot;on&amp;quot; wenn das Licht eingeschaltet wird.&lt;br /&gt;
* &amp;quot;{ &amp;amp;lt;perlcode&amp;amp;gt; }&amp;quot; alles was zwischen {} steht ist Perl code. Perl kennt das Schlüsselwort fhem. Das Schlüsselwort FHEM dient dazu, FHEM Befehle auszuführen. Es wird also der FHEM Befehl &amp;quot;set RadioKueche on/off&amp;quot; ausgeführt. on oder off ist abhängig vom Pattern. Der eigentliche FHEM Befehl muss in &amp;quot; &amp;quot; stehen.&lt;br /&gt;
* Wann ist ein Wechsel auf die Perl-Ebene erforderlich? &lt;br /&gt;
** einfache FHEM-Befehle sollten in der Regel direkt verwendet werden, dies ist ressourcenschonender.&lt;br /&gt;
** Immer dann, wenn dies nicht möglich ist, weil z.B. komplexerer Code ausgeführt werden soll, (blockierende) Prozesse ausgelagert werden sollten oder Systembefehle ausgeführt werden, ist es günstiger, auf die Perl-Ebene zu wechseln &amp;lt;ref&amp;gt;In diesem {{Link2Forum|Topic=88398|Message=808685|LinkText=Forenbeitrag}} wird z.B. erläutert, wie man nichtblockierend externe Scripte aufrufen kann, die dann ihre Ergebnisse wieder an FHEM übergeben.&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird ===&lt;br /&gt;
Dieses Beispiel verwendet einen HM-Aktor für das Licht sowie zwei Milight-Birnen, die einzeln geschaltet werden sollen&amp;lt;ref&amp;gt;Dies ist ausdrücklich keine Empfehlung für diese Technologie und der Module&amp;lt;/ref&amp;gt; in den Stehlampen:&lt;br /&gt;
&lt;br /&gt;
==== Vorbedingungen ====&lt;br /&gt;
FHEM:&lt;br /&gt;
 define LichtWZ CUL_HM 3A37D8&lt;br /&gt;
 define Stehlampe1 MilightDevice RGBW Milight_Wohnzimmer 5&lt;br /&gt;
 define Stehlampe2 MilightDevice RGBW Milight_Wohnzimmer 6&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define SteckdoseWZein notify LichtWZ set Stehlampe1,Stehlampe2 $EVENT&lt;br /&gt;
oder &#039;&#039;in Perl&#039;&#039;&lt;br /&gt;
 define SteckdoseWZein notify LichtWZ { fhem &amp;quot;set Stehlampe1 $EVENT;;set Stehlampe2 $EVENT &amp;quot; } &lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Wenn das LichtWZ eingeschaltet wird, dann werden auch die Stehlampen (1 und 2) eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
=== Einfache ODER Funktion ===&lt;br /&gt;
Eine einfache ODER Funktion kann sehr einfach realisiert werden&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
KNX:&lt;br /&gt;
* 3x GAs der abzufragende Werte (0/0/40 0/0/41 0/0/42)&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
 define Licht1 CUL_HM 3A37D8&lt;br /&gt;
 define Licht2 CUL_HM 1B7EC3&lt;br /&gt;
 define Stehlampe MilightDevice RGBW Milight_Wohnzimmer 7&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define SteckdoseWZein notify (Licht1|Licht2) set Stehlampe $EVENT &lt;br /&gt;
oder&lt;br /&gt;
 define SteckdoseWZein notify (Licht.) set Stehlampe $EVENT&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Die Werte in der Klammer (wichtig ist das »|«) sind die Rückgabewerte. Alternativ kann in diesem Beispiel auch »Licht.«  (zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für (genau) ein beliebiges Zeichen.&lt;br /&gt;
&lt;br /&gt;
Danach folgt der set Befehl.&lt;br /&gt;
Wenn also das Licht1 oder Licht2 den Wert &amp;quot;on&amp;quot; hat, dann hat auch die Steckdose den Wert &amp;quot;on&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alternative: [[structure]]&lt;br /&gt;
&lt;br /&gt;
=== Einfache UND Funktion ===&lt;br /&gt;
Ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezweifeln. In FHEM fehlen Loggingfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ).&lt;br /&gt;
Dadurch ist FHEM zwar mächtig, wird aber für viele sehr kompliziert.&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
KNX:&lt;br /&gt;
* 3x GDs für die Rückgabewert Rollo geschlossen == 1 (0/0/50 0/0/51 0/0/52)&lt;br /&gt;
* GD LED am Lichtschalter (0/0/106)&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
 define R1ZU KNX 0/0/50:dpt1.009&lt;br /&gt;
 attr R1ZU dummy 1&lt;br /&gt;
 define R2ZU KNX 0/0/51:dpt1.009&lt;br /&gt;
 attr R2ZU dummy 1&lt;br /&gt;
 define R3ZU KNX 0/0/52:dpt1.009&lt;br /&gt;
 attr R3ZU dummy 1&lt;br /&gt;
 define LEDalleRolloZu KNX 0/0/106:dpt1&lt;br /&gt;
Durch das Attribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define nt.allerolloszu notify (R1ZU|R2ZU|R3ZU) {&lt;br /&gt;
 my $r1 = Value(&amp;quot;R1ZU&amp;quot;);;&lt;br /&gt;
 my $r2 = Value(&amp;quot;R2ZU&amp;quot;);;&lt;br /&gt;
 my $r3 = Value(&amp;quot;R3ZU&amp;quot;);;&lt;br /&gt;
 if ($r1 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r2 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r3 eq &amp;quot;on&amp;quot;) {&lt;br /&gt;
   fhem(&amp;quot;set LEDalleRolloZu on&amp;quot;);;&lt;br /&gt;
 } else {&lt;br /&gt;
   fhem(&amp;quot;set LEDalleRolloZu off&amp;quot;);;&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet. Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }&lt;br /&gt;
&lt;br /&gt;
my $r1 =&amp;amp;gt; Variable $r1 definieren&lt;br /&gt;
= Value(&amp;quot;R1ZU&amp;quot;);; ==&amp;amp;gt; weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu &lt;br /&gt;
&lt;br /&gt;
Der doppelte ;; ist ein FHEM Thema. Eigentlich würde für Perl ein ; reichen. Aber FHEM nutzt selbst das ; und daher wird ein ;; benötigt. Mit den ersten drei my Zeilen werden die Rückgabewerte den Variablen zugewiesen.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt ein normales &amp;quot;if then else&amp;quot; Konstrukt. Die Zeile »($r1 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r2 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r3 eq &amp;quot;on&amp;quot;)«&amp;amp;#160;kann man so lesen: Wenn $r1 den Wert &amp;quot;on&amp;quot; und (&amp;amp;amp;&amp;amp;amp;) $r2 den Wert &amp;quot;on&amp;quot; und $r3 den Wert &amp;quot;on&amp;quot; dann schalte die LEDalleRolloZu ein {fhem(&amp;quot;set LEDalleRolloZu on&amp;quot;)}&lt;br /&gt;
ansonsten else schalte die LED aus. {fhem(&amp;quot;set LEDalleRolloZu off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Alternative: [[structure]]&lt;br /&gt;
&lt;br /&gt;
=== Zeitverzögert schalten ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Aufgabe:&#039;&#039;&#039; || Zeitverzögert schalten&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Beschreibung:&#039;&#039;&#039; || Mit einem Notify zeitverzögert eine Aktion auslösen.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Vorbereitung:&#039;&#039;&#039; || Gerät &amp;quot;Lampe&amp;quot; ist definiert und es gibt eine Situation, die ein Ereignis &amp;quot;Fernbedienung:.*&amp;quot; generiert.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Befehl:&#039;&#039;&#039; || &amp;lt;code&amp;gt;define ntfy1 notify Fernbedienung:.* sleep 7.5;; set Lampe $EVENT&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Erläuterungen:&#039;&#039;&#039; || Bei Eintreten eines Ereignisses &amp;quot;Fernbedienung*&amp;quot; wird nach einer Pause von siebeneinhalb Sekunden der Befehl &amp;lt;set Lampe ??&amp;gt; ausgeführt, wobei der eigentliche Befehl aus dem auslösenden Ereignis übernommen wird.&lt;br /&gt;
:&#039;&#039;Quelle: {{Link2Forum|Topic=17161|LinkText=FHEM Forum}}&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig) ===&lt;br /&gt;
Hier ein kleines Beispiel, wie man mit Hilfe einer PV-Anlage die Sonneneinstrahlung auf der Südseite ermittelt und dies zur Rolladensteuerung nutzt.&lt;br /&gt;
Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel)&lt;br /&gt;
Optional: Die Funktion soll nur zwischen dem 6. und 9. Monat funktioneren. (drittes Beispiel)&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
PV Anlage mit SolarView abfragen.&lt;br /&gt;
Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schließen.&lt;br /&gt;
&lt;br /&gt;
==== notify Syntax ====&lt;br /&gt;
FHEM:&lt;br /&gt;
&lt;br /&gt;
 define sv SolarView solarview 15000 wr1 wr2 wr3 wr4                           &amp;lt;----vier Wechselrichter&lt;br /&gt;
 attr sv event-on-change-reading currentPower                                &lt;br /&gt;
&lt;br /&gt;
 define nt.sonnenlichtpersolar notify (sv:currentPower.*) { &lt;br /&gt;
  if ($EVTPART1 &amp;amp;lt; 3000 ) {&lt;br /&gt;
  fhem(&#039;set Flur1 Auf&#039;);&lt;br /&gt;
 }else {&lt;br /&gt;
  if ($EVTPART1 &amp;amp;gt; 5000 ) {&lt;br /&gt;
  fhem(&#039;set Flur1 Ab&#039;);&lt;br /&gt;
  } &lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Optional 1: Zeitabhängig&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
 (sv:currentPower.*) { &lt;br /&gt;
  my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&lt;br /&gt;
   if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;) { &lt;br /&gt;
   if ($EVTPART1 &amp;lt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Auf&#039;);&lt;br /&gt;
    }else {&lt;br /&gt;
    if ($EVTPART1 &amp;gt; 8000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Ab&#039;);&lt;br /&gt;
    } &lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Optional 2: Zeit und Datum&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
 (sv:currentPower.*) { &lt;br /&gt;
  my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&lt;br /&gt;
  if ($month &amp;gt;= 6 &amp;amp;&amp;amp; $month &amp;lt;= 9) {&lt;br /&gt;
   if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;) { &lt;br /&gt;
   if ($EVTPART1 &amp;lt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1,RBUERO1,RBUERO2 Auf&#039;);&lt;br /&gt;
    }else {&lt;br /&gt;
    if ($EVTPART1 &amp;gt; 8000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1,Flur2,RBUERO1,RBUERO2 Ab&#039;);&lt;br /&gt;
    } &lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
* Das define wird in der Kommandozeile im Webbrowser eingegeben.&lt;br /&gt;
* Anschließend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl&lt;br /&gt;
* define sv SolarView ... &amp;lt;==== ist die Schnittstelle vom SolarView&lt;br /&gt;
* define nt.sonnenlichtpersolar notify (sv:currentPower.*) { &amp;lt;==== hier wird ein notify angelegt, der auf das &amp;quot;define sv&amp;quot; Wert &amp;quot;currentPower.*&amp;quot; (.* ist irgendwas) reagiert&lt;br /&gt;
  if ($EVTPART1 &amp;amp;lt; 3000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Auf&#039;);&lt;br /&gt;
  }else {&lt;br /&gt;
   if ($EVTPART1 &amp;amp;gt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Ab&#039;);&lt;br /&gt;
  } &lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
Diese if-Funktion wertet den Rückgabewert von currentPower aus. Hierbei muss man wissen, dass $EVTPART1 das Split-Ergebnis vom Rückgabewert ist&lt;br /&gt;
&lt;br /&gt;
Beispiel: Der Rückgabewert (wie im Beispiel) ist &amp;quot;currentPower: 6000&amp;quot;.&lt;br /&gt;
Jetzt steht im &amp;quot;$EVTPART0 == currentPower:&amp;quot; und im &amp;quot;$EVTPART1 == 6000&amp;quot;&lt;br /&gt;
Das bedeutet, dass man sich nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken muss, dies übernimmt vielmehr FHEM.&lt;br /&gt;
&lt;br /&gt;
Ergebnis: &lt;br /&gt;
Das Rollo wird abhängig von der erzeugten IST_Strommenge auf und zu gefahren.&lt;br /&gt;
Damit dies nicht dauernd hin und her pendelt, wurde der Auf Wert sehr klein und den Ab Wert sehr groß gewählt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional 1:&#039;&#039;&#039; Der Block &amp;quot;my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&amp;quot; erzeugt die String-Variable $hm mit dem Inhalt $hour:$min. %02d begrenzt die Ausgabe auf zwei Stellen.&lt;br /&gt;
Danach wird mit &amp;quot;if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;)&amp;quot; mit stringvergleichenden Operatoren geprüft, ob die Uhrzeit zwischen 9:30 und 17:00 liegt (lt = kleiner als; gt = größer als). Es wäre auch ein le und ge möglich: le =  kleiner/gleich als, ge =  größer/gleich als.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional 2:&#039;&#039;&#039;if( $month &amp;gt;= 6 &amp;amp;&amp;amp; $month &amp;lt;= 9) {&lt;br /&gt;
&lt;br /&gt;
Hier wird die numerische FHEM-Standard-Variable $month (Monat) auf größer/gleich bzw kleiner/gleich mit den binären Operatoren überprüft.&lt;br /&gt;
Die Funktion arbeitet also nur zwischen dem 6. und dem 9. Monat und dann auch nur zwischen 9:31 und 16:59.&lt;br /&gt;
&lt;br /&gt;
=== Status eines Kippfensters mit 2 Fensterkontakten abbilden ===&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
Es ist je ein Fensterkontakt der &#039;&#039;open&#039;&#039; oder &#039;&#039;closed&#039;&#039; meldet, oben und unten am Fenster angebracht.&lt;br /&gt;
Die Namen der beiden FHEM-Devices sind &#039;&#039;fensterKontaktOben&#039;&#039; und &#039;&#039;fensterKontaktUnten&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== notify Syntax ====&lt;br /&gt;
FHEM:&lt;br /&gt;
 define statusFenster notify fensterKontakt(Oben|Unten):(open|closed) {&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039;)&lt;br /&gt;
        { fhem &#039;set Terrassentuer open&#039; }&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039;)&lt;br /&gt;
        { fhem &#039;set Terrassentuer closed&#039; }&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039;)&lt;br /&gt;
        { fhem &#039;set Terrassentuer tilted&#039; }&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039;)&lt;br /&gt;
        { fhem &#039;set Terrassentuer undef&#039; }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Weitere Hinweise ==&lt;br /&gt;
* Entsprechend zu $EVENT gibt es auch noch $NAME und $TYPE. $NAME und $TYPE enthalten den Namen bzw. Typ des Ereignis auslösenden Gerätes.&lt;br /&gt;
* Wird der Perl-Code in einem &amp;lt;code&amp;gt;notify&amp;lt;/code&amp;gt; immer länger, lagere den Code wegen der Übersichtlichkeit in eine eigene Programmdatei aus, wie in [[99_myUtils anlegen]] beschrieben.&lt;br /&gt;
* Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreibt, muss man anscheinend darauf achten, dass keine abschließende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.&lt;br /&gt;
* Dieser {{Link2Forum|Topic=38520|Message=307325}} enthält Vorschläge zur Vorgehensweise bei der Erstellung von komplexen &#039;&#039;notify&#039;&#039; Definitionen bzw. bei deren Fehlerbehebung.&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
* [[Escapen in Perlbefehlen]]&lt;br /&gt;
* [[Klammerebenen]]&lt;br /&gt;
* Forenbeitrag zum Thema {{Link2Forum|Topic=115414|LinkText=Optimierung des Suchmusters - NOTIFYDEV}}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Hilfsmodul]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Notify&amp;diff=35687</id>
		<title>Notify</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Notify&amp;diff=35687"/>
		<updated>2021-05-09T18:16:22Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:notify}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Ausführung von Anweisung(en) als Reaktion auf Ereignisse&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=notify&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=91_notify.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
{{Hinweis|Weitere grundlegende Informationen/Beispiele zu notify enthält [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM]}}&lt;br /&gt;
Das Hilfsmodul notify dient dazu [[Ereignis|Ereignisse]] über ein Suchmuster zu erkennen und bei einem Treffer eine Aktion auszulösen. Mit &#039;&#039;notify&#039;&#039; und anderen [[Eventhandler|Eventhandlern]] &amp;lt;ref&amp;gt;hierzu gehören u.a. auch [[DOIF]], [[THRESHOLD]] und [[watchdog]]&amp;lt;/ref&amp;gt; ist es möglich, Logikfunktionen im FHEM abzubilden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039; &lt;br /&gt;
* Wird das Licht in der Küche eingeschaltet, soll FHEM dort auch das Radio einschalten. &lt;br /&gt;
* Bei Druck auf einen Taster soll die Umwälzpumpe für das Warmwasser eingeschaltet werden. &lt;br /&gt;
* Erweiterte Möglichkeiten: Aber nur, wenn das Radio aus ist bzw. die Temperatur im Rücklauf des Warmwassers unterhalb einer bestimmten Schwelle liegt&amp;lt;ref&amp;gt;vgl. hierzu z.B. {{Link2CmdRef|Anker=devspec|Label=FILTER}} und [[if-condition]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; notify &amp;lt;Suchmuster&amp;gt; &amp;lt;command&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;[[Regulärer Ausdruck|Suchmuster]]&#039;&#039;  (häufig als Regexp = regular expression = regulärer Ausdruck bezeichnet) ist sehr wichtig: Es ist entweder der Name des auslösenden (&amp;quot;triggernden&amp;quot;) Gerätes oder die Kombination aus Gerät und auslösendem Ereignis (Event) &amp;lt;code&amp;gt;Gerätename:Event&amp;lt;/code&amp;gt;. Die Events kann man dem [[Event_monitor|Event-Monitor]] entnehmen. Wenn dort z.B. &amp;lt;code&amp;gt;Rollo1&amp;lt;/code&amp;gt; steht, dann reagiert &#039;&#039;notify&#039;&#039; auf &amp;lt;code&amp;gt;Rollo1 on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Rollo1 off&amp;lt;/code&amp;gt; usw.&lt;br /&gt;
&lt;br /&gt;
Wenn man mehrere Suchmuster kombinieren möchte, kann man diese in Klammer schreiben, als Trenner wird dann Pipe (|) genutzt: &amp;lt;code&amp;gt;(Rollo1|Rollo2|Steckdose5)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auch die Verwendung von Platzhaltern ist möglich&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;code&amp;gt;Rollo.&amp;lt;/code&amp;gt; → das notify reagiert auf alles was mit Rollo und &#039;&#039;&#039;einem&#039;&#039;&#039; weiteren beliebigen Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg&lt;br /&gt;
* &amp;lt;code&amp;gt;Rollo.*&amp;lt;/code&amp;gt; → notify reagiert auf alles das mit Rollo beginnt&lt;br /&gt;
* &amp;lt;code&amp;gt;.*isch&amp;lt;/code&amp;gt; → auf alles das mit isch aufhört (Tisch, Fisch)&lt;br /&gt;
* &amp;lt;code&amp;gt;Schalter(1|2|3)&amp;lt;/code&amp;gt; → hört auf Schalter1, Schalter2 und Schalter3&lt;br /&gt;
* &amp;lt;code&amp;gt;dimmer:pct:.(100|7[6-9]|[89][0-9])&amp;lt;/code&amp;gt;  → reagiert, wenn pct einen Wert über 75 annimmt.&lt;br /&gt;
&lt;br /&gt;
Suchmuster/Regex kann man im Internet beispielsweise auf [http://regexpal.com/| http://regexpal.com/] testen.&lt;br /&gt;
&lt;br /&gt;
Es gibt seit Juli 2020 eine Perlfunktion notifyRegexpCheck zum Testen, wie FHEM über das Suchmuster &amp;quot;denkt&amp;quot; - siehe {{Link2Forum|Topic=111938|Message=1074202|LinkText=diesen Beitrag}} im Forum.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Das &#039;&#039;&#039;Suchmuster&#039;&#039;&#039; wird notify-intern um das Zeichen ^ (beginnt mit) und das Zeichen $ (endet mit) ergänzt&amp;lt;ref&amp;gt;Der Eventhandler [[DOIF]] verwendet die in Perl übliche Syntax für reguläre Ausdrücke als DOIF-Suchmuster.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Deshalb darf das Suchmuster nicht mit einem üblichen [[Regulärer Ausdruck|&#039;&#039;&#039;Regulären Ausdruck&#039;&#039;&#039;]], wie er in Perl&amp;lt;ref&amp;gt;https://perldoc.perl.org/perlre.html&amp;lt;/ref&amp;gt; verwendet wird, gleichgesetzt werden, da die Ergänzung zu einem grundsätzlich unterschiedlichen Verhalten führt, siehe nachstehendes Beispiel.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel für das unterschiedliche Verhalten von &#039;&#039;Suchmuster&#039;&#039; und &#039;&#039;regulären Ausdruck&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für einen &#039;&#039;&#039;regulären Audruck&#039;&#039;&#039; gilt: Wenn  der reguläre Ausdruck &#039;&#039;lampe&#039;&#039; ist und das [[Ereignis]] &#039;&#039;tischlampe&#039;&#039; dann passen &#039;&#039;tischlampe&#039;&#039; und &#039;&#039;lampe&#039;&#039; zueinander.&lt;br /&gt;
&lt;br /&gt;
Für das &#039;&#039;&#039;Suchmuster&#039;&#039;&#039; gilt: Wenn  das Suchmuster &#039;&#039;lampe&#039;&#039; ist und das [[Ereignis]] &#039;&#039;tischlampe&#039;&#039; dann passen &#039;&#039;tischlampe&#039;&#039; und &#039;&#039;lampe&#039;&#039; &#039;&#039;&#039;nicht&#039;&#039;&#039; zueinander, weil das Suchmuster zu ^lampe$ ergänzt wird und damit exakt nur auf &#039;&#039;lampe&#039;&#039; matcht (passt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen Zuordnung zum Event&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  2020-01-21 22:40:39 HUEDevice VibrationTest1 battery: 88&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !!$NAME !! colspan=&amp;quot;2&amp;quot; |$EVENT&lt;br /&gt;
|-&lt;br /&gt;
| ||||$EVTPART0 ||$EVTPART1&lt;br /&gt;
|-&lt;br /&gt;
|2020-01-21 22:40:39 HUEDevice|| VibrationTest1|| battery:|| 88&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 2&#039;&#039;&#039;&lt;br /&gt;
  2021-05-09 19:11:43 FB_CALLMONITOR cm_example external_name: Graf Herzog von und zu&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !!$NAME !! colspan=&amp;quot;6&amp;quot; |$EVENT&lt;br /&gt;
|-&lt;br /&gt;
| ||||$EVTPART0 ||$EVTPART1 || $EVTPART2|| $EVTPART3 || $EVTPART4|| $EVTPART5&lt;br /&gt;
|-&lt;br /&gt;
|2021-05-09 19:11:43 FB_CALLMONITOR|| cm_example|| external_name:|| Graf|| Herzog|| von|| und|| zu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FHEMWEB-unterstütztes Anlegen eines notify ==&lt;br /&gt;
{{Hinweis|Die Erstellung eines notify und insbesondere die korrekte Angabe des Suchmusters (Regex) führt gerade bei Einsteigern immer wieder zu Schwierigkeiten. Zur Fehlerminimierung empfiehlt es sich zum einen, die [[Konfiguration]] nicht direkt zu bearbeiten, sondern die &amp;quot;Befehl-Eingabezeile&amp;quot;, die &amp;quot;Objektdetails&amp;quot; oder den [[Import von Code Snippets|Import von RAW-Definitionen]] zur Bearbeitung zu nutzen.}}&lt;br /&gt;
&lt;br /&gt;
=== Event Monitor ===&lt;br /&gt;
Die komfortabelste Möglichkeit, die häufigsten Event-Handler zu erstellen, bietet der [[Event monitor|Event-Monitor]]. Die Vorgehensweis ist in dem zugehörigen Artikel dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Regexp wizard ===&lt;br /&gt;
Zudem enthält FHEM einen Regexp wizard mit dem Regex anhand der in FHEM vorhandenen Devices und deren Events aus einer Auswahlbox selektiert werden können. Voraussetzungen sind:&lt;br /&gt;
* Aktivierung des Hilfsmoduls [[eventTypes]] (bei allen Neuinstallationen Standard) &lt;br /&gt;
* das gesuchte Ereignis (Event) ist nach Aktivierung des Hilfsmoduls bereits mindestens einmal eingetreten&lt;br /&gt;
&lt;br /&gt;
Schrittweise Darstellung der Nutzung des Regexp wizard zur Anlage eines &amp;quot;notify&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
In das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] eingeben und mit {{Taste|Enter}} bestätigen:&lt;br /&gt;
 define ntest notify a b&lt;br /&gt;
Als Beispiel wird ein notify mit &amp;lt;name&amp;gt; &amp;quot;ntest&amp;quot; angelegt. &amp;quot;a&amp;quot; und &amp;quot;b&amp;quot; sind beliebige Platzhalter für &amp;lt;Suchmuster&amp;gt; und &amp;lt;Command&amp;gt;, die bei der weiteren Bearbeitung mit dem endgültigen Werten ersetzt werden.&lt;br /&gt;
Der Regexp wizard öffnet sich:&lt;br /&gt;
[[Datei:Regexp wizard1.JPG|400px|thumb|center]]&lt;br /&gt;
Nun in der Auswahlbox das auslösende Event (Ereignis) auswählen; zunächst das Device und dann das gewünschte Regex. Hier soll das notify bei jeder Veränderung der Temperatur (temperature.*) des Device BTHR918N reagieren. Abschließend mit einem Mausklick auf {{Taste|set}} bestätigen. Wählt man mehrere Regex in dieser Weise aus, so wird das &amp;quot;notify&amp;quot; bei Eintritt jedes dieser Events ausgeführt:&lt;br /&gt;
[[Datei:Regexp wizard2.JPG|400px|thumb|center]]&lt;br /&gt;
Anschließend den Platzhalter &amp;quot;a&amp;quot; mit Klick auf den Link &amp;quot;removeRegexpPart&amp;quot; löschen:&lt;br /&gt;
[[Datei:Regexp wizard3.JPG|400px|thumb|center]]&lt;br /&gt;
Den Link &amp;quot;DEF&amp;quot; anklicken, damit sich der DEF-Editor öffnet:&lt;br /&gt;
[[Datei:Regexp wizard4.JPG|400px|thumb|center]]&lt;br /&gt;
Jetzt den auszuführenden Befehl im &amp;quot;DEF&amp;quot;-Bereich durch Überschreiben des Platzhalters &amp;quot;b&amp;quot; eintragen und mit Klick auf {{Taste|modify ntest}} abschließen:&lt;br /&gt;
[[Datei:Regexp wizard5.JPG|400px|thumb|center]]&lt;br /&gt;
Das fertige und sofort aktive &amp;quot;notify&amp;quot; sieht abschließend folgendermaßen aus:&lt;br /&gt;
[[Datei:Regexp wizard6.JPG|400px|thumb|center]]&lt;br /&gt;
Am Schluss das Speichern über {{Taste|Save config}} nicht vergessen.&lt;br /&gt;
&lt;br /&gt;
== Mein notify geht nicht - wie kann ich mir selbst helfen: Debugging ==&lt;br /&gt;
Funktioniert ein notify nicht wie gewünscht, kann es nur zwei Hauptursachen haben: &lt;br /&gt;
* Entweder das Suchmuster paßt nicht zum gewünschten Auslöser (FHEM Device), und/oder&lt;br /&gt;
* die Anweisung enthält einen Fehler. &lt;br /&gt;
Sollte kein Fehler im Logfile auftauchen aber das notify ausgelöst werden, stimmt meist der Übertragungsweg zum Zieldevice nicht.&lt;br /&gt;
Der STATE des notify zeigt normalerweise mit Datum/Uhrzeit die letzte Auslösung an.&lt;br /&gt;
&lt;br /&gt;
Beim Debuggen sollte man daher beide Elemente getrennt untersuchen. Hier ein Beispiel welches nicht wie gewünscht funktioniert:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt; define n_test notify n_test:muster Ausführungsteil&amp;lt;/source&amp;gt;&lt;br /&gt;
Zum debuggen benötigen wir &lt;br /&gt;
* den [[Event monitor]]&lt;br /&gt;
* das [https://fhem.de/commandref.html#trigger trigger-Kommando] - kann man jederzeit verwenden um das Suchmuster als Event unabhängig vom Auslöser zu erzeugen.&lt;br /&gt;
* die FHEM Kommandozeile&lt;br /&gt;
* den [[DEF-Editor]]&lt;br /&gt;
* eventuell einen Texteditor um Codeblöcke zwischen zu lagern und Notizen zu machen.&lt;br /&gt;
&lt;br /&gt;
Das Suchmuster im Beispiel notify triggert auf sich selbst, es soll auf jeden Event mit dem Inhalt &#039;&#039;&#039;muster&#039;&#039;&#039; ausgelöst werden, Beispiel:&lt;br /&gt;
  2018-07-14 14:31:03 notify n_test muster bild&lt;br /&gt;
&lt;br /&gt;
=== Suchmuster ===&lt;br /&gt;
Sollte das notify nicht funktionieren:&lt;br /&gt;
* keine Reaktion wie gewünscht&lt;br /&gt;
* keine Fehlermeldung in der Weboberfläche beim Anlegen, keine Fehlermeldung im Logfile&lt;br /&gt;
* STATE ist unverändert auf active oder einem altem Datum/Uhrzeit&lt;br /&gt;
liegt der Fehler mit Sicherheit im Suchmuster. Man hat die Chance das Suchmuster mit dem trigger Befehl zu erzeugen und zu schauen ob die Anweisung ausgeführt wird. Dabei ist zu beachten: Der erste &amp;quot;:&amp;quot; im Suchmuster ist zusätzlich zwischen Gerät und Event als Trennung. Jeder weiter : ist, wenn vorhanden, Bestandteil des Events! Siehe dazu den Abschnitt [https://fhem.de/commandref_DE.html#notify Hinweise in der commandref]&lt;br /&gt;
*Im Beispiel: Event: n_test muster -&amp;gt; Suchmuster n_test:muster&lt;br /&gt;
Um aus dem [[Event]] ein passendes Suchmuster zu erzeugen kann der [[Event monitor|Event-Monitor]] direkt verwendet werden. Man kann ein neues notify erzeugen oder ein Bestehendes modifizieren lassen.&lt;br /&gt;
&lt;br /&gt;
Unser Regex im Beispiel ist zu spezifisch, es triggert nur exakt auf &#039;&#039;&#039;muster&#039;&#039;&#039;. Dieser Trigger erzeugt den folgenden Eintrag im Eventmonitor, entspricht exakt dem Suchmuster und löst das notify aus:&lt;br /&gt;
  trigger n_test muster&lt;br /&gt;
  2018-07-13 11:52:08 notify n_test muster&lt;br /&gt;
Das Suchmuster für unsere Anforderung muss in &amp;lt;code&amp;gt;n_test:muster.*&amp;lt;/code&amp;gt; geändert werden, damit jeder Event der mit muster beginnt das notify auslöst.&lt;br /&gt;
Der . im Regex steht für jedes beliebige Zeichen und der * für eine beliebige Anzahl des Zeichens davor: also beliebig viele beliebige Zeichen nach muster.&lt;br /&gt;
&lt;br /&gt;
Das Suchmuster wird häufig in ein komplizierteres Regex umgewandelt um im notify mehrere Aktionen zu starten. Das eigene Regex kann z.B. mit http://regexpal.com/ oder https://regex101.com/ getestet werden.&lt;br /&gt;
&lt;br /&gt;
Funktioniert der Auslöser, das notify tut aber noch nicht was es soll, müssen wir die Anweisung untersuchen. In unserem korrigierten Beispiel&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt; defmod n_test notify n_test:muster.* Ausführungsteil&amp;lt;/source&amp;gt;&lt;br /&gt;
folgt beim Kommando &amp;lt;code&amp;gt;trigger n_test muster bild&amp;lt;/code&amp;gt; ein Eintrag im Log:&lt;br /&gt;
  2018.07.13 11:47:57 3: n_test return value: Unknown command Ausführungsteil, try help.&lt;br /&gt;
Das notify wurde zwar getriggert aber die Anweisung war nicht ausführbar. &lt;br /&gt;
&lt;br /&gt;
Ein richtiges Suchmuster und eine fehlerhafte Anweisung wird also normalerweise einen Fehlereintrag im Logfile erzeugen!&lt;br /&gt;
&lt;br /&gt;
=== Spezialfall: notify löst zwar aus - aber zu oft ===&lt;br /&gt;
In dem Fall ist das Suchmuster (regExp) zu unscharf oder das triggernde Gerät löst das Event zu oft aus. Das regExp sollte so genau wie möglich konstruiert werden, device:.* ist eine einfache aber oft keine gute Wahl!&lt;br /&gt;
&lt;br /&gt;
Im Device, welches den Event auslöst, kann mit den Attributen event-on-.* die Häufigkeit gesteuert werden. Insbesondere ist hier das regExp .* eine Art Standardwahl um aufeinanderfolgende gleichartige Events zu verhindern.&lt;br /&gt;
:&amp;lt;code&amp;gt;attr device event-on-change-reading .*&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039;: durch falsche Angaben kann man Events ganz leicht völlig verhindern!&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[event-on-change-reading]]&lt;br /&gt;
&lt;br /&gt;
=== Anweisung ===&lt;br /&gt;
Wird das notify getriggert oder will man ganz schnell mal ein notify testen, kann man die Anweisung durch folgenden Code ersetzen, man öffnet also einfach nur die DEF, kopiert den ursprünglichen Inhalt an einen sicheren Ort und ersetzt die Anweisung durch eine der beiden Zeilen. Die erste Zeile kann man auch einfach mal in der Kommandozeile testen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;{Log 1, &amp;quot;Das Notify n_test hat ausgeloest.&amp;quot;}&lt;br /&gt;
{Log 1, &amp;quot;Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT&amp;quot;}&amp;lt;/source&amp;gt;&lt;br /&gt;
Wird das notify ausgelöst, muss anschließend im Logfile ein Eintrag zu finden sein:&lt;br /&gt;
  2018.07.13 10:28:57 1: Das Notify n_test hat ausgeloest, der Event sah so aus: muster&lt;br /&gt;
Unsere Anweisung &amp;lt;code&amp;gt;Ausführungsteil&amp;lt;/code&amp;gt; liefert in der Kommandozeile selbst einen Fehler:&lt;br /&gt;
&amp;lt;code&amp;gt;Unknown command Ausführungsteil, try help.&amp;lt;/code&amp;gt;&lt;br /&gt;
Ein Versuch mit geschweiften Klammern &amp;lt;code&amp;gt;{Ausführungsteil}&amp;lt;/code&amp;gt; liefert wieder einen Fehler:&lt;br /&gt;
&amp;lt;code&amp;gt;Unrecognized character \xC3; marked by &amp;lt;-- HERE after {Ausf&amp;lt;-- HERE near column 6 at (eval 5977) line 1.&amp;lt;/code&amp;gt;&lt;br /&gt;
Diese Variante &amp;lt;code&amp;gt;{&amp;quot;Ausführungsteil&amp;quot;}&amp;lt;/code&amp;gt; liefert den String Ausführungsteil ohne Fehler: Das notify arbeitet fehler- aber sinnfrei.&lt;br /&gt;
Der fertige Code:&lt;br /&gt;
  defmod n_test notify n_test:muster.* {&amp;quot;Ausführungsteil&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Man kann die Anweisung, normalerweise so wie sie ist, in der FHEM Kommandozeile testen. Sind im Perl Code (in geschweiften Klammern) im DEF Editor Semikolon enthalten muss man diese für den Test in der Kommandozeile (oder Raw Def) verdoppeln.&lt;br /&gt;
Laufzeitabhängige Variablen sind in der Kommandozeile meist nicht verfügbar, diese sollte man für den Test einfach durch passende Inhalte austauschen. So kann man die komfortable Variante (loggt den Namen und das komplette Event) nicht in der Kommandozeile ausführen. &lt;br /&gt;
&lt;br /&gt;
Funktioniert ein FHEM Befehl in der Kommandozeile nicht (z.B. Lampe geht nicht an) kann es im notify auch nicht funktionieren, dann muss die Fehlersuche an anderer Stelle fortgeführt werden. &lt;br /&gt;
&lt;br /&gt;
Komplexeren Code im Ausführungsteil sollte man beim Testen in Teilabschnitte aufteilen, von der Laufzeit abhängige Variable ($NAME, $EVENT, $EVTPART) durch Strings (&amp;quot;TestWort&amp;quot;) ersetzen, die Teilabschnitte separat testen und anschließend schrittweise wieder komplettieren.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
{{Hinweis|Für die nachfolgenden Beispiele wurden einige unterschiedliche Technologien verwendet. Sie können aber recht einfach auf alle anderen Systeme übertragen werden, dabei sollte ggf. darauf geachtet werden, dass sich Schaltbefehle und Events teilweise je nach konkret eingesetzter Technologie unterscheiden können. Dann ist ggf. eine Erweiterung, z.B. durch eine [[if-condition|if-Abfrage]] erforderlich.}}&lt;br /&gt;
&lt;br /&gt;
=== Schalter entprellen ===&lt;br /&gt;
Will man ein notify innerhalb eines bestimmten Zeitraumes nur einmal auslösen lassen, auch wenn er in diesem Zeitraum mehrfach getriggered werden sollte, so bietet sich das Attribut disabledAfterTrigger an,&lt;br /&gt;
 attr &amp;lt;notify_device&amp;gt; disabledAfterTrigger &amp;lt;Anzahl Sekunden&amp;gt;&lt;br /&gt;
In dem Zeitraum wird dann nur einmal (beim ersten Mal) der Befehl ausgelöst, auch wenn mehrfach getriggered wurde. Der Zeitraum kann Bruchteile von Sekunden umfassen.&lt;br /&gt;
&lt;br /&gt;
=== Etwas schalten, wenn ein anderes Gerät geschaltet wird ===&lt;br /&gt;
&lt;br /&gt;
==== Vorbedingungen ====&lt;br /&gt;
Dieses Beispiel verwendet eine einfache InterTechno-kompatible Funksteckdose für das Radio und einen HM-Aktor für das Licht:&lt;br /&gt;
&lt;br /&gt;
 define RadioKueche IT 000000FFFF 0F F0&lt;br /&gt;
 define LichtKueche CUL_HM 3A37D6&lt;br /&gt;
Beachte: beide kennen als Event bzw. Schaltbefehle &#039;&#039;on&#039;&#039; und &#039;&#039;off&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define LichtamRadioan notify LichtKueche set RadioKueche $EVENT &lt;br /&gt;
oder alternativ: &lt;br /&gt;
 define LichtamRadioan notify LichtKueche { fhem &amp;quot;set RadioKueche $EVENT&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
* Der Name des &#039;&#039;notify&#039;&#039; &amp;quot;LichtamRadioan&amp;quot; kann frei gewählt werden, er dient nur dazu, das notify in FHEM eindeutig zu identifizieren.&lt;br /&gt;
* &amp;quot;$EVENT&amp;quot; ist ein Platzhalter für den Zustand vom Pattern. $EVENT enthält ein &amp;quot;off&amp;quot; wenn das LichtKueche aus- und ein &amp;quot;on&amp;quot; wenn das Licht eingeschaltet wird.&lt;br /&gt;
* &amp;quot;{ &amp;amp;lt;perlcode&amp;amp;gt; }&amp;quot; alles was zwischen {} steht ist Perl code. Perl kennt das Schlüsselwort fhem. Das Schlüsselwort FHEM dient dazu, FHEM Befehle auszuführen. Es wird also der FHEM Befehl &amp;quot;set RadioKueche on/off&amp;quot; ausgeführt. on oder off ist abhängig vom Pattern. Der eigentliche FHEM Befehl muss in &amp;quot; &amp;quot; stehen.&lt;br /&gt;
* Wann ist ein Wechsel auf die Perl-Ebene erforderlich? &lt;br /&gt;
** einfache FHEM-Befehle sollten in der Regel direkt verwendet werden, dies ist ressourcenschonender.&lt;br /&gt;
** Immer dann, wenn dies nicht möglich ist, weil z.B. komplexerer Code ausgeführt werden soll, (blockierende) Prozesse ausgelagert werden sollten oder Systembefehle ausgeführt werden, ist es günstiger, auf die Perl-Ebene zu wechseln &amp;lt;ref&amp;gt;In diesem {{Link2Forum|Topic=88398|Message=808685|LinkText=Forenbeitrag}} wird z.B. erläutert, wie man nichtblockierend externe Scripte aufrufen kann, die dann ihre Ergebnisse wieder an FHEM übergeben.&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird ===&lt;br /&gt;
Dieses Beispiel verwendet einen HM-Aktor für das Licht sowie zwei Milight-Birnen, die einzeln geschaltet werden sollen&amp;lt;ref&amp;gt;Dies ist ausdrücklich keine Empfehlung für diese Technologie und der Module&amp;lt;/ref&amp;gt; in den Stehlampen:&lt;br /&gt;
&lt;br /&gt;
==== Vorbedingungen ====&lt;br /&gt;
FHEM:&lt;br /&gt;
 define LichtWZ CUL_HM 3A37D8&lt;br /&gt;
 define Stehlampe1 MilightDevice RGBW Milight_Wohnzimmer 5&lt;br /&gt;
 define Stehlampe2 MilightDevice RGBW Milight_Wohnzimmer 6&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define SteckdoseWZein notify LichtWZ set Stehlampe1,Stehlampe2 $EVENT&lt;br /&gt;
oder &#039;&#039;in Perl&#039;&#039;&lt;br /&gt;
 define SteckdoseWZein notify LichtWZ { fhem &amp;quot;set Stehlampe1 $EVENT;;set Stehlampe2 $EVENT &amp;quot; } &lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Wenn das LichtWZ eingeschaltet wird, dann werden auch die Stehlampen (1 und 2) eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
=== Einfache ODER Funktion ===&lt;br /&gt;
Eine einfache ODER Funktion kann sehr einfach realisiert werden&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
KNX:&lt;br /&gt;
* 3x GAs der abzufragende Werte (0/0/40 0/0/41 0/0/42)&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
 define Licht1 CUL_HM 3A37D8&lt;br /&gt;
 define Licht2 CUL_HM 1B7EC3&lt;br /&gt;
 define Stehlampe MilightDevice RGBW Milight_Wohnzimmer 7&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define SteckdoseWZein notify (Licht1|Licht2) set Stehlampe $EVENT &lt;br /&gt;
oder&lt;br /&gt;
 define SteckdoseWZein notify (Licht.) set Stehlampe $EVENT&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Die Werte in der Klammer (wichtig ist das »|«) sind die Rückgabewerte. Alternativ kann in diesem Beispiel auch »Licht.«  (zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für (genau) ein beliebiges Zeichen.&lt;br /&gt;
&lt;br /&gt;
Danach folgt der set Befehl.&lt;br /&gt;
Wenn also das Licht1 oder Licht2 den Wert &amp;quot;on&amp;quot; hat, dann hat auch die Steckdose den Wert &amp;quot;on&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alternative: [[structure]]&lt;br /&gt;
&lt;br /&gt;
=== Einfache UND Funktion ===&lt;br /&gt;
Ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezweifeln. In FHEM fehlen Loggingfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ).&lt;br /&gt;
Dadurch ist FHEM zwar mächtig, wird aber für viele sehr kompliziert.&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
KNX:&lt;br /&gt;
* 3x GDs für die Rückgabewert Rollo geschlossen == 1 (0/0/50 0/0/51 0/0/52)&lt;br /&gt;
* GD LED am Lichtschalter (0/0/106)&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
 define R1ZU KNX 0/0/50:dpt1.009&lt;br /&gt;
 attr R1ZU dummy 1&lt;br /&gt;
 define R2ZU KNX 0/0/51:dpt1.009&lt;br /&gt;
 attr R2ZU dummy 1&lt;br /&gt;
 define R3ZU KNX 0/0/52:dpt1.009&lt;br /&gt;
 attr R3ZU dummy 1&lt;br /&gt;
 define LEDalleRolloZu KNX 0/0/106:dpt1&lt;br /&gt;
Durch das Attribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define nt.allerolloszu notify (R1ZU|R2ZU|R3ZU) {&lt;br /&gt;
 my $r1 = Value(&amp;quot;R1ZU&amp;quot;);;&lt;br /&gt;
 my $r2 = Value(&amp;quot;R2ZU&amp;quot;);;&lt;br /&gt;
 my $r3 = Value(&amp;quot;R3ZU&amp;quot;);;&lt;br /&gt;
 if ($r1 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r2 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r3 eq &amp;quot;on&amp;quot;) {&lt;br /&gt;
   fhem(&amp;quot;set LEDalleRolloZu on&amp;quot;);;&lt;br /&gt;
 } else {&lt;br /&gt;
   fhem(&amp;quot;set LEDalleRolloZu off&amp;quot;);;&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet. Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }&lt;br /&gt;
&lt;br /&gt;
my $r1 =&amp;amp;gt; Variable $r1 definieren&lt;br /&gt;
= Value(&amp;quot;R1ZU&amp;quot;);; ==&amp;amp;gt; weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu &lt;br /&gt;
&lt;br /&gt;
Der doppelte ;; ist ein FHEM Thema. Eigentlich würde für Perl ein ; reichen. Aber FHEM nutzt selbst das ; und daher wird ein ;; benötigt. Mit den ersten drei my Zeilen werden die Rückgabewerte den Variablen zugewiesen.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt ein normales &amp;quot;if then else&amp;quot; Konstrukt. Die Zeile »($r1 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r2 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r3 eq &amp;quot;on&amp;quot;)«&amp;amp;#160;kann man so lesen: Wenn $r1 den Wert &amp;quot;on&amp;quot; und (&amp;amp;amp;&amp;amp;amp;) $r2 den Wert &amp;quot;on&amp;quot; und $r3 den Wert &amp;quot;on&amp;quot; dann schalte die LEDalleRolloZu ein {fhem(&amp;quot;set LEDalleRolloZu on&amp;quot;)}&lt;br /&gt;
ansonsten else schalte die LED aus. {fhem(&amp;quot;set LEDalleRolloZu off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Alternative: [[structure]]&lt;br /&gt;
&lt;br /&gt;
=== Zeitverzögert schalten ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Aufgabe:&#039;&#039;&#039; || Zeitverzögert schalten&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Beschreibung:&#039;&#039;&#039; || Mit einem Notify zeitverzögert eine Aktion auslösen.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Vorbereitung:&#039;&#039;&#039; || Gerät &amp;quot;Lampe&amp;quot; ist definiert und es gibt eine Situation, die ein Ereignis &amp;quot;Fernbedienung:.*&amp;quot; generiert.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Befehl:&#039;&#039;&#039; || &amp;lt;code&amp;gt;define ntfy1 notify Fernbedienung:.* sleep 7.5;; set Lampe $EVENT&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Erläuterungen:&#039;&#039;&#039; || Bei Eintreten eines Ereignisses &amp;quot;Fernbedienung*&amp;quot; wird nach einer Pause von siebeneinhalb Sekunden der Befehl &amp;lt;set Lampe ??&amp;gt; ausgeführt, wobei der eigentliche Befehl aus dem auslösenden Ereignis übernommen wird.&lt;br /&gt;
:&#039;&#039;Quelle: {{Link2Forum|Topic=17161|LinkText=FHEM Forum}}&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig) ===&lt;br /&gt;
Hier ein kleines Beispiel, wie man mit Hilfe einer PV-Anlage die Sonneneinstrahlung auf der Südseite ermittelt und dies zur Rolladensteuerung nutzt.&lt;br /&gt;
Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel)&lt;br /&gt;
Optional: Die Funktion soll nur zwischen dem 6. und 9. Monat funktioneren. (drittes Beispiel)&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
PV Anlage mit SolarView abfragen.&lt;br /&gt;
Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schließen.&lt;br /&gt;
&lt;br /&gt;
==== notify Syntax ====&lt;br /&gt;
FHEM:&lt;br /&gt;
&lt;br /&gt;
 define sv SolarView solarview 15000 wr1 wr2 wr3 wr4                           &amp;lt;----vier Wechselrichter&lt;br /&gt;
 attr sv event-on-change-reading currentPower                                &lt;br /&gt;
&lt;br /&gt;
 define nt.sonnenlichtpersolar notify (sv:currentPower.*) { &lt;br /&gt;
  if ($EVTPART1 &amp;amp;lt; 3000 ) {&lt;br /&gt;
  fhem(&#039;set Flur1 Auf&#039;);&lt;br /&gt;
 }else {&lt;br /&gt;
  if ($EVTPART1 &amp;amp;gt; 5000 ) {&lt;br /&gt;
  fhem(&#039;set Flur1 Ab&#039;);&lt;br /&gt;
  } &lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Optional 1: Zeitabhängig&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
 (sv:currentPower.*) { &lt;br /&gt;
  my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&lt;br /&gt;
   if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;) { &lt;br /&gt;
   if ($EVTPART1 &amp;lt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Auf&#039;);&lt;br /&gt;
    }else {&lt;br /&gt;
    if ($EVTPART1 &amp;gt; 8000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Ab&#039;);&lt;br /&gt;
    } &lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Optional 2: Zeit und Datum&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
 (sv:currentPower.*) { &lt;br /&gt;
  my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&lt;br /&gt;
  if ($month &amp;gt;= 6 &amp;amp;&amp;amp; $month &amp;lt;= 9) {&lt;br /&gt;
   if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;) { &lt;br /&gt;
   if ($EVTPART1 &amp;lt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1,RBUERO1,RBUERO2 Auf&#039;);&lt;br /&gt;
    }else {&lt;br /&gt;
    if ($EVTPART1 &amp;gt; 8000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1,Flur2,RBUERO1,RBUERO2 Ab&#039;);&lt;br /&gt;
    } &lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
* Das define wird in der Kommandozeile im Webbrowser eingegeben.&lt;br /&gt;
* Anschließend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl&lt;br /&gt;
* define sv SolarView ... &amp;lt;==== ist die Schnittstelle vom SolarView&lt;br /&gt;
* define nt.sonnenlichtpersolar notify (sv:currentPower.*) { &amp;lt;==== hier wird ein notify angelegt, der auf das &amp;quot;define sv&amp;quot; Wert &amp;quot;currentPower.*&amp;quot; (.* ist irgendwas) reagiert&lt;br /&gt;
  if ($EVTPART1 &amp;amp;lt; 3000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Auf&#039;);&lt;br /&gt;
  }else {&lt;br /&gt;
   if ($EVTPART1 &amp;amp;gt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Ab&#039;);&lt;br /&gt;
  } &lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
Diese if-Funktion wertet den Rückgabewert von currentPower aus. Hierbei muss man wissen, dass $EVTPART1 das Split-Ergebnis vom Rückgabewert ist&lt;br /&gt;
&lt;br /&gt;
Beispiel: Der Rückgabewert (wie im Beispiel) ist &amp;quot;currentPower: 6000&amp;quot;.&lt;br /&gt;
Jetzt steht im &amp;quot;$EVTPART0 == currentPower:&amp;quot; und im &amp;quot;$EVTPART1 == 6000&amp;quot;&lt;br /&gt;
Das bedeutet, dass man sich nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken muss, dies übernimmt vielmehr FHEM.&lt;br /&gt;
&lt;br /&gt;
Ergebnis: &lt;br /&gt;
Das Rollo wird abhängig von der erzeugten IST_Strommenge auf und zu gefahren.&lt;br /&gt;
Damit dies nicht dauernd hin und her pendelt, wurde der Auf Wert sehr klein und den Ab Wert sehr groß gewählt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional 1:&#039;&#039;&#039; Der Block &amp;quot;my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&amp;quot; erzeugt die String-Variable $hm mit dem Inhalt $hour:$min. %02d begrenzt die Ausgabe auf zwei Stellen.&lt;br /&gt;
Danach wird mit &amp;quot;if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;)&amp;quot; mit stringvergleichenden Operatoren geprüft, ob die Uhrzeit zwischen 9:30 und 17:00 liegt (lt = kleiner als; gt = größer als). Es wäre auch ein le und ge möglich: le =  kleiner/gleich als, ge =  größer/gleich als.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional 2:&#039;&#039;&#039;if( $month &amp;gt;= 6 &amp;amp;&amp;amp; $month &amp;lt;= 9) {&lt;br /&gt;
&lt;br /&gt;
Hier wird die numerische FHEM-Standard-Variable $month (Monat) auf größer/gleich bzw kleiner/gleich mit den binären Operatoren überprüft.&lt;br /&gt;
Die Funktion arbeitet also nur zwischen dem 6. und dem 9. Monat und dann auch nur zwischen 9:31 und 16:59.&lt;br /&gt;
&lt;br /&gt;
=== Status eines Kippfensters mit 2 Fensterkontakten abbilden ===&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
Es ist je ein Fensterkontakt der &#039;&#039;open&#039;&#039; oder &#039;&#039;closed&#039;&#039; meldet, oben und unten am Fenster angebracht.&lt;br /&gt;
Die Namen der beiden FHEM-Devices sind &#039;&#039;fensterKontaktOben&#039;&#039; und &#039;&#039;fensterKontaktUnten&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== notify Syntax ====&lt;br /&gt;
FHEM:&lt;br /&gt;
 define statusFenster notify fensterKontakt(Oben|Unten):(open|closed) {&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039;)&lt;br /&gt;
        { fhem &#039;set Terrassentuer open&#039; }&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039;)&lt;br /&gt;
        { fhem &#039;set Terrassentuer closed&#039; }&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039;)&lt;br /&gt;
        { fhem &#039;set Terrassentuer tilted&#039; }&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039;)&lt;br /&gt;
        { fhem &#039;set Terrassentuer undef&#039; }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Weitere Hinweise ==&lt;br /&gt;
* Entsprechend zu $EVENT gibt es auch noch $NAME und $TYPE. $NAME und $TYPE enthalten den Namen bzw. Typ des Ereignis auslösenden Gerätes.&lt;br /&gt;
* Wird der Perl-Code in einem &amp;lt;code&amp;gt;notify&amp;lt;/code&amp;gt; immer länger, lagere den Code wegen der Übersichtlichkeit in eine eigene Programmdatei aus, wie in [[99_myUtils anlegen]] beschrieben.&lt;br /&gt;
* Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreibt, muss man anscheinend darauf achten, dass keine abschließende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.&lt;br /&gt;
* Dieser {{Link2Forum|Topic=38520|Message=307325}} enthält Vorschläge zur Vorgehensweise bei der Erstellung von komplexen &#039;&#039;notify&#039;&#039; Definitionen bzw. bei deren Fehlerbehebung.&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
* [[Escapen in Perlbefehlen]]&lt;br /&gt;
* [[Klammerebenen]]&lt;br /&gt;
* Forenbeitrag zum Thema {{Link2Forum|Topic=115414|LinkText=Optimierung des Suchmusters - NOTIFYDEV}}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Hilfsmodul]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Notify&amp;diff=35686</id>
		<title>Notify</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Notify&amp;diff=35686"/>
		<updated>2021-05-09T16:16:16Z</updated>

		<summary type="html">&lt;p&gt;TomLee: Wikitabelle bearbeitet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:notify}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Ausführung von Anweisung(en) als Reaktion auf Ereignisse&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=notify&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=91_notify.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
{{Hinweis|Weitere grundlegende Informationen/Beispiele zu notify enthält [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM]}}&lt;br /&gt;
Das Hilfsmodul notify dient dazu [[Ereignis|Ereignisse]] über ein Suchmuster zu erkennen und bei einem Treffer eine Aktion auszulösen. Mit &#039;&#039;notify&#039;&#039; und anderen [[Eventhandler|Eventhandlern]] &amp;lt;ref&amp;gt;hierzu gehören u.a. auch [[DOIF]], [[THRESHOLD]] und [[watchdog]]&amp;lt;/ref&amp;gt; ist es möglich, Logikfunktionen im FHEM abzubilden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039; &lt;br /&gt;
* Wird das Licht in der Küche eingeschaltet, soll FHEM dort auch das Radio einschalten. &lt;br /&gt;
* Bei Druck auf einen Taster soll die Umwälzpumpe für das Warmwasser eingeschaltet werden. &lt;br /&gt;
* Erweiterte Möglichkeiten: Aber nur, wenn das Radio aus ist bzw. die Temperatur im Rücklauf des Warmwassers unterhalb einer bestimmten Schwelle liegt&amp;lt;ref&amp;gt;vgl. hierzu z.B. {{Link2CmdRef|Anker=devspec|Label=FILTER}} und [[if-condition]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; notify &amp;lt;Suchmuster&amp;gt; &amp;lt;command&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;[[Regulärer Ausdruck|Suchmuster]]&#039;&#039;  (häufig als Regexp = regular expression = regulärer Ausdruck bezeichnet) ist sehr wichtig: Es ist entweder der Name des auslösenden (&amp;quot;triggernden&amp;quot;) Gerätes oder die Kombination aus Gerät und auslösendem Ereignis (Event) &amp;lt;code&amp;gt;Gerätename:Event&amp;lt;/code&amp;gt;. Die Events kann man dem [[Event_monitor|Event-Monitor]] entnehmen. Wenn dort z.B. &amp;lt;code&amp;gt;Rollo1&amp;lt;/code&amp;gt; steht, dann reagiert &#039;&#039;notify&#039;&#039; auf &amp;lt;code&amp;gt;Rollo1 on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Rollo1 off&amp;lt;/code&amp;gt; usw.&lt;br /&gt;
&lt;br /&gt;
Wenn man mehrere Suchmuster kombinieren möchte, kann man diese in Klammer schreiben, als Trenner wird dann Pipe (|) genutzt: &amp;lt;code&amp;gt;(Rollo1|Rollo2|Steckdose5)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auch die Verwendung von Platzhaltern ist möglich&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;code&amp;gt;Rollo.&amp;lt;/code&amp;gt; → das notify reagiert auf alles was mit Rollo und &#039;&#039;&#039;einem&#039;&#039;&#039; weiteren beliebigen Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg&lt;br /&gt;
* &amp;lt;code&amp;gt;Rollo.*&amp;lt;/code&amp;gt; → notify reagiert auf alles das mit Rollo beginnt&lt;br /&gt;
* &amp;lt;code&amp;gt;.*isch&amp;lt;/code&amp;gt; → auf alles das mit isch aufhört (Tisch, Fisch)&lt;br /&gt;
* &amp;lt;code&amp;gt;Schalter(1|2|3)&amp;lt;/code&amp;gt; → hört auf Schalter1, Schalter2 und Schalter3&lt;br /&gt;
* &amp;lt;code&amp;gt;dimmer:pct:.(100|7[6-9]|[89][0-9])&amp;lt;/code&amp;gt;  → reagiert, wenn pct einen Wert über 75 annimmt.&lt;br /&gt;
&lt;br /&gt;
Suchmuster/Regex kann man im Internet beispielsweise auf [http://regexpal.com/| http://regexpal.com/] testen.&lt;br /&gt;
&lt;br /&gt;
Es gibt seit Juli 2020 eine Perlfunktion notifyRegexpCheck zum Testen, wie FHEM über das Suchmuster &amp;quot;denkt&amp;quot; - siehe {{Link2Forum|Topic=111938|Message=1074202|LinkText=diesen Beitrag}} im Forum.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Das &#039;&#039;&#039;Suchmuster&#039;&#039;&#039; wird notify-intern um das Zeichen ^ (beginnt mit) und das Zeichen $ (endet mit) ergänzt&amp;lt;ref&amp;gt;Der Eventhandler [[DOIF]] verwendet die in Perl übliche Syntax für reguläre Ausdrücke als DOIF-Suchmuster.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Deshalb darf das Suchmuster nicht mit einem üblichen [[Regulärer Ausdruck|&#039;&#039;&#039;Regulären Ausdruck&#039;&#039;&#039;]], wie er in Perl&amp;lt;ref&amp;gt;https://perldoc.perl.org/perlre.html&amp;lt;/ref&amp;gt; verwendet wird, gleichgesetzt werden, da die Ergänzung zu einem grundsätzlich unterschiedlichen Verhalten führt, siehe nachstehendes Beispiel.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel für das unterschiedliche Verhalten von &#039;&#039;Suchmuster&#039;&#039; und &#039;&#039;regulären Ausdruck&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für einen &#039;&#039;&#039;regulären Audruck&#039;&#039;&#039; gilt: Wenn  der reguläre Ausdruck &#039;&#039;lampe&#039;&#039; ist und das [[Ereignis]] &#039;&#039;tischlampe&#039;&#039; dann passen &#039;&#039;tischlampe&#039;&#039; und &#039;&#039;lampe&#039;&#039; zueinander.&lt;br /&gt;
&lt;br /&gt;
Für das &#039;&#039;&#039;Suchmuster&#039;&#039;&#039; gilt: Wenn  das Suchmuster &#039;&#039;lampe&#039;&#039; ist und das [[Ereignis]] &#039;&#039;tischlampe&#039;&#039; dann passen &#039;&#039;tischlampe&#039;&#039; und &#039;&#039;lampe&#039;&#039; &#039;&#039;&#039;nicht&#039;&#039;&#039; zueinander, weil das Suchmuster zu ^lampe$ ergänzt wird und damit exakt nur auf &#039;&#039;lampe&#039;&#039; matcht (passt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel Variablen Zuordnung zum Event&#039;&#039;&#039;&lt;br /&gt;
  2020-01-21 22:40:39 HUEDevice VibrationTest1 battery: 88&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !!$NAME !! colspan=&amp;quot;2&amp;quot; |$EVENT&lt;br /&gt;
|-&lt;br /&gt;
| ||||$EVTPART0 ||$EVTPART1&lt;br /&gt;
|-&lt;br /&gt;
|2020-01-21 22:40:39 HUEDevice|| VibrationTest1|| battery:|| 88&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FHEMWEB-unterstütztes Anlegen eines notify ==&lt;br /&gt;
{{Hinweis|Die Erstellung eines notify und insbesondere die korrekte Angabe des Suchmusters (Regex) führt gerade bei Einsteigern immer wieder zu Schwierigkeiten. Zur Fehlerminimierung empfiehlt es sich zum einen, die [[Konfiguration]] nicht direkt zu bearbeiten, sondern die &amp;quot;Befehl-Eingabezeile&amp;quot;, die &amp;quot;Objektdetails&amp;quot; oder den [[Import von Code Snippets|Import von RAW-Definitionen]] zur Bearbeitung zu nutzen.}}&lt;br /&gt;
&lt;br /&gt;
=== Event Monitor ===&lt;br /&gt;
Die komfortabelste Möglichkeit, die häufigsten Event-Handler zu erstellen, bietet der [[Event monitor|Event-Monitor]]. Die Vorgehensweis ist in dem zugehörigen Artikel dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Regexp wizard ===&lt;br /&gt;
Zudem enthält FHEM einen Regexp wizard mit dem Regex anhand der in FHEM vorhandenen Devices und deren Events aus einer Auswahlbox selektiert werden können. Voraussetzungen sind:&lt;br /&gt;
* Aktivierung des Hilfsmoduls [[eventTypes]] (bei allen Neuinstallationen Standard) &lt;br /&gt;
* das gesuchte Ereignis (Event) ist nach Aktivierung des Hilfsmoduls bereits mindestens einmal eingetreten&lt;br /&gt;
&lt;br /&gt;
Schrittweise Darstellung der Nutzung des Regexp wizard zur Anlage eines &amp;quot;notify&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
In das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] eingeben und mit {{Taste|Enter}} bestätigen:&lt;br /&gt;
 define ntest notify a b&lt;br /&gt;
Als Beispiel wird ein notify mit &amp;lt;name&amp;gt; &amp;quot;ntest&amp;quot; angelegt. &amp;quot;a&amp;quot; und &amp;quot;b&amp;quot; sind beliebige Platzhalter für &amp;lt;Suchmuster&amp;gt; und &amp;lt;Command&amp;gt;, die bei der weiteren Bearbeitung mit dem endgültigen Werten ersetzt werden.&lt;br /&gt;
Der Regexp wizard öffnet sich:&lt;br /&gt;
[[Datei:Regexp wizard1.JPG|400px|thumb|center]]&lt;br /&gt;
Nun in der Auswahlbox das auslösende Event (Ereignis) auswählen; zunächst das Device und dann das gewünschte Regex. Hier soll das notify bei jeder Veränderung der Temperatur (temperature.*) des Device BTHR918N reagieren. Abschließend mit einem Mausklick auf {{Taste|set}} bestätigen. Wählt man mehrere Regex in dieser Weise aus, so wird das &amp;quot;notify&amp;quot; bei Eintritt jedes dieser Events ausgeführt:&lt;br /&gt;
[[Datei:Regexp wizard2.JPG|400px|thumb|center]]&lt;br /&gt;
Anschließend den Platzhalter &amp;quot;a&amp;quot; mit Klick auf den Link &amp;quot;removeRegexpPart&amp;quot; löschen:&lt;br /&gt;
[[Datei:Regexp wizard3.JPG|400px|thumb|center]]&lt;br /&gt;
Den Link &amp;quot;DEF&amp;quot; anklicken, damit sich der DEF-Editor öffnet:&lt;br /&gt;
[[Datei:Regexp wizard4.JPG|400px|thumb|center]]&lt;br /&gt;
Jetzt den auszuführenden Befehl im &amp;quot;DEF&amp;quot;-Bereich durch Überschreiben des Platzhalters &amp;quot;b&amp;quot; eintragen und mit Klick auf {{Taste|modify ntest}} abschließen:&lt;br /&gt;
[[Datei:Regexp wizard5.JPG|400px|thumb|center]]&lt;br /&gt;
Das fertige und sofort aktive &amp;quot;notify&amp;quot; sieht abschließend folgendermaßen aus:&lt;br /&gt;
[[Datei:Regexp wizard6.JPG|400px|thumb|center]]&lt;br /&gt;
Am Schluss das Speichern über {{Taste|Save config}} nicht vergessen.&lt;br /&gt;
&lt;br /&gt;
== Mein notify geht nicht - wie kann ich mir selbst helfen: Debugging ==&lt;br /&gt;
Funktioniert ein notify nicht wie gewünscht, kann es nur zwei Hauptursachen haben: &lt;br /&gt;
* Entweder das Suchmuster paßt nicht zum gewünschten Auslöser (FHEM Device), und/oder&lt;br /&gt;
* die Anweisung enthält einen Fehler. &lt;br /&gt;
Sollte kein Fehler im Logfile auftauchen aber das notify ausgelöst werden, stimmt meist der Übertragungsweg zum Zieldevice nicht.&lt;br /&gt;
Der STATE des notify zeigt normalerweise mit Datum/Uhrzeit die letzte Auslösung an.&lt;br /&gt;
&lt;br /&gt;
Beim Debuggen sollte man daher beide Elemente getrennt untersuchen. Hier ein Beispiel welches nicht wie gewünscht funktioniert:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt; define n_test notify n_test:muster Ausführungsteil&amp;lt;/source&amp;gt;&lt;br /&gt;
Zum debuggen benötigen wir &lt;br /&gt;
* den [[Event monitor]]&lt;br /&gt;
* das [https://fhem.de/commandref.html#trigger trigger-Kommando] - kann man jederzeit verwenden um das Suchmuster als Event unabhängig vom Auslöser zu erzeugen.&lt;br /&gt;
* die FHEM Kommandozeile&lt;br /&gt;
* den [[DEF-Editor]]&lt;br /&gt;
* eventuell einen Texteditor um Codeblöcke zwischen zu lagern und Notizen zu machen.&lt;br /&gt;
&lt;br /&gt;
Das Suchmuster im Beispiel notify triggert auf sich selbst, es soll auf jeden Event mit dem Inhalt &#039;&#039;&#039;muster&#039;&#039;&#039; ausgelöst werden, Beispiel:&lt;br /&gt;
  2018-07-14 14:31:03 notify n_test muster bild&lt;br /&gt;
&lt;br /&gt;
=== Suchmuster ===&lt;br /&gt;
Sollte das notify nicht funktionieren:&lt;br /&gt;
* keine Reaktion wie gewünscht&lt;br /&gt;
* keine Fehlermeldung in der Weboberfläche beim Anlegen, keine Fehlermeldung im Logfile&lt;br /&gt;
* STATE ist unverändert auf active oder einem altem Datum/Uhrzeit&lt;br /&gt;
liegt der Fehler mit Sicherheit im Suchmuster. Man hat die Chance das Suchmuster mit dem trigger Befehl zu erzeugen und zu schauen ob die Anweisung ausgeführt wird. Dabei ist zu beachten: Der erste &amp;quot;:&amp;quot; im Suchmuster ist zusätzlich zwischen Gerät und Event als Trennung. Jeder weiter : ist, wenn vorhanden, Bestandteil des Events! Siehe dazu den Abschnitt [https://fhem.de/commandref_DE.html#notify Hinweise in der commandref]&lt;br /&gt;
*Im Beispiel: Event: n_test muster -&amp;gt; Suchmuster n_test:muster&lt;br /&gt;
Um aus dem [[Event]] ein passendes Suchmuster zu erzeugen kann der [[Event monitor|Event-Monitor]] direkt verwendet werden. Man kann ein neues notify erzeugen oder ein Bestehendes modifizieren lassen.&lt;br /&gt;
&lt;br /&gt;
Unser Regex im Beispiel ist zu spezifisch, es triggert nur exakt auf &#039;&#039;&#039;muster&#039;&#039;&#039;. Dieser Trigger erzeugt den folgenden Eintrag im Eventmonitor, entspricht exakt dem Suchmuster und löst das notify aus:&lt;br /&gt;
  trigger n_test muster&lt;br /&gt;
  2018-07-13 11:52:08 notify n_test muster&lt;br /&gt;
Das Suchmuster für unsere Anforderung muss in &amp;lt;code&amp;gt;n_test:muster.*&amp;lt;/code&amp;gt; geändert werden, damit jeder Event der mit muster beginnt das notify auslöst.&lt;br /&gt;
Der . im Regex steht für jedes beliebige Zeichen und der * für eine beliebige Anzahl des Zeichens davor: also beliebig viele beliebige Zeichen nach muster.&lt;br /&gt;
&lt;br /&gt;
Das Suchmuster wird häufig in ein komplizierteres Regex umgewandelt um im notify mehrere Aktionen zu starten. Das eigene Regex kann z.B. mit http://regexpal.com/ oder https://regex101.com/ getestet werden.&lt;br /&gt;
&lt;br /&gt;
Funktioniert der Auslöser, das notify tut aber noch nicht was es soll, müssen wir die Anweisung untersuchen. In unserem korrigierten Beispiel&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt; defmod n_test notify n_test:muster.* Ausführungsteil&amp;lt;/source&amp;gt;&lt;br /&gt;
folgt beim Kommando &amp;lt;code&amp;gt;trigger n_test muster bild&amp;lt;/code&amp;gt; ein Eintrag im Log:&lt;br /&gt;
  2018.07.13 11:47:57 3: n_test return value: Unknown command Ausführungsteil, try help.&lt;br /&gt;
Das notify wurde zwar getriggert aber die Anweisung war nicht ausführbar. &lt;br /&gt;
&lt;br /&gt;
Ein richtiges Suchmuster und eine fehlerhafte Anweisung wird also normalerweise einen Fehlereintrag im Logfile erzeugen!&lt;br /&gt;
&lt;br /&gt;
=== Spezialfall: notify löst zwar aus - aber zu oft ===&lt;br /&gt;
In dem Fall ist das Suchmuster (regExp) zu unscharf oder das triggernde Gerät löst das Event zu oft aus. Das regExp sollte so genau wie möglich konstruiert werden, device:.* ist eine einfache aber oft keine gute Wahl!&lt;br /&gt;
&lt;br /&gt;
Im Device, welches den Event auslöst, kann mit den Attributen event-on-.* die Häufigkeit gesteuert werden. Insbesondere ist hier das regExp .* eine Art Standardwahl um aufeinanderfolgende gleichartige Events zu verhindern.&lt;br /&gt;
:&amp;lt;code&amp;gt;attr device event-on-change-reading .*&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039;: durch falsche Angaben kann man Events ganz leicht völlig verhindern!&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[event-on-change-reading]]&lt;br /&gt;
&lt;br /&gt;
=== Anweisung ===&lt;br /&gt;
Wird das notify getriggert oder will man ganz schnell mal ein notify testen, kann man die Anweisung durch folgenden Code ersetzen, man öffnet also einfach nur die DEF, kopiert den ursprünglichen Inhalt an einen sicheren Ort und ersetzt die Anweisung durch eine der beiden Zeilen. Die erste Zeile kann man auch einfach mal in der Kommandozeile testen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;{Log 1, &amp;quot;Das Notify n_test hat ausgeloest.&amp;quot;}&lt;br /&gt;
{Log 1, &amp;quot;Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT&amp;quot;}&amp;lt;/source&amp;gt;&lt;br /&gt;
Wird das notify ausgelöst, muss anschließend im Logfile ein Eintrag zu finden sein:&lt;br /&gt;
  2018.07.13 10:28:57 1: Das Notify n_test hat ausgeloest, der Event sah so aus: muster&lt;br /&gt;
Unsere Anweisung &amp;lt;code&amp;gt;Ausführungsteil&amp;lt;/code&amp;gt; liefert in der Kommandozeile selbst einen Fehler:&lt;br /&gt;
&amp;lt;code&amp;gt;Unknown command Ausführungsteil, try help.&amp;lt;/code&amp;gt;&lt;br /&gt;
Ein Versuch mit geschweiften Klammern &amp;lt;code&amp;gt;{Ausführungsteil}&amp;lt;/code&amp;gt; liefert wieder einen Fehler:&lt;br /&gt;
&amp;lt;code&amp;gt;Unrecognized character \xC3; marked by &amp;lt;-- HERE after {Ausf&amp;lt;-- HERE near column 6 at (eval 5977) line 1.&amp;lt;/code&amp;gt;&lt;br /&gt;
Diese Variante &amp;lt;code&amp;gt;{&amp;quot;Ausführungsteil&amp;quot;}&amp;lt;/code&amp;gt; liefert den String Ausführungsteil ohne Fehler: Das notify arbeitet fehler- aber sinnfrei.&lt;br /&gt;
Der fertige Code:&lt;br /&gt;
  defmod n_test notify n_test:muster.* {&amp;quot;Ausführungsteil&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Man kann die Anweisung, normalerweise so wie sie ist, in der FHEM Kommandozeile testen. Sind im Perl Code (in geschweiften Klammern) im DEF Editor Semikolon enthalten muss man diese für den Test in der Kommandozeile (oder Raw Def) verdoppeln.&lt;br /&gt;
Laufzeitabhängige Variablen sind in der Kommandozeile meist nicht verfügbar, diese sollte man für den Test einfach durch passende Inhalte austauschen. So kann man die komfortable Variante (loggt den Namen und das komplette Event) nicht in der Kommandozeile ausführen. &lt;br /&gt;
&lt;br /&gt;
Funktioniert ein FHEM Befehl in der Kommandozeile nicht (z.B. Lampe geht nicht an) kann es im notify auch nicht funktionieren, dann muss die Fehlersuche an anderer Stelle fortgeführt werden. &lt;br /&gt;
&lt;br /&gt;
Komplexeren Code im Ausführungsteil sollte man beim Testen in Teilabschnitte aufteilen, von der Laufzeit abhängige Variable ($NAME, $EVENT, $EVTPART) durch Strings (&amp;quot;TestWort&amp;quot;) ersetzen, die Teilabschnitte separat testen und anschließend schrittweise wieder komplettieren.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
{{Hinweis|Für die nachfolgenden Beispiele wurden einige unterschiedliche Technologien verwendet. Sie können aber recht einfach auf alle anderen Systeme übertragen werden, dabei sollte ggf. darauf geachtet werden, dass sich Schaltbefehle und Events teilweise je nach konkret eingesetzter Technologie unterscheiden können. Dann ist ggf. eine Erweiterung, z.B. durch eine [[if-condition|if-Abfrage]] erforderlich.}}&lt;br /&gt;
&lt;br /&gt;
=== Schalter entprellen ===&lt;br /&gt;
Will man ein notify innerhalb eines bestimmten Zeitraumes nur einmal auslösen lassen, auch wenn er in diesem Zeitraum mehrfach getriggered werden sollte, so bietet sich das Attribut disabledAfterTrigger an,&lt;br /&gt;
 attr &amp;lt;notify_device&amp;gt; disabledAfterTrigger &amp;lt;Anzahl Sekunden&amp;gt;&lt;br /&gt;
In dem Zeitraum wird dann nur einmal (beim ersten Mal) der Befehl ausgelöst, auch wenn mehrfach getriggered wurde. Der Zeitraum kann Bruchteile von Sekunden umfassen.&lt;br /&gt;
&lt;br /&gt;
=== Etwas schalten, wenn ein anderes Gerät geschaltet wird ===&lt;br /&gt;
&lt;br /&gt;
==== Vorbedingungen ====&lt;br /&gt;
Dieses Beispiel verwendet eine einfache InterTechno-kompatible Funksteckdose für das Radio und einen HM-Aktor für das Licht:&lt;br /&gt;
&lt;br /&gt;
 define RadioKueche IT 000000FFFF 0F F0&lt;br /&gt;
 define LichtKueche CUL_HM 3A37D6&lt;br /&gt;
Beachte: beide kennen als Event bzw. Schaltbefehle &#039;&#039;on&#039;&#039; und &#039;&#039;off&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define LichtamRadioan notify LichtKueche set RadioKueche $EVENT &lt;br /&gt;
oder alternativ: &lt;br /&gt;
 define LichtamRadioan notify LichtKueche { fhem &amp;quot;set RadioKueche $EVENT&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
* Der Name des &#039;&#039;notify&#039;&#039; &amp;quot;LichtamRadioan&amp;quot; kann frei gewählt werden, er dient nur dazu, das notify in FHEM eindeutig zu identifizieren.&lt;br /&gt;
* &amp;quot;$EVENT&amp;quot; ist ein Platzhalter für den Zustand vom Pattern. $EVENT enthält ein &amp;quot;off&amp;quot; wenn das LichtKueche aus- und ein &amp;quot;on&amp;quot; wenn das Licht eingeschaltet wird.&lt;br /&gt;
* &amp;quot;{ &amp;amp;lt;perlcode&amp;amp;gt; }&amp;quot; alles was zwischen {} steht ist Perl code. Perl kennt das Schlüsselwort fhem. Das Schlüsselwort FHEM dient dazu, FHEM Befehle auszuführen. Es wird also der FHEM Befehl &amp;quot;set RadioKueche on/off&amp;quot; ausgeführt. on oder off ist abhängig vom Pattern. Der eigentliche FHEM Befehl muss in &amp;quot; &amp;quot; stehen.&lt;br /&gt;
* Wann ist ein Wechsel auf die Perl-Ebene erforderlich? &lt;br /&gt;
** einfache FHEM-Befehle sollten in der Regel direkt verwendet werden, dies ist ressourcenschonender.&lt;br /&gt;
** Immer dann, wenn dies nicht möglich ist, weil z.B. komplexerer Code ausgeführt werden soll, (blockierende) Prozesse ausgelagert werden sollten oder Systembefehle ausgeführt werden, ist es günstiger, auf die Perl-Ebene zu wechseln &amp;lt;ref&amp;gt;In diesem {{Link2Forum|Topic=88398|Message=808685|LinkText=Forenbeitrag}} wird z.B. erläutert, wie man nichtblockierend externe Scripte aufrufen kann, die dann ihre Ergebnisse wieder an FHEM übergeben.&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird ===&lt;br /&gt;
Dieses Beispiel verwendet einen HM-Aktor für das Licht sowie zwei Milight-Birnen, die einzeln geschaltet werden sollen&amp;lt;ref&amp;gt;Dies ist ausdrücklich keine Empfehlung für diese Technologie und der Module&amp;lt;/ref&amp;gt; in den Stehlampen:&lt;br /&gt;
&lt;br /&gt;
==== Vorbedingungen ====&lt;br /&gt;
FHEM:&lt;br /&gt;
 define LichtWZ CUL_HM 3A37D8&lt;br /&gt;
 define Stehlampe1 MilightDevice RGBW Milight_Wohnzimmer 5&lt;br /&gt;
 define Stehlampe2 MilightDevice RGBW Milight_Wohnzimmer 6&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define SteckdoseWZein notify LichtWZ set Stehlampe1,Stehlampe2 $EVENT&lt;br /&gt;
oder &#039;&#039;in Perl&#039;&#039;&lt;br /&gt;
 define SteckdoseWZein notify LichtWZ { fhem &amp;quot;set Stehlampe1 $EVENT;;set Stehlampe2 $EVENT &amp;quot; } &lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Wenn das LichtWZ eingeschaltet wird, dann werden auch die Stehlampen (1 und 2) eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
=== Einfache ODER Funktion ===&lt;br /&gt;
Eine einfache ODER Funktion kann sehr einfach realisiert werden&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
KNX:&lt;br /&gt;
* 3x GAs der abzufragende Werte (0/0/40 0/0/41 0/0/42)&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
 define Licht1 CUL_HM 3A37D8&lt;br /&gt;
 define Licht2 CUL_HM 1B7EC3&lt;br /&gt;
 define Stehlampe MilightDevice RGBW Milight_Wohnzimmer 7&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define SteckdoseWZein notify (Licht1|Licht2) set Stehlampe $EVENT &lt;br /&gt;
oder&lt;br /&gt;
 define SteckdoseWZein notify (Licht.) set Stehlampe $EVENT&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Die Werte in der Klammer (wichtig ist das »|«) sind die Rückgabewerte. Alternativ kann in diesem Beispiel auch »Licht.«  (zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für (genau) ein beliebiges Zeichen.&lt;br /&gt;
&lt;br /&gt;
Danach folgt der set Befehl.&lt;br /&gt;
Wenn also das Licht1 oder Licht2 den Wert &amp;quot;on&amp;quot; hat, dann hat auch die Steckdose den Wert &amp;quot;on&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Alternative: [[structure]]&lt;br /&gt;
&lt;br /&gt;
=== Einfache UND Funktion ===&lt;br /&gt;
Ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezweifeln. In FHEM fehlen Loggingfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ).&lt;br /&gt;
Dadurch ist FHEM zwar mächtig, wird aber für viele sehr kompliziert.&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
KNX:&lt;br /&gt;
* 3x GDs für die Rückgabewert Rollo geschlossen == 1 (0/0/50 0/0/51 0/0/52)&lt;br /&gt;
* GD LED am Lichtschalter (0/0/106)&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
 define R1ZU KNX 0/0/50:dpt1.009&lt;br /&gt;
 attr R1ZU dummy 1&lt;br /&gt;
 define R2ZU KNX 0/0/51:dpt1.009&lt;br /&gt;
 attr R2ZU dummy 1&lt;br /&gt;
 define R3ZU KNX 0/0/52:dpt1.009&lt;br /&gt;
 attr R3ZU dummy 1&lt;br /&gt;
 define LEDalleRolloZu KNX 0/0/106:dpt1&lt;br /&gt;
Durch das Attribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.&lt;br /&gt;
&lt;br /&gt;
==== notify Befehl ====&lt;br /&gt;
 define nt.allerolloszu notify (R1ZU|R2ZU|R3ZU) {&lt;br /&gt;
 my $r1 = Value(&amp;quot;R1ZU&amp;quot;);;&lt;br /&gt;
 my $r2 = Value(&amp;quot;R2ZU&amp;quot;);;&lt;br /&gt;
 my $r3 = Value(&amp;quot;R3ZU&amp;quot;);;&lt;br /&gt;
 if ($r1 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r2 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r3 eq &amp;quot;on&amp;quot;) {&lt;br /&gt;
   fhem(&amp;quot;set LEDalleRolloZu on&amp;quot;);;&lt;br /&gt;
 } else {&lt;br /&gt;
   fhem(&amp;quot;set LEDalleRolloZu off&amp;quot;);;&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet. Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }&lt;br /&gt;
&lt;br /&gt;
my $r1 =&amp;amp;gt; Variable $r1 definieren&lt;br /&gt;
= Value(&amp;quot;R1ZU&amp;quot;);; ==&amp;amp;gt; weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu &lt;br /&gt;
&lt;br /&gt;
Der doppelte ;; ist ein FHEM Thema. Eigentlich würde für Perl ein ; reichen. Aber FHEM nutzt selbst das ; und daher wird ein ;; benötigt. Mit den ersten drei my Zeilen werden die Rückgabewerte den Variablen zugewiesen.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt ein normales &amp;quot;if then else&amp;quot; Konstrukt. Die Zeile »($r1 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r2 eq &amp;quot;on&amp;quot; &amp;amp;amp;&amp;amp;amp; $r3 eq &amp;quot;on&amp;quot;)«&amp;amp;#160;kann man so lesen: Wenn $r1 den Wert &amp;quot;on&amp;quot; und (&amp;amp;amp;&amp;amp;amp;) $r2 den Wert &amp;quot;on&amp;quot; und $r3 den Wert &amp;quot;on&amp;quot; dann schalte die LEDalleRolloZu ein {fhem(&amp;quot;set LEDalleRolloZu on&amp;quot;)}&lt;br /&gt;
ansonsten else schalte die LED aus. {fhem(&amp;quot;set LEDalleRolloZu off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Alternative: [[structure]]&lt;br /&gt;
&lt;br /&gt;
=== Zeitverzögert schalten ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Aufgabe:&#039;&#039;&#039; || Zeitverzögert schalten&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Beschreibung:&#039;&#039;&#039; || Mit einem Notify zeitverzögert eine Aktion auslösen.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Vorbereitung:&#039;&#039;&#039; || Gerät &amp;quot;Lampe&amp;quot; ist definiert und es gibt eine Situation, die ein Ereignis &amp;quot;Fernbedienung:.*&amp;quot; generiert.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Befehl:&#039;&#039;&#039; || &amp;lt;code&amp;gt;define ntfy1 notify Fernbedienung:.* sleep 7.5;; set Lampe $EVENT&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Erläuterungen:&#039;&#039;&#039; || Bei Eintreten eines Ereignisses &amp;quot;Fernbedienung*&amp;quot; wird nach einer Pause von siebeneinhalb Sekunden der Befehl &amp;lt;set Lampe ??&amp;gt; ausgeführt, wobei der eigentliche Befehl aus dem auslösenden Ereignis übernommen wird.&lt;br /&gt;
:&#039;&#039;Quelle: {{Link2Forum|Topic=17161|LinkText=FHEM Forum}}&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig) ===&lt;br /&gt;
Hier ein kleines Beispiel, wie man mit Hilfe einer PV-Anlage die Sonneneinstrahlung auf der Südseite ermittelt und dies zur Rolladensteuerung nutzt.&lt;br /&gt;
Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel)&lt;br /&gt;
Optional: Die Funktion soll nur zwischen dem 6. und 9. Monat funktioneren. (drittes Beispiel)&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
PV Anlage mit SolarView abfragen.&lt;br /&gt;
Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schließen.&lt;br /&gt;
&lt;br /&gt;
==== notify Syntax ====&lt;br /&gt;
FHEM:&lt;br /&gt;
&lt;br /&gt;
 define sv SolarView solarview 15000 wr1 wr2 wr3 wr4                           &amp;lt;----vier Wechselrichter&lt;br /&gt;
 attr sv event-on-change-reading currentPower                                &lt;br /&gt;
&lt;br /&gt;
 define nt.sonnenlichtpersolar notify (sv:currentPower.*) { &lt;br /&gt;
  if ($EVTPART1 &amp;amp;lt; 3000 ) {&lt;br /&gt;
  fhem(&#039;set Flur1 Auf&#039;);&lt;br /&gt;
 }else {&lt;br /&gt;
  if ($EVTPART1 &amp;amp;gt; 5000 ) {&lt;br /&gt;
  fhem(&#039;set Flur1 Ab&#039;);&lt;br /&gt;
  } &lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Optional 1: Zeitabhängig&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
 (sv:currentPower.*) { &lt;br /&gt;
  my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&lt;br /&gt;
   if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;) { &lt;br /&gt;
   if ($EVTPART1 &amp;lt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Auf&#039;);&lt;br /&gt;
    }else {&lt;br /&gt;
    if ($EVTPART1 &amp;gt; 8000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Ab&#039;);&lt;br /&gt;
    } &lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Optional 2: Zeit und Datum&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
 (sv:currentPower.*) { &lt;br /&gt;
  my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&lt;br /&gt;
  if ($month &amp;gt;= 6 &amp;amp;&amp;amp; $month &amp;lt;= 9) {&lt;br /&gt;
   if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;) { &lt;br /&gt;
   if ($EVTPART1 &amp;lt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1,RBUERO1,RBUERO2 Auf&#039;);&lt;br /&gt;
    }else {&lt;br /&gt;
    if ($EVTPART1 &amp;gt; 8000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1,Flur2,RBUERO1,RBUERO2 Ab&#039;);&lt;br /&gt;
    } &lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Erklärung ====&lt;br /&gt;
* Das define wird in der Kommandozeile im Webbrowser eingegeben.&lt;br /&gt;
* Anschließend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl&lt;br /&gt;
* define sv SolarView ... &amp;lt;==== ist die Schnittstelle vom SolarView&lt;br /&gt;
* define nt.sonnenlichtpersolar notify (sv:currentPower.*) { &amp;lt;==== hier wird ein notify angelegt, der auf das &amp;quot;define sv&amp;quot; Wert &amp;quot;currentPower.*&amp;quot; (.* ist irgendwas) reagiert&lt;br /&gt;
  if ($EVTPART1 &amp;amp;lt; 3000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Auf&#039;);&lt;br /&gt;
  }else {&lt;br /&gt;
   if ($EVTPART1 &amp;amp;gt; 5000 ) {&lt;br /&gt;
    fhem(&#039;set Flur1 Ab&#039;);&lt;br /&gt;
  } &lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
Diese if-Funktion wertet den Rückgabewert von currentPower aus. Hierbei muss man wissen, dass $EVTPART1 das Split-Ergebnis vom Rückgabewert ist&lt;br /&gt;
&lt;br /&gt;
Beispiel: Der Rückgabewert (wie im Beispiel) ist &amp;quot;currentPower: 6000&amp;quot;.&lt;br /&gt;
Jetzt steht im &amp;quot;$EVTPART0 == currentPower:&amp;quot; und im &amp;quot;$EVTPART1 == 6000&amp;quot;&lt;br /&gt;
Das bedeutet, dass man sich nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken muss, dies übernimmt vielmehr FHEM.&lt;br /&gt;
&lt;br /&gt;
Ergebnis: &lt;br /&gt;
Das Rollo wird abhängig von der erzeugten IST_Strommenge auf und zu gefahren.&lt;br /&gt;
Damit dies nicht dauernd hin und her pendelt, wurde der Auf Wert sehr klein und den Ab Wert sehr groß gewählt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional 1:&#039;&#039;&#039; Der Block &amp;quot;my $hm = sprintf(&amp;quot;%02d:%02d&amp;quot;, $hour, $min);&amp;quot; erzeugt die String-Variable $hm mit dem Inhalt $hour:$min. %02d begrenzt die Ausgabe auf zwei Stellen.&lt;br /&gt;
Danach wird mit &amp;quot;if ( $hm gt &amp;quot;09:30&amp;quot; &amp;amp;&amp;amp; $hm lt &amp;quot;17:00&amp;quot;)&amp;quot; mit stringvergleichenden Operatoren geprüft, ob die Uhrzeit zwischen 9:30 und 17:00 liegt (lt = kleiner als; gt = größer als). Es wäre auch ein le und ge möglich: le =  kleiner/gleich als, ge =  größer/gleich als.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional 2:&#039;&#039;&#039;if( $month &amp;gt;= 6 &amp;amp;&amp;amp; $month &amp;lt;= 9) {&lt;br /&gt;
&lt;br /&gt;
Hier wird die numerische FHEM-Standard-Variable $month (Monat) auf größer/gleich bzw kleiner/gleich mit den binären Operatoren überprüft.&lt;br /&gt;
Die Funktion arbeitet also nur zwischen dem 6. und dem 9. Monat und dann auch nur zwischen 9:31 und 16:59.&lt;br /&gt;
&lt;br /&gt;
=== Status eines Kippfensters mit 2 Fensterkontakten abbilden ===&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
Es ist je ein Fensterkontakt der &#039;&#039;open&#039;&#039; oder &#039;&#039;closed&#039;&#039; meldet, oben und unten am Fenster angebracht.&lt;br /&gt;
Die Namen der beiden FHEM-Devices sind &#039;&#039;fensterKontaktOben&#039;&#039; und &#039;&#039;fensterKontaktUnten&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== notify Syntax ====&lt;br /&gt;
FHEM:&lt;br /&gt;
 define statusFenster notify fensterKontakt(Oben|Unten):(open|closed) {&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039;)&lt;br /&gt;
        { fhem &#039;set Terrassentuer open&#039; }&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039;)&lt;br /&gt;
        { fhem &#039;set Terrassentuer closed&#039; }&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039;)&lt;br /&gt;
        { fhem &#039;set Terrassentuer tilted&#039; }&lt;br /&gt;
 if ( ReadingsVal(&#039;fensterKontaktOben&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;closed&#039; &amp;amp;&amp;amp; ReadingsVal(&#039;fensterKontaktUnten&#039;, &#039;state&#039;, &#039;undef&#039;) eq &#039;open&#039;)&lt;br /&gt;
        { fhem &#039;set Terrassentuer undef&#039; }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Weitere Hinweise ==&lt;br /&gt;
* Entsprechend zu $EVENT gibt es auch noch $NAME und $TYPE. $NAME und $TYPE enthalten den Namen bzw. Typ des Ereignis auslösenden Gerätes.&lt;br /&gt;
* Wird der Perl-Code in einem &amp;lt;code&amp;gt;notify&amp;lt;/code&amp;gt; immer länger, lagere den Code wegen der Übersichtlichkeit in eine eigene Programmdatei aus, wie in [[99_myUtils anlegen]] beschrieben.&lt;br /&gt;
* Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreibt, muss man anscheinend darauf achten, dass keine abschließende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.&lt;br /&gt;
* Dieser {{Link2Forum|Topic=38520|Message=307325}} enthält Vorschläge zur Vorgehensweise bei der Erstellung von komplexen &#039;&#039;notify&#039;&#039; Definitionen bzw. bei deren Fehlerbehebung.&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
* [[Escapen in Perlbefehlen]]&lt;br /&gt;
* [[Klammerebenen]]&lt;br /&gt;
* Forenbeitrag zum Thema {{Link2Forum|Topic=115414|LinkText=Optimierung des Suchmusters - NOTIFYDEV}}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Hilfsmodul]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=35353</id>
		<title>MQTT2-Module - Praxisbeispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=35353"/>
		<updated>2021-03-24T14:39:54Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung: MQTT bzw. MQTT2 in FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht&amp;lt;ref&amp;gt;Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden&amp;lt;/ref&amp;gt;. MQTT2_DEVICE unterstützt u.a. auch die &#039;&#039;setExtensions&#039;&#039; direkt, also z.B. &#039;&#039;on-for-timer&amp;lt;ref&amp;gt;Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die &#039;&#039;split&#039;&#039;-Varianten der attrTemplate-Einrichtung zu verwenden.&amp;lt;/ref&amp;gt;&#039;&#039; sowie &#039;&#039;[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]&#039;&#039;&amp;lt;ref&amp;gt;Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muss dies dort per Attribut eingeschaltet werden&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Einstellungen und Hinweise ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für [[autocreate]] in Verbindung mit MQTT2_SERVER &#039;&#039;&#039;zwingend&#039;&#039;&#039; jeder über MQTT kommunizierende Client eine ClientID angeben muss. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch &amp;quot;Wegwerf&amp;quot;-ClientID&#039;s. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit &#039;&#039;&#039;MQTT2_SERVER als Server (&amp;quot;Broker&amp;quot;)&#039;&#039;&#039;, für diesen sollte dabei &#039;&#039;autocreate&#039;&#039; &#039;&#039;&#039;nicht deaktiviert&#039;&#039;&#039; sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden&amp;lt;ref&amp;gt;Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) ebenfalls aktiv ist.&amp;lt;/ref&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Beispiel&amp;lt;ref&amp;gt;MQTT2_SERVER verwendet als default-Einstellung für &#039;&#039;autocreate&#039;&#039; &#039;&#039;simple&#039;&#039;, ohne dass ein entsprechendes Attribut gesetzt werden müsste. Die Einstellung &#039;&#039;complex&#039;&#039; empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 define MQTT2_FHEM_Server MQTT2_SERVER 1883 global&lt;br /&gt;
&lt;br /&gt;
Falls der MQTT Broker mit Hilfe von [[allowed]] abgesichert wurde, muss in den Geräten ebenfalls User bzw. Passwort eingetragen werden, damit eine MQTT Kommunikation möglich ist.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muss ggf. die &amp;quot;\&amp;quot; entfernen!}}&lt;br /&gt;
&lt;br /&gt;
=== MQTT-Einstellungen in den Geräten ===&lt;br /&gt;
Die Beispiele gehen davon aus, dass die einzubindenden Geräte &#039;&#039;&#039;&#039;&#039;mit den default-Einstellungen&#039;&#039;&#039;&#039;&#039; für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere &#039;&#039;&#039;keine Veränderungen der topic-Pfade&#039;&#039;&#039; vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen.  }}&lt;br /&gt;
&lt;br /&gt;
=== auto-Konfigurations-features ===&lt;br /&gt;
Viele firmwares und Dienste bieten Möglichkeiten an, einer Controller-Software (insbesondere homeassistant) Hilfsdaten zur automatisierten Konfiguration bereitzustellen. Da FHEM diese Daten nicht zu ihrem ursprünglichen Zweck verwenden kann, werden hierdurch lediglich zusätzliche Readings erzeugt, mit denen man als User in der Regel wenig anfangen kann. Es wird daher empfohlen, derartige features &#039;&#039;&#039;abzuschalten&#039;&#039;&#039;. Wo dies nicht möglich ist, sollte man eine passende [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp]] setzen bzw. diese passend erweitern!&lt;br /&gt;
&lt;br /&gt;
== zigbee2mqtt ==&lt;br /&gt;
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]&lt;br /&gt;
[https://www.zigbee2mqtt.io zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.&lt;br /&gt;
&lt;br /&gt;
Einzelheiten zur Vorgehensweise sind auf der Detailseite [[Zigbee2mqtt|zigbee2mqtt]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Tasmota ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. &lt;br /&gt;
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter &#039;&#039;&amp;lt;nowiki&amp;gt;topic = %topic% (tasmota)&amp;lt;/nowiki&amp;gt;&#039;&#039; ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem  Eingabefeld für &#039;&#039;&amp;quot;client ...&amp;quot;&#039;&#039;, siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
=== MQTT2_DEVICE ===&lt;br /&gt;
Dieses sollte bei aktiviertem &#039;&#039;autocreate&#039;&#039; am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen ===&lt;br /&gt;
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden:  &lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD IODev m2server&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr MQTT2_DVES_9B01BD room MQTT2_DEVICE&lt;br /&gt;
 attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\&lt;br /&gt;
    off cmnd/DVES_9B01BD/POWER off\&lt;br /&gt;
    reboot cmnd/DVES_9B01BD/Restart 1&lt;br /&gt;
 attr MQTT2_DVES_9B01BD webCmd on:off:reboot&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
&lt;br /&gt;
===== Allgemeines =====&lt;br /&gt;
Für gängige Tasmota-Geräte stehen &#039;&#039;templates&#039;&#039; bereit, mit denen sich diese schnell konfigurieren lassen. &lt;br /&gt;
Beachten Sie dazu den Abschnitt &#039;&#039;attrTemplate&#039;&#039; in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}&lt;br /&gt;
&lt;br /&gt;
===== Kein passendes attrTemplate vorhanden? =====&lt;br /&gt;
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das &amp;quot;&#039;&#039;tasmota_basic&#039;&#039;&amp;quot; anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults &amp;quot;ON&amp;quot; bzw. &amp;quot;OFF&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Allerdings stellt dieses das &#039;&#039;autocreate&#039;&#039; an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das &#039;&#039;autocreate&#039;&#039;-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im &#039;&#039;jsonMap&#039;&#039;-Attribut nur die Angabe &amp;quot;&#039;&#039;POWER1:state&#039;&#039;&amp;quot; zu belassen.&lt;br /&gt;
&lt;br /&gt;
=== on-for-timer ===&lt;br /&gt;
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen &#039;&#039;setter&#039;&#039; in der &#039;&#039;setList&#039;&#039; werden die &#039;&#039;&#039;SetExtensions&#039;&#039;&#039; verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:&lt;br /&gt;
&lt;br /&gt;
==== delay ==== &lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (Attributeingabe via FHEMWEB!):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1*10; &#039;cmnd/DVES_575127/Backlog POWER1 1; delay &#039;.$duration.&#039;; POWER1 0&#039;}&lt;br /&gt;
&lt;br /&gt;
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe https://github.com/arendst/Tasmota/wiki/Commands#delay), also 6 Minuten.&lt;br /&gt;
&lt;br /&gt;
====pulseTime ====&lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (s.o.):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1 &amp;lt; 11.2 ? $EVTPART1*10 : $EVTPART1+100; &#039;CMNDTOPIC/Backlog pulseTime1 &#039;.$duration.&#039;; POWER1 1&#039;}&lt;br /&gt;
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit &#039;&#039;delay&#039;&#039;. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren &amp;quot;normalen&amp;quot; Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites &#039;&#039;save&#039;&#039; nur bis zum nächsten reboot des Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
=== zigbee2tasmota ===&lt;br /&gt;
[https://tasmota.github.io/docs/Zigbee/ zigbee2tasmota] ist eine Erweiterung der Tasmota-firmware für Microcontroller, insbesondere dem ESP8266 (und ESP32)(link), über die einige ZigBee-Chipsätze (insbesondere TI CC2530) als [[ZigBee#Koordinator_.28ZigBee_coordinator.2C_ZC.29|Coordinator]] eingebunden werden können, um ein ZigBee-Netzwerk aufzubauen.&lt;br /&gt;
{{Hinweis|Stand 08/2020 war die Einbindung anderer Chipsätze erst in einem Alpha-Stadium; die Zahl der über einen CC2530 einbindbaren ZigBee-Geräte ist daher derzeit relativ begrenzt (ca. 16)!}}&lt;br /&gt;
Auch für diese Lösung stehen einige &#039;&#039;attrTemplate&#039;&#039; zur Verfügung. Nähere Informationen hierzu sind dem Artikel [[Zigbee2Tasmota-MQTT]] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
== ESPurna ==&lt;br /&gt;
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool&#039;sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als &amp;quot;on&amp;quot; oder &amp;quot;off&amp;quot; oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.&lt;br /&gt;
&lt;br /&gt;
== Shelly ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.&lt;br /&gt;
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen weitere Geräte angelegt und konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Standardmäßig senden die Shelly-Geräte ihren kompletten Status alle 30 Sekunden. Dies kann man über den Parameter &#039;&#039;mqtt_update_period&#039;&#039; in den &#039;&#039;settings&#039;&#039; ändern, allerdings ist dieser nur über die HTTP-Schnittstelle des Shelly verfügbar. Um diese Statusupdates abzustellen, kann über den Browser folgender Befehl verwendet werden:&lt;br /&gt;
 http://&amp;lt;ip-des-shelly&amp;gt;/settings?mqtt_update_period=0, &lt;br /&gt;
Soweit bekannt, werden dann nur statische updates ausgeschaltet, z.B. für das Relay bzw. angeschlossene Taster oder Schalter; insbesondere Verbrauchswerte werden dennoch aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Shelly1 ===&lt;br /&gt;
&lt;br /&gt;
=== Shellybulb ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate  angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
 Internals:&lt;br /&gt;
   CFGFN     &lt;br /&gt;
   CID        shellybulb_3CC533&lt;br /&gt;
   DEF        shellybulb_3CC533&lt;br /&gt;
   DEVICETOPIC MQTT2_shellybulb_3CC533&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   NAME       MQTT2_shellybulb_3CC533&lt;br /&gt;
   NR         246&lt;br /&gt;
   STATE      ???&lt;br /&gt;
   TYPE       MQTT2_DEVICE&lt;br /&gt;
   READINGS:&lt;br /&gt;
     2018-12-12 19:28:08   status_blue     0&lt;br /&gt;
     2018-12-12 19:28:08   status_brightness 61&lt;br /&gt;
     2018-12-12 19:28:08   status_effect   0&lt;br /&gt;
     2018-12-12 19:28:08   status_gain     26&lt;br /&gt;
     2018-12-12 19:28:08   status_green    0&lt;br /&gt;
     2018-12-12 19:28:08   status_ison     true&lt;br /&gt;
     2018-12-12 19:28:08   status_mode     color&lt;br /&gt;
     2018-12-12 19:28:08   status_red      255&lt;br /&gt;
     2018-12-12 19:28:08   status_temp     3250&lt;br /&gt;
     2018-12-12 19:28:08   status_white    0&lt;br /&gt;
 Attributes:&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, &#039;status_&#039;) }&lt;br /&gt;
   room       MQTT2_DEVICE&lt;br /&gt;
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate &amp;quot;shellybulb&amp;quot; auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly Plug S ===&lt;br /&gt;
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb &amp;gt; 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:&lt;br /&gt;
  attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state =&amp;gt; $EVTPART0&amp;lt;100?&amp;quot;off&amp;quot;:&amp;quot;on&amp;quot; } }&lt;br /&gt;
Der Status des MQTT2 Devices zeigt dann bei &amp;lt;100W &amp;quot;off&amp;quot; und sonst &amp;quot;on&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
=== HTTP-Commands ===&lt;br /&gt;
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.&lt;br /&gt;
&lt;br /&gt;
== OpenMQTTGateway ==&lt;br /&gt;
Um verschiedene Systeme wie BLE usw. auf MQTT zu bringen bietet sich [https://github.com/1technophile/OpenMQTTGateway OpenMQTTGateway] an, z.B. wird für das Auslesen vieler BLE-Seonsoren lediglich ein ESP32-Board ohne Zusatzhardware (ab ca. 5,- Euro in Fernost erhältlich) benötigt, auf das dann eine vorkompilierte firmware geflasht wird (hierfür wird ein USB-seriell-Wandler benötigt).&lt;br /&gt;
&lt;br /&gt;
Nähere Details sind im Artikel [[OpenMQTTGateway]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== 8-Port-Ethernet Board ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse&lt;br /&gt;
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
In diesem {{Link2Forum|Topic=107536|Message=1016379|LinkText=Forenbeitrag}} bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.&lt;br /&gt;
&lt;br /&gt;
== Milight-Bridge ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von &#039;&#039;openmili&#039;&#039; eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel.&lt;br /&gt;
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway&amp;lt;ref&amp;gt;Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist.&lt;br /&gt;
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen am MiLight-Hub ===&lt;br /&gt;
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.&lt;br /&gt;
Die Einstellungen für &#039;&#039;MQTT topic pattern&#039;&#039; usw. können auf den default-Werten&amp;lt;ref&amp;gt;Diese sind: &amp;lt;br&amp;gt;&#039;&#039;milight/:device_id/:device_type/:group_id&#039;&#039; für &amp;quot;topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/updates/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;update topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/states/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;state topic pattern&amp;quot;. Der Autor hat derzeit folgende Infotypen zum Senden markiert: &amp;quot;status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color&amp;quot; (enthält eventuell zu viele Angaben. Bei einem Eventhandler muss man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).&amp;lt;/ref&amp;gt; belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (&#039;&#039;MQTT Client Status Topic&#039;&#039;), tragen Sie &#039;&#039;milight/LWT&#039;&#039; ein und aktivieren &#039;&#039;Detailed&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Devices ===&lt;br /&gt;
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]&lt;br /&gt;
==== Bridge ====&lt;br /&gt;
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:&lt;br /&gt;
 defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses Device wird nun das &#039;&#039;template&#039;&#039; &#039;&#039;&#039;esp_milight_hub_bridge&#039;&#039;&#039; angewandt.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Leuchtmittel ====&lt;br /&gt;
&lt;br /&gt;
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:&lt;br /&gt;
 defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Devices werden genauso erstellt. &lt;br /&gt;
&lt;br /&gt;
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template &#039;&#039;X_01a_esp_milight_hub_make_rgbw_group&#039;&#039; verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt &#039;&#039;&#039;eine Kopie&#039;&#039;&#039;, die dann modifiziert wird. Diese Kopie ist unter dem Namen &#039;&#039;milight_&amp;lt;RemoteID&amp;gt;_0&#039;&#039; im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele:&lt;br /&gt;
Beispiel für ein RGB-CCT-Device:&lt;br /&gt;
 defmod Licht_Wz_all MQTT2_DEVICE&lt;br /&gt;
 attr Licht_Wz_all IODev MQTT2_Broker&lt;br /&gt;
 attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/&lt;br /&gt;
 attr Licht_Wz_all group Licht&lt;br /&gt;
 attr Licht_Wz_all icon light_control&lt;br /&gt;
 attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 &lt;br /&gt;
 attr Licht_Wz_all room Wohnzimmer&lt;br /&gt;
 attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
 off milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
 level milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 next_mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_up milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 device_id milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 effect milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 commands milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr Licht_Wz_all sortby 1&lt;br /&gt;
 attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue&lt;br /&gt;
 attr Licht_Wz_all webCmdLabel command\ &lt;br /&gt;
 :brightness:saturation\&lt;br /&gt;
 :color_temp:hue&lt;br /&gt;
==== Ein Leuchtmittel, mehrere Fernbedienungen ====&lt;br /&gt;
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen &amp;quot;hört&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }&lt;br /&gt;
&lt;br /&gt;
==== Fernbedienung als Input-Device nutzen ====&lt;br /&gt;
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.&lt;br /&gt;
Um hier nur Differenz-Meldungen direkt an die betreffende myUtils-Funktion zu übergeben und doppelte Events zu verhindern, sollte hier die readingList so angepasst werden, dass nur Messages aus dem &amp;quot;updates&amp;quot;-Zweig ausgewertet werden: &lt;br /&gt;
 defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0&lt;br /&gt;
 attr MiLight_RC1_0 readingList milight/states/0xABCD/fut089/[0-8]:.* {}&lt;br /&gt;
 milight/updates/0xABCD/fut089/0:.* { FHEM::attrT_MiLight_Utils::MPDcontrol(&#039;myMPD&#039;,$EVENT, &#039;Yamaha_Main&#039;) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/1:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW(&#039;Licht_Stehlampe_links&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/2:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW(&#039;Licht_Stehlampe_rechts&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/3:.* { FHEM::attrT_MiLight_Utils::four_Lights_matrix($EVENT, &#039;Licht_WoZi_Vorn_Aussen&#039;, &#039;Licht_WoZi_Vorn_Mitte&#039;, &#039;Licht_WoZi_Hinten_Aussen&#039;, &#039;Licht_WoZi_Hinten_Mitte&#039;) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/4:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Jalousie_WZ&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/5:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Rollladen_WZ_SSO&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/6:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Rollladen_WZ_SSW&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/7:.* {}\&lt;br /&gt;
 milight/updates/0x5D47/fut089/8:.* {}&lt;br /&gt;
 attr MiLight_RC_WZ stateFormat CommandSet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== eBus ==&lt;br /&gt;
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition am eBus ===&lt;br /&gt;
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.&lt;br /&gt;
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. &#039;&#039;ebusd/%circuit/%name&#039;&#039;.&lt;br /&gt;
 --accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name&lt;br /&gt;
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic &#039;&#039;ebusd&#039;&#039; verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit &#039;&#039;ebus...&#039;&#039; zu beginnen!}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition  in FHEM ===&lt;br /&gt;
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem &#039;&#039;&#039;&#039;&#039;vor&#039;&#039;&#039;&#039;&#039; den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der &#039;&#039;readingList&#039;&#039; enthalten, die vom ebus stammen. Da wir die &#039;&#039;readingList&#039;&#039; anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche &#039;&#039;readingList&#039;&#039;-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-&amp;quot;Sammeldevices&amp;quot; genutzt werden, und dessen &#039;&#039;CID&#039;&#039; auf &#039;&#039;ebusd&#039;&#039; geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der &#039;&#039;readingList&#039;&#039; des &amp;quot;Sammeldevices&amp;quot; gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. &lt;br /&gt;
&lt;br /&gt;
Sind die Vorbereitungen abgeschlossen, aktivieren wir &#039;&#039;autocreate&#039;&#039; wieder, allerdings wählen wir als autocreate-Methode &#039;&#039;complex&#039;&#039; aus, da der eBus-Dämon teilweise&amp;lt;ref&amp;gt;Dies betrifft vorrangig die Statusmeldungen&amp;lt;/ref&amp;gt; eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt&amp;lt;ref&amp;gt;Bei Verwendung des MQTT2_CLIENT wird dann die &#039;&#039;readingList&#039;&#039; am bereits definierten MQTT2_DEVICE aus der Kopie des &amp;quot;Sammeldevice&amp;quot; automatisch wieder erstellt bzw. gefüllt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;ebus-Bridge&amp;quot; ====&lt;br /&gt;
Auf das von &#039;&#039;autocreate&#039;&#039; erstellte MQTT2_DEVICE wird nunmehr das template &#039;&#039;eBus_daemon_splitter&#039;&#039; angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. &lt;br /&gt;
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen &#039;&#039;uptime&#039;&#039;, alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;attrTemplate&#039;&#039; läd eine weitere &#039;&#039;attrTemplate&#039;&#039;-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. &lt;br /&gt;
==== &amp;quot;ebusd_bai&amp;quot; und weitere Geräte ====&lt;br /&gt;
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}&lt;br /&gt;
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens &#039;&#039;MQTT2_ebus_bai&#039;&#039; angelegt worden sein.&lt;br /&gt;
&lt;br /&gt;
== Sonos2Mqtt ==&lt;br /&gt;
Aus einem Versuch heraus ist ein {{Link2Forum|Topic=111711|LinkText=kleines Projekt}} geworden: Die Sonos Umgebung mit Hilfe von sonos2mqtt als generisches MQTT2_DEVICE komfortabel in FHEM einzubinden.&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von ein paar Templates ist die grundlegende Einbindung in FHEM nach einer kleinen Installation auf Systemebene schnell erledigt. Es läuft derzeit noch zahlreiche Entwicklung und Ideenfindung, die Fortschritte sind live im Thread oder [[Sonos2mqtt|konsolidiert im Wiki]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Setup im System ===&lt;br /&gt;
Für dies Funktion wird der nodejs Server [https://github.com/svrooij/sonos2mqtt sonos2mqtt] benötigt. Entweder installiert man den lokal, irgendwo im Netzwerk oder nutzt den [[MQTT2-Module - Praxisbeispiele#Verwendung des Docker Containers|Docker Container.]]&lt;br /&gt;
&lt;br /&gt;
Der nodejs Server sonos2mqtt kann aus Sicht von FHEM irgendwo im Netzwerk stehen - aber er muss im gleichen Netzwerk wie die Sonosplayer stehen. Das UPNP Sonosnetzwerk funktioniert nicht über Netzwerksegmente hinweg.&lt;br /&gt;
&lt;br /&gt;
Erreicht der nodejs Server sonos2mqtt den MQTT Server nicht über - default: localhost, Port 1883, keine Anmeldung&amp;quot; - muss der Parameter --mqtt  gesetzt werden! &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800&amp;lt;/code&amp;gt;            # alles gesetzt&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://192.168.0.3:1800&amp;lt;/code&amp;gt;                                                                 # IP Adresse und Port gesetzt, keine Anmeldung am MQTT Server&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://192.168.0.3&amp;lt;/code&amp;gt;                                                                           # IP Adresse gesetzt, Port ist Standard 1883&lt;br /&gt;
&lt;br /&gt;
Erfolgt der Start mit pm2, werden die Parameter mit einem &#039;&#039;zusätzlichen&#039;&#039; doppelten Bindestrich (--) hinter dem nodejs Modul übergeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
pm2 start sonos2mqtt -- --mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lokales Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: nodejs und pm2 ist installiert und für alle Benutzer verfügbar. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo npm install -g sonos2mqtt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Je nach Entwicklungsstand sind auch Betaversionen verfügbar. Für aktuelle Betaversionen wird dieser Zusatz beim Setup verwendet. -&amp;gt; sonosmqtt@3.1.0-beta.1&lt;br /&gt;
&lt;br /&gt;
Wird der sonos2mqtt Server auf einer anderen Maschine eingerichtet, ist der Start entsprechend diesem Absatz [[MQTT2-Module - Praxisbeispiele#Autostart von sonos2mqtt im System mit pm2 .28Alternative.29|Autostart von Sonos2mqtt im System mit pm2]] einzurichten.&lt;br /&gt;
&lt;br /&gt;
=== Setup in FHEM ===&lt;br /&gt;
Man definiert lediglich ein Bridge Device, der Rest wird automatisch erledigt.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: &lt;br /&gt;
* autocreate im System ist aktiv. &lt;br /&gt;
* Der verwendete MQTT2_SERVER steht auf &#039;&#039;&#039;autocreate simple&#039;&#039;&#039; (default/Standard).&lt;br /&gt;
* Templates aktuell kann man leicht in der FHEM Kommandozeile aktualisieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ Svn_GetFile(&amp;quot;FHEM/lib/AttrTemplate/mqtt2.template&amp;quot;, &amp;quot;FHEM/lib/AttrTemplate/mqtt2.template&amp;quot;, sub(){ AttrTemplate_Initialize() }) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bei der Anwendung des Templates für die Bridge wird das Attribut devicetopic ausgelesen oder auf default sonos gesetzt! Wird ein anderer Devicetopic verwendet, muss der bei der Anlage der Bridge gesetzt werden!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung dieser Code muss &amp;quot;am Block&amp;quot; in der Raw Def ausgeführt werden!&#039;&#039;&#039;&lt;br /&gt;
# man kopiert diesen Codeblock, &lt;br /&gt;
# drückt im [[Raw definition|Webinterface]] das große {{Taste|+}},&lt;br /&gt;
# und fügt den Code ins Editorfenster ein. &lt;br /&gt;
# Dort muss/kann man die persönlichen Anpassungen machen. &lt;br /&gt;
# Zum Abschluss execute - fertig&lt;br /&gt;
Im folgenden Code muss der Name des MQTT2 Servers ersetzt werden! &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define SonosBridge MQTT2_DEVICE&lt;br /&gt;
attr SonosBridge IODev NameDesVorhandenenMQTT2Servers&lt;br /&gt;
attr SonosBridge room MQTT2_DEVICE&lt;br /&gt;
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Template sonos2mqtt_bridge_comfort:&lt;br /&gt;
* setzt das Template sonos2mqtt_bridge auf das Device,&lt;br /&gt;
* lädt die Datei 99_sonos2mqttUtils.pm aus dem contrib Ordner nach,&lt;br /&gt;
* definiert ein notify, dies erledigt im weiteren Betrieb die automatische Konfiguration der automatisch erzeugten MQTT2_DEVICEs. &lt;br /&gt;
** mit dem Template sonos2mqtt_speaker (das Template kann auch manuell auf vorhandene Player angewendet werden, die automatische Erzeugung der Player wird aber empfohlen)&lt;br /&gt;
** Ermittelt Detailinformation des jeweiligen Players (vor allem IP Adresse und Modelnumber)&lt;br /&gt;
** Lädt die Sonosgeräte Icons von den UPNP Devices herunter&lt;br /&gt;
** erweitert das setList input Kommando um den TV Eingang (HDMI, spdif) bzw. Line_IN Eingang falls vorhanden (Modelnumber)&lt;br /&gt;
* Die Player werden automatisch einzeln erzeugt wenn sie mqtt Nachrichten senden (Play/Stop) oder (alle sofort) wenn der sonos2mqtt Server gestartet wird. &lt;br /&gt;
&lt;br /&gt;
==== Wozu dient die Bridge? ====&lt;br /&gt;
Sie stellt ein paar wesentliche Funktionen zu Verfügung&lt;br /&gt;
# Auffangen von nicht benötigten MQTT Nachrichten.&lt;br /&gt;
# Erzeugung/Weiterleitung von Nachrichten für die einzelnen Player - damit auch die Erzeugung von separaten Playern nach dem Schema MQTT2_RINCON12345678901234567.&lt;br /&gt;
# Statusanzeige sonos2mqtt als Reading connected (0 offline, 1 connected, 2 Player connected).&lt;br /&gt;
Sie kann zusätzlich als zentrales Device verwendet werden, um die Sonos Umgebung abzubilden, z.B. Readings für Favoriten  u.ä.&lt;br /&gt;
&lt;br /&gt;
==== Start sonos2mqtt lokal ====&lt;br /&gt;
Der Start / Stop des sonos2mqtt Servers innerhalb von FHEM ist nur lokal simpel möglich. Ist der Server irgendwo im Netzwerk oder im Docker Container, muss man andere Möglichkeiten finden. Der Neustart aus FHEM ist zwar praktisch, aber nicht erforderlich. &lt;br /&gt;
&lt;br /&gt;
Wird eine existierenden Sonos Landschaft inhaltlich verändert (Player dazu/weg), muss der Server neu gestartet werden. Werden Player temporär abgeschaltet, merkt das der Server nach einer Zeit selbst, oder man forciert dies mit einem CheckSubscription an der Bridge.&lt;br /&gt;
&lt;br /&gt;
Soll das Modul sonos2mqtt mit seinen default Einstellungen gestartet werden, genügt dieser kurze Befehl (in der FHEM Kommandozeile):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;pm2 start sonos2mqtt&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Tipp: Verwendet man anstatt &amp;quot;Befehl&amp;quot; den Syntax {qx(Befehl)} in der FHEM Kommandozeile, wirkt der Befehl zwar blockierend aber die Ausgabe erfolgt im Browser und nicht im Logfile. Mit dem Parameter -s erfolgt keine Ausgabe.&lt;br /&gt;
&lt;br /&gt;
==== Autostart von sonos2mqtt mit FHEM ====&lt;br /&gt;
Der Code startet sowohl das sonso2mqtt Modul sofort und implementiert ein notify für den zukünftigen automatischen Start beim Start von FHEM.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start &amp;quot;pm2 -s start sonos2mqtt&amp;quot;&lt;br /&gt;
trigger n_pm2_sonos start&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Autostart von sonos2mqtt im System mit pm2 (Alternative) ===&lt;br /&gt;
Der obige Code startet das sonos2mqtt nodejs Modul mit pm2 beim Start von FHEM. Sollte das nicht funktionieren oder nicht ins gesamte Konzept passen (weil z.B. mehrere nodejs Module geladen werden) kann der automatische Start direkt im System erfolgen. Zunächst dafür das oben eventuell schon definierte notify löschen!&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
delete n_pm2_sonos&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Start des Modul muss nicht mit erhöhten Rechten geschehen! Im Terminal folgendes eingeben (unter dem angemeldeten Benutzer wird sonos2mqtt später immer gestartet):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pm2 start sonos2mqtt&lt;br /&gt;
pm2 startup&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der letzte Befehl &amp;quot;redet&amp;quot;, d.h. es gibt eine Ausgabe in der Art:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[PM2] To setup the Startup Script, copy/paste the following command:&lt;br /&gt;
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man tut einfach genau das, was dasteht: die letzte Zeile kopieren und wieder einfügen und ausführen. Danach muss man die Konfiguration von pm2 noch sichern:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pm2 save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verwendung des Docker Containers ===&lt;br /&gt;
Beim Container findet die Konfiguration der Verbindung zum FHEM in den Environment Variablen statt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
environment:&lt;br /&gt;
  - SONOS2MQTT_DEVICE=192.168.56.207 # hier muss einer der Sonos Lautsprecher stehen&lt;br /&gt;
  - SONOS2MQTT_MQTT=mqtt://192.168.56.121:1883 # mqtt2_server FHEM, erweiterter Syntax siehe oben&lt;br /&gt;
  - SONOS_LISTENER_HOST=192.168.56.121 # Docker host IP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sonos2mqtt mit mehr Komfort ===&lt;br /&gt;
Im Wiki Artikel [[Sonos2mqtt]] geht es weiter.&lt;br /&gt;
&lt;br /&gt;
== Owntracks GPS Tracking in FHEM ==&lt;br /&gt;
Diese Beispiel verwendet eine MQTT Instanz im Internet, die mit einem MQTT2_CLIENT angebunden wird. Da wenig Traffic benötigt wird, genügt z.B. eine kostenfreie Instanz z.B. bei myqtthub (Stand. Dezember 2020)&lt;br /&gt;
&lt;br /&gt;
=== owntracks auf dem Smartphone konfigurieren ===&lt;br /&gt;
Menü / Einstellung / Verbindung &lt;br /&gt;
&lt;br /&gt;
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):&lt;br /&gt;
* Modus -&amp;gt; MQTT&lt;br /&gt;
* Hostname  -&amp;gt; &lt;br /&gt;
** Hostnamen: host.cloud.com &lt;br /&gt;
** Port: 8883 &lt;br /&gt;
** ClientID: ID vom Provider &lt;br /&gt;
** WebSockets (nicht nutzen)&lt;br /&gt;
* Identifikation -&amp;gt; &lt;br /&gt;
** Benutzername: user-name &lt;br /&gt;
** Passwort: user-password &lt;br /&gt;
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)&lt;br /&gt;
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte)&lt;br /&gt;
* Sicherheit -&amp;gt; TLS aktivieren&lt;br /&gt;
=== Definition in FHEM ===&lt;br /&gt;
Der MQTT2_CLIENT wird so eingerichtet, man braucht eine andere ClientID als auf dem Smartphone! Stimmt alles sollte das Gerät sofort open anzeigen.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MQTT2_CLIENT einrichten, autocreate simpel&lt;br /&gt;
define mqtt2Cloud MQTT2_CLIENT host.cloud.com:8883&lt;br /&gt;
attr mqtt2Cloud SSL 1&lt;br /&gt;
attr mqtt2Cloud autocreate simple&lt;br /&gt;
attr mqtt2Cloud clientId fhem1&lt;br /&gt;
attr mqtt2Cloud room MQTT2_IO&lt;br /&gt;
attr mqtt2Cloud username user-name&lt;br /&gt;
set mqtt2Cloud password user-password&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die automatische Erzeugung der Trackergeräte in FHEM richtig man zuerst ein Bridge Device ein:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define MQTT2_Cloud_bridge MQTT2_DEVICE&lt;br /&gt;
attr MQTT2_Cloud_bridge IODev mqtt2Cloud&lt;br /&gt;
attr MQTT2_Cloud_bridge autocreate 1&lt;br /&gt;
attr MQTT2_Cloud_bridge room MQTT2_DEVICE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dies wird entweder mit dem Template allgemein  konfiguriert&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set MQTT2_Cloud_bridge attrTemplate MQTT2_CLIENT_general_bridge&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;oder manuell nur für owntracks eingerichtet&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr MQTT2_Cloud_bridge bridgeRegexp owntracks/[^/]+/([^/:]+).* &amp;quot;owntracks_$1&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;MQTT2 Geräte für owntracks werden jetzt automatisch mit dem Namen MQTT2_owntracks_&amp;lt;GeräteID&amp;gt; erzeugt. Diese werden einfach mit dem Template owntracks_device fertig konfiguriert. Bei einem IOS Gerät kann man danach noch das Template owntracks_device_IOS als Erweiterung anwenden.&lt;br /&gt;
&lt;br /&gt;
==== Anwesenheitserkennung ====&lt;br /&gt;
Die Anwesenheit kann im owntracks Device direkt für die selbst definierten Plätze abgelesen werden: entweder steht im reading place der jeweilige Ort oder away. Um hier noch eine gewisse Einheitlichkeit in der Verwendung zu bekommen kann man ein PRESENCE Device verwenden: &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define OT_Mi6 PRESENCE event MQTT2_owntracks_mi6:place:.away MQTT2_owntracks_mi6:place:.&amp;lt;Home&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Im Move Modus erfolgt die Erkennung sehr schnell und damit einige Sekunden eher als eine BT Erkennung im Haus - der Akkuverbrauch steigt enorm. Im Significant Modus kann es schon mal ein paar Minuten dauern - ein relevanter Akku Verbrauch ist nicht erkennbar.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man einen MQTT2_SERVER auch direkt verfügbar machen, wenn man sich sicher ist was man da tut! Siehe {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}}.&lt;br /&gt;
&lt;br /&gt;
Das Bridge Device wird dabei genau so benötigt, nur der IODev ist ein anderer.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Hinweise ==&lt;br /&gt;
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===&lt;br /&gt;
Nutzt man das rawEvents-Attribut am MQTT2-IO&amp;lt;ref&amp;gt;z.B. &amp;lt;code&amp;gt;attr MQTT2_FHEM_Server rawEvents .*&amp;lt;/code&amp;gt;, der regex-Filter kann wie üblich angepasst werden&amp;lt;/ref&amp;gt;, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.&lt;br /&gt;
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit &amp;lt;code&amp;gt;attr mqtt2_server verbose 5&amp;lt;/code&amp;gt; auch alles ins FHEM-Log schreiben lassen.&lt;br /&gt;
&lt;br /&gt;
=== autocreate funktioniert anscheinend nicht? ===&lt;br /&gt;
In der Regel wird bei neu eingehenden MQTT-Messages über &#039;&#039;autocreate&#039;&#039; ein neues Device erstellt, wenn Nachrichten von einem bisher unbekannten Gerät kommen. Geschieht dies nicht, sollten folgende Punkte geprüft werden:&lt;br /&gt;
# (nur bei MQTT2_SERVER:) Der Client muss eine ClientID angeben, diese darf nicht den defaults von &#039;&#039;mosquito_sub&#039;&#039; entsprechen.&lt;br /&gt;
# Ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) muss vorhanden und aktiv sein.&lt;br /&gt;
# &#039;&#039;autocreate&#039;&#039; am IO muss eingeschaltet sein, was für MQTT2_SERVER bedeutet, dass es nicht auf &amp;quot;0&amp;quot; stehen darf (hier ist dann &#039;&#039;simple&#039;&#039; die aktive Voreinstellung), für MQTT2_CLIENT sollte ebenfalls &#039;&#039;simple&#039;&#039; verwendet werden; dies muss hier allerdings explizit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Wird dann immer noch kein Device erstellt, gibt es in aller Regel ein Device, das bereits einen entsprechenden Eintrag in der readingList enthält, oder es sind keine Nachrichten eingegangen. Überprüfen Sie daher dann ggf. die Einstellungen am Client-Gerät (z.B. im Web-Interface des Shelly oder Tasmota-geflashten ESP8266).&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;autocreate&#039;&#039; am Device schließlich bestimmt, ob die &#039;&#039;readingsList&#039;&#039; erweitert werden darf, wenn Informationen über bisher nicht über die readingList abgedeckte Topics empfangen werden und vom MQTT2-IO als zu diesem Device/ClientID gehörend identifiziert wurden.&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; genutzt werden. &lt;br /&gt;
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate: Es werden nicht alle templates angezeigt ===&lt;br /&gt;
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate und Sprachsteuerung ===&lt;br /&gt;
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; dem betreffenden Hauptartikel zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
=== bridgeRegexp ===&lt;br /&gt;
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch &#039;&#039;&#039;&#039;&#039;einem&#039;&#039;&#039;&#039;&#039; &#039;&#039;MQTT2_DEVICE&#039;&#039; zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. In dem nebenstehenden Schaubild wären dies die Geräte &#039;&#039;A&#039;&#039; bis &#039;&#039;D&#039;&#039;. Das &#039;&#039;&#039;Attribut&#039;&#039;&#039; &#039;&#039;bridgeRegexp&#039;&#039; kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem &#039;&#039;&#039;anderen Device&#039;&#039;&#039; (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als &#039;&#039;newClientId&#039;&#039; hinterlegte Angabe verwendet. In nebenstehendem Schaubild ist dies exemplarisch für die Gerätegruppe &#039;&#039;D&#039;&#039; mit dem &#039;&#039;bridge&#039;&#039;-Device &#039;&#039;D&#039;&#039; und dessen &#039;&#039;Satelliten&#039;&#039; &#039;&#039;D1&#039;&#039; bis &#039;&#039;D4&#039;&#039; dargestellt.&lt;br /&gt;
Dementsprechend sind in den hier aufgeführten Beispielen &#039;&#039;bridgeRegexp&#039;&#039;-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren, wie z.B. für über hier dargestellten &#039;&#039;zigbee2mqtt&#039;&#039; oder &#039;&#039;zigbee2tasmota&#039;&#039;. Ein Sonderfall hierbei ist das template &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem &#039;&#039;mosquitto&#039;&#039;-Server und würden sonst alle einem einem MQTT2_DEVICE zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Ständig neue Devices? ===&lt;br /&gt;
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:&lt;br /&gt;
==== Vergabe einer ClientID ====&lt;br /&gt;
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). &lt;br /&gt;
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID&#039;s. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.&lt;br /&gt;
&lt;br /&gt;
==== Löschen der ClientID aus der readingList usw. ====&lt;br /&gt;
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den &#039;&#039;default&#039;&#039; &amp;quot;sonoff&amp;quot; zu ändern).&lt;br /&gt;
Beispielsweise wäre &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt; zu ändern in &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt;&lt;br /&gt;
Die über &#039;&#039;attrTemplate&#039;&#039; verfügbaren Konfigurationen verwenden in der Regel keine ClientID&#039;s bzw. entfernen diese.&lt;br /&gt;
&lt;br /&gt;
=== Wildcards in readingList und setList ===&lt;br /&gt;
Auch in readingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;readingList&#039;&#039; werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise durch einen &amp;quot;/&amp;quot;) kann man so schreiben: &amp;quot;[^/]+&amp;quot; (entspricht: &amp;quot;Mindestens ein Zeichen, das kein Schrägstrich ist&amp;quot;). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;setList&#039;&#039; gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht &amp;quot;+&amp;quot; für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es &amp;quot;Gruppen-Topics&amp;quot;, auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.&lt;br /&gt;
&lt;br /&gt;
=== Die JSON-Daten sollen ausnahmsweise nicht ausgepackt werden ===&lt;br /&gt;
In manchen Fällen ist das automatische Auspacken der JSON-Payload nicht erwünscht. In diesen Fällen kann man einfach den gewünschten Reading-Namen in die readingList eintragen, statt der Anweisung, den JSON an json2NameValue() zu übergeben. Aus&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* { json2nameValue($EVENT) }\&lt;br /&gt;
owntracks/clouduser/mi6/waypoints:.* { json2nameValue($EVENT) }\&lt;br /&gt;
owntracks/clouduser/mi6/event:.* { json2nameValue($EVENT) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
wird dann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* json_mi6\&lt;br /&gt;
owntracks/clouduser/mi6/waypoints:.* json_waypoints\&lt;br /&gt;
owntracks/clouduser/mi6/event:.* json_event&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erforderlichenfalls kann man die Einträge auch doppelt erstellen, um sowohl den JSON wie auch die ausgepackten Readings zu erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Die JSON-Daten vor dem auspacken manipulieren ===&lt;br /&gt;
Aus diversen Gründen kann es zweckmäßig sein, einen bestimmten Wert der JSON-Payload zu ignorieren.&lt;br /&gt;
Z.B. sendet ein Client statt eines Messwertes die Info &amp;quot;bad&amp;quot;. Dieser Fehlerwert soll aus der JSON-Payload &amp;quot;ausgefiltert&amp;quot; werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr DEVICE readingList &amp;lt;your topic&amp;gt;:.* { my $rets = json2nameValue($EVENT,&#039;&#039;,$JSONMAP);; my %cleaned = map { $_,$rets-&amp;gt;{$_} } grep { &#039;bad&#039; ne $rets-&amp;gt;{$_} } keys %{$rets};; return \%cleaned }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch einen Wert umzubenennen wenn die JSON-Payload nur ein Objekt beinhaltet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr DEVICE readingList &amp;lt;your topic&amp;gt;:.* {my %h=(0=&amp;gt;&#039;SofortLaden&#039;,1=&amp;gt;&#039;MinPV&#039;,2=&amp;gt;&#039;NurPV&#039;,3=&amp;gt;&#039;Stop&#039;,4=&amp;gt;&#039;Standby&#039;);; return {ChargeMode=&amp;gt;$h{$EVENT}}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unnötige Konfigurationsinformationen verwerfen ===&lt;br /&gt;
Siehe Einleitung und den [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp-Abschnitt zu MQTT2_CLIENT]].&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Themen ===&lt;br /&gt;
==== Verbinden mehrerer FHEM-Instanzen über MQTT ====&lt;br /&gt;
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeugen kann. So kann man z.B. Messdaten eines Systems über ein &#039;&#039;notify&#039;&#039; iVm. einer einfachen &#039;&#039;publish&#039;&#039;-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.&lt;br /&gt;
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten &#039;&#039;bridgeRegexp&#039;&#039; automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:&lt;br /&gt;
 attr MQTT2_myMqttServer bridgeRegexp \&lt;br /&gt;
   SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* &amp;quot;mgb2_$1&amp;quot;&lt;br /&gt;
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema &#039;&#039;SmartHome/MqttGenericBridge2/&amp;lt;Device-Name&amp;gt;/&amp;lt;Reading-Name&amp;gt;&#039;&#039; versendet.&lt;br /&gt;
&lt;br /&gt;
==== Umstellung von MQTT_DEVICE (und Derivaten wie XiaomiMQTTDevice) zu MQTT2_DEVICE ====&lt;br /&gt;
Wer beabsichtigt, von der Implementierung MQTT+MQTT_DEVICE zu MQTT2-IO und MQTT2_DEVICE zu wechseln, sollte einige Punkte beachten. Viele diesbezügliche Fragen sind vor allem in  {{Link2Forum|Topic=103762|LinkText=diesem Foren-Thread}}&lt;br /&gt;
&lt;br /&gt;
näher erläutert.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}&lt;br /&gt;
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}&lt;br /&gt;
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UserReadings&amp;diff=34642</id>
		<title>UserReadings</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UserReadings&amp;diff=34642"/>
		<updated>2021-01-20T20:24:02Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:userReadings}}  &amp;lt;!-- da richtige Schreibweise kleinen Anfangsbuchstaben hat --&amp;gt;&lt;br /&gt;
Über das Attribut [[userReadings]] können bei einem Device benutzerdefinierte Readings einschließlich der Anweisungen zum Befüllen derselben festgelegt werden. Das können zum Einen Formatänderungen (&amp;quot;sprintf&amp;quot;), oder aber auch durch die &#039;&#039;Modifier&#039;&#039;&lt;br /&gt;
* difference&lt;br /&gt;
* differential&lt;br /&gt;
* integral&lt;br /&gt;
* offset&lt;br /&gt;
* monotonic&lt;br /&gt;
gesteuerte Berechnungen sein.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=&#039;&#039;&#039;Geändertes Verhalten - bitte beachten&#039;&#039;&#039;&lt;br /&gt;
Im April 2016 hat sich die Verarbeitung des &#039;&#039;Triggers&#039;&#039; dahingehend geändert, dass die Trigger-Spezifikation jetzt als [[Regulärer Ausdruck]] interpretiert wird, damit also z.B. ein &amp;lt;code&amp;gt;avgTemp:temperature&amp;lt;/code&amp;gt; geändert werden muss in &amp;lt;code&amp;gt;avgTemp:temperature.*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Technische Details dazu wurden in {{Link2Forum|Topic=52165|LinkText=diesem Forenthread}} diskutiert.}}&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=readingFnAttributes}}.&lt;br /&gt;
&lt;br /&gt;
* Bei Eingabe im Editor-Feld müssen mehrere Befehle mit einem &amp;quot;;&amp;quot; getrennt werden, bei Änderung in der Eingabezeile sind zwei &amp;quot;;&amp;quot; notwendig.&lt;br /&gt;
* Die Variable, dessen Wert man im Reading haben möchte, kann man einfach ans Ende stellen[https://perldoc.perl.org/functions/return.html]&lt;br /&gt;
* mehrere UserReadings werden durch Komma getrennt.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;myreading {my $v = ReadingsVal($name,&amp;quot;actuation&amp;quot;,&amp;quot;error&amp;quot;)+62; fhem(&amp;quot;set PID desired $v&amp;quot;); $v},&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;myreading2 {my $v = ReadingsVal($name,&amp;quot;actuation&amp;quot;,&amp;quot;error&amp;quot;)+62; fhem(&amp;quot;set PID2 desired $v&amp;quot;); $v}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
{{Hinweis|Die nachfolgenden Beispiele sind ohne Trigger notiert. In der Regel sollte jedoch geprüft werden, ob nicht ein solcher Trigger gesetzt werden kann. Dies ist insbesondere in den Fällen sinnvoll, in denen in einem Gerät sehr viele Readings vorhanden sind, die ggf. zu unterschiedlichen Zeitpunkten aktualisiert werden. Das erste Beispiel wäre daher besser so zu schreiben:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;attr ElbePegelSchoena userReadings Pegel:value.* { ReadingsVal(&amp;quot;ElbePegelSchoena&amp;quot;,&amp;quot;value&amp;quot;,0) }&amp;lt;/code&amp;gt; }} &lt;br /&gt;
&lt;br /&gt;
==== Ein Reading soll einen anderen Namen bekommen ====&lt;br /&gt;
Das vorhandene Reading &amp;quot;value&amp;quot; des Devices &amp;quot;ElbePegelSchoena&amp;quot; soll künftig in &amp;quot;Pegel&amp;quot; umbenannt werden. Das geht nicht. Man kann aber ein neues Reading &amp;quot;Pegel&amp;quot; mit genau gleichem Wert erzeugen: &lt;br /&gt;
:&amp;lt;code&amp;gt;attr ElbePegelSchoena userReadings Pegel { ReadingsVal(&amp;quot;ElbePegelSchoena1&amp;quot;,&amp;quot;value&amp;quot;,0) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe eines Homematic 3-State Fenstersensor als Zahl für Visualisierung mit Icons ====&lt;br /&gt;
:&amp;lt;code&amp;gt;attr HM_XXXXXX userReadings Statenum {if(ReadingsVal(&amp;quot;HM_XXXXXX&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;closed&amp;quot;) {return 0} elsif (ReadingsVal(&amp;quot;HM_XXXXXX&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;tilted&amp;quot;) {return 1} elsif (ReadingsVal(&amp;quot;HM_XXXXXX&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;open&amp;quot;) {return 2} else {return -1}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe als Moving Average und formatierung mit sprintf ====&lt;br /&gt;
:&amp;lt;code&amp;gt;attr HZ_EINSTRAHLUNG_RAW userReadings Einstr_Mean.av {sprintf(&amp;quot;%.1f&amp;quot;,movingAverage(&amp;quot;HZ_EINSTRAHLUNG_RAW&amp;quot;,&amp;quot;reading&amp;quot;,1200))}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Umrechnung der Temperatur (durch 10 geteilt) und Einheit [°C] angehängt ====&lt;br /&gt;
:&amp;lt;code&amp;gt;attr HZ_EINSTRAHLUNG_T userReadings SolarTemp {ReadingsVal(&amp;quot;HZ_EINSTRAHLUNG_T&amp;quot;,&amp;quot;reading&amp;quot;,0)/10  .&amp;quot; °C&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Batterieüberwachung durch Erweiterung mit notify und userReading ====&lt;br /&gt;
... ist im Detail auf der Seite [[Batterieüberwachung]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== Integralfunktion - integral ====&lt;br /&gt;
Die Verwendung der Integralfunktion bei &#039;&#039;userReadings&#039;&#039; ist ausführlich im Forenbeitrag {{Link2Forum|Topic=26300|Message=193084|LinkText=Integralfunktion bei UserReadings}} erklärt.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2CmdRef|Lang=de|Anker=userReadings}} - userReadings&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Attribut (allgemeingültig)]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=34414</id>
		<title>Sonos2mqtt</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=34414"/>
		<updated>2020-12-18T13:31:20Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundeinrichtung ==&lt;br /&gt;
Die Grundeinrichtung ist bereits im Artikel [[MQTT2-Module - Praxisbeispiele#Sonos2Mqtt|MQTT2-Module - Praxisbeispiele]] beschrieben. Hier soll es um die praktische Verwendung und Erweiterung gehen. &lt;br /&gt;
&lt;br /&gt;
Für alle Erweiterungen wird versucht vorhandene Devices in FHEM zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Viele Dinge werden derzeit noch entwickelt und können frei gestaltet werden - der Vorteil von generischen FHEM Devices.&lt;br /&gt;
&lt;br /&gt;
== Tipps zur Verwendung ==&lt;br /&gt;
Die automatische Konfiguration setzt den alias entsprechend dem Namen im Sonos vergeben. Die langen MQTT2_RINCON_ Namen sind unhandlich und schlecht lesbar. Man kann Player mit einem devspec ansprechen, das simpelste ist:&lt;br /&gt;
&lt;br /&gt;
set alias=Büro play&lt;br /&gt;
&lt;br /&gt;
Oder alle Player&lt;br /&gt;
&lt;br /&gt;
set model=sonos2mqtt_speaker leaveGroup&lt;br /&gt;
&lt;br /&gt;
== Ansicht der Player ==&lt;br /&gt;
Im Template wird nur ein simples devStateIcon ausgeliefert. Dort kann man sehr viel mehr reinpacken. Hier mal die aktuelle Arbeitsvariante zum nachrüsten in der [[Import von Code Snippets|Raw Definition]]:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr model=sonos2mqtt_speaker devStateIcon {\&lt;br /&gt;
my $wpix = &#039;250px&#039;;;\&lt;br /&gt;
my $groupname = ReadingsVal($name,&#039;groupName&#039;,&#039;0&#039;);;\&lt;br /&gt;
my $sgroupname = (split(&#039; &#039;,ReadingsVal($name,&#039;groupName&#039;,&#039;&#039;)))[0];;\&lt;br /&gt;
my $uuidtoname = (devspec2array(&#039;DEF=&#039;.ReadingsVal($name,&#039;coordinatorUuid&#039;,&#039;0&#039;)))[0];;\&lt;br /&gt;
my $vol = ReadingsVal($name,&#039;volume&#039;,&#039;&#039;);;\&lt;br /&gt;
my $img = ReadingsVal($name,&#039;currentTrack_AlbumArtUri&#039;,&#039;&#039;);;\&lt;br /&gt;
my $mystate = $name eq $uuidtoname \&lt;br /&gt;
  ? ReadingsVal($name,&#039;state&#039;,&#039;FEHLER&#039;) : ReadingsVal($uuidtoname,&#039;state&#039;,&#039;&#039;);;\&lt;br /&gt;
my $playpic = $mystate eq &#039;PLAYING&#039;\&lt;br /&gt;
  ? &#039;rc_PAUSE@red&#039;    : $mystate eq &#039;PAUSED_PLAYBACK&#039;\&lt;br /&gt;
  ? &#039;rc_PLAY@green&#039;   : $mystate eq &#039;STOPPED&#039;\&lt;br /&gt;
  ? &#039;rc_PLAY@green&#039;   : $mystate eq &#039;TRANSITIONING&#039;\&lt;br /&gt;
  ? &#039;rc_PLAY@blue&#039;    : $mystate eq &#039;set_next&#039;\&lt;br /&gt;
  ? &#039;rc_NEXT@blue&#039;    : $mystate eq &#039;set_previous&#039;\&lt;br /&gt;
  ? &#039;rc_PREVIOUS@blue&#039;: $mystate eq &#039;set_volumeUp&#039;\&lt;br /&gt;
  ? &#039;rc_VOLUP@blue&#039;   : $mystate eq &#039;set_volumeDown&#039;\&lt;br /&gt;
  ? &#039;rc_VOLDOWN@blue&#039; : $mystate eq &#039;set_mute&#039;\&lt;br /&gt;
  ? &#039;rc_MUTE@blue&#039;    : &#039;rc_PLAY@yellow&#039;;;\&lt;br /&gt;
my $mutecmd = ReadingsVal($name,&#039;mute&#039;,&#039;0&#039;) eq &#039;false&#039;?&#039;true&#039;:&#039;false&#039;;;\&lt;br /&gt;
my $mutepic = $mutecmd eq &#039;on&#039;?&#039;rc_MUTE&#039;:&#039;rc_VOLUP&#039;;;\&lt;br /&gt;
my $show = &#039;FEHLER&#039;;;\&lt;br /&gt;
my $currentTrack_Artist = ReadingsVal($name,&#039;currentTrack_Artist&#039;,&#039;FEHLER&#039;);;\&lt;br /&gt;
my $currentTrack_Title = ReadingsVal($name,&#039;currentTrack_Title&#039;,&#039;FEHLER&#039;);;\&lt;br /&gt;
if ($currentTrack_Title =~ &#039;x-sonosapi-stream:&#039;){$currentTrack_Title=&#039;&#039;};;\&lt;br /&gt;
my $currentTrack = $mystate eq &#039;TRANSITIONING&#039;\&lt;br /&gt;
  ? &#039;Puffern...&#039; : $currentTrack_Artist.&#039; - &#039;.$currentTrack_Title;;\&lt;br /&gt;
my $nextTrack_Artist = ReadingsVal($name,&#039;nextTrack_Artist&#039;,&#039;FEHLER&#039;);;\&lt;br /&gt;
my $nextTrack_Title = ReadingsVal($name,&#039;nextTrack_Title&#039;,&#039;FEHLER&#039;);;\&lt;br /&gt;
my $nextTrack = $nextTrack_Artist.&#039; - &#039;.$nextTrack_Title;;\&lt;br /&gt;
my $previouspic = &#039;rc_PREVIOUS&#039;;;\&lt;br /&gt;
my $nextpic = &#039;rc_NEXT&#039;;;\&lt;br /&gt;
my $voldownpic = &#039;rc_VOLDOWN&#039;;;\&lt;br /&gt;
my $voluppic = &#039;rc_VOLUP&#039;;;\&lt;br /&gt;
my $leavegrouppic = &#039;rc_LEFT&#039;;;\&lt;br /&gt;
my $showlg = ReadingsVal($name,&amp;quot;name&amp;quot;,&amp;quot;0&amp;quot;) ne $groupname ? &amp;quot;&amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name leaveGroup&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($leavegrouppic).&amp;quot;&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;;\&lt;br /&gt;
if (($mystate eq &#039;PLAYING&#039;)\&lt;br /&gt;
  || ($mystate eq &#039;TRANSITIONING&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_next&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_previous&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_volumeUp&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_volumeDown&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_mute&#039; )) { \&lt;br /&gt;
    my $shownp = ReadingsVal($name,&#039;name&#039;,&#039;&#039;) eq $sgroupname \&lt;br /&gt;
    ? &amp;quot;&amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name previous&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($previouspic).&amp;quot;&amp;lt;/a&amp;gt;\&lt;br /&gt;
       &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name next&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($nextpic).&amp;quot;&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;;  \&lt;br /&gt;
    $show = &amp;quot;$showlg &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name toggle&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($playpic).&amp;quot;&amp;lt;/a&amp;gt;\&lt;br /&gt;
    &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name volumeDown&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($voldownpic).&amp;quot;&amp;lt;/a&amp;gt;\&lt;br /&gt;
    $shownp\&lt;br /&gt;
    &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name volumeUp&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($voluppic).&amp;quot;&amp;lt;/a&amp;gt;\&lt;br /&gt;
    &amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;\&lt;br /&gt;
    &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name mute $mutecmd&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($mutepic).&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;quot;;;\&lt;br /&gt;
  \&lt;br /&gt;
    if (ReadingsVal($name,&#039;name&#039;,&#039;&#039;) eq $sgroupname) {\&lt;br /&gt;
      $show = ReadingsVal($name,&#039;currentTrack_TrackUri&#039;,&#039;&#039;) =~ &#039;spdif&#039;\&lt;br /&gt;
      ? &#039;TV&#039;: ReadingsVal($name,&#039;enqueuedMetadata_UpnpClass&#039;,&#039;FEHLER&#039;) ne &#039;object.item.audioItem.audioBroadcast&#039;\&lt;br /&gt;
      ? &amp;quot;$show&amp;lt;marquee style=&#039;width: $wpix&#039;&amp;gt;Aktueller Track: $currentTrack&amp;lt;br&amp;gt;Nächster Track: $nextTrack&amp;lt;/marquee&amp;gt;&amp;quot;\&lt;br /&gt;
      : &amp;quot;$show&amp;lt;marquee style=&#039;width: $wpix&#039;&amp;gt;Radio: $currentTrack&amp;lt;/marquee&amp;gt;&amp;quot;\&lt;br /&gt;
    }\&lt;br /&gt;
    elsif (ReadingsVal($name,&#039;name&#039;,&#039;&#039;) ne $groupname) {\&lt;br /&gt;
      $show = &amp;quot;$show Master: $sgroupname&amp;quot;}\&lt;br /&gt;
    }\&lt;br /&gt;
    else {\&lt;br /&gt;
      $show = $name eq $uuidtoname\&lt;br /&gt;
      ? &amp;quot;$showlg &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name toggle&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($playpic).&amp;quot;&amp;lt;/a&amp;gt;&amp;quot;\&lt;br /&gt;
      : &amp;quot;$showlg &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name toggle&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($playpic).&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;Master: $sgroupname&amp;quot;\&lt;br /&gt;
    }\&lt;br /&gt;
  &amp;quot;&amp;lt;div&amp;gt;\&lt;br /&gt;
   &amp;lt;table&amp;gt;\&lt;br /&gt;
     &amp;lt;tr&amp;gt;\&lt;br /&gt;
       &amp;lt;td&amp;gt;&amp;lt;div style=&#039;display: inline-block;; margin-right: 5px;; border: 1px solid lightgray;;\&lt;br /&gt;
              height: 4.00em;; width: 4.00em;; background-image: url($img);; background-size: contain;;&#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;\&lt;br /&gt;
       &amp;lt;td&amp;gt;$show&amp;lt;/td&amp;gt;\&lt;br /&gt;
     &amp;lt;/tr&amp;gt;\&lt;br /&gt;
   &amp;lt;/table&amp;gt;\&lt;br /&gt;
   &amp;lt;/div&amp;gt;&amp;quot;\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Befehle nachrüsten ==&lt;br /&gt;
Um Befehle nicht manuell in die setList / readingList Einträge jedes Players machen zu müssen, wird diese Routine verwendet. &lt;br /&gt;
&lt;br /&gt;
Der Code ist für die Raw Definition gedacht. Die ersten drei Zeilen sind jeweils anzupassen! &lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel wird der setter für den folgenden Speak Befehl eingefügt bzw. ersetzt. &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{my @devlist = devspec2array(&#039;MQTT2_RINCON_.*&#039;);;\&lt;br /&gt;
 my $attr = &#039;setList&#039;;;\&lt;br /&gt;
 my $item = q(  speak:textField { my $tts=&amp;quot;SonosTTS&amp;quot;;;my ($cmd,$vol,$text)=split(&#039; &#039;, $EVENT,3);;fhem(&amp;quot;set $tts tts $text;;sleep $tts:playing:.0 ;;set $NAME notify $vol [$tts:httpName]&amp;quot;)});;\&lt;br /&gt;
 my ($first,$sec)=split(&#039; &#039;,$item,2);;\&lt;br /&gt;
 $first=~s/^\s+//;;\&lt;br /&gt;
 foreach (@devlist) {\&lt;br /&gt;
   my @arr = grep {$_ !~ $first} split(&amp;quot;\n&amp;quot;,AttrVal($_,$attr,&#039;&#039;));;\&lt;br /&gt;
   push @arr,$item;;\&lt;br /&gt;
   my $val = join &amp;quot;\n&amp;quot;,@arr;;\&lt;br /&gt;
   $val =~ s/;;/;;;;/g;;\&lt;br /&gt;
   fhem(&amp;quot;attr $_ $attr $val&amp;quot;)}\&lt;br /&gt;
 return &amp;quot;$attr in &amp;quot;.scalar(@devlist).&amp;quot; Definitionen modifiziert&amp;quot;\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Vorhandenen Zeilen werden ersetzt. Identifiziert wird nur der erste Teil. &lt;br /&gt;
&lt;br /&gt;
=== Speak Befehl ===&lt;br /&gt;
Verwendet wird ein Befehl ähnlich wie in der Sonos Umgebung:&lt;br /&gt;
&lt;br /&gt;
set Player speak &amp;lt;volume&amp;gt; text&lt;br /&gt;
&lt;br /&gt;
Zwei zusätzliche Geräte sind notwendig:&lt;br /&gt;
* [[Text2Speech]] im Servermodus, erzeugt mp3 Dateien im cache Verzeichnis und legt einen Link im Reading httpName ab.&lt;br /&gt;
* Ein HTTP Server stellt die Dateien im gleichen Verzeichnis bereit&lt;br /&gt;
Der speak Befehl im Player Device läuft in 3 Schritten:&lt;br /&gt;
# mit dem TTS Gerät wird die mp3 Datei erzeugt,&lt;br /&gt;
# mit dem sleep wird auf die Fertigstellung gewartet,&lt;br /&gt;
# die Datei wird mit set Player notify volume uri abgespielt.&lt;br /&gt;
Für die Funktion ist wichtig, dass das Sonos System den Host im Link zur Datei richtig auflösen kann. Deshalb wird der Hostname und Port des Servers im Reading host des TTS Device als Name oder IP Adresse abgelegt! Dies kann entweder mit dem hier gezeigten Befehl oder vollständig manuell erfolgen.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod SonosTTS Text2Speech none&lt;br /&gt;
attr SonosTTS TTS_UseMP3Wrap 1&lt;br /&gt;
attr SonosTTS userReadings httpName:lastFilename.* {&#039;http://&#039;.ReadingsVal($name,&#039;host&#039;,&#039;set host:port first&#039;).&#039;/fhem/&#039;.ReadingsVal($name,&#039;lastFilename&#039;,&#039;&#039;)}&lt;br /&gt;
attr SonosTTS TTS_CacheFileDir cache&lt;br /&gt;
setreading SonosTTS host {(qx(hostname -s|tr -d &#039;\n&#039;).&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host {((split(&#039; &#039;, qx(hostname -I)))[0].&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
&lt;br /&gt;
defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Durch den &amp;quot;sonos2mqtt notify&amp;quot; Befehl wird die laufende Umgebung wiederhergestellt. &lt;br /&gt;
* Wird der speak Befehl an den Gruppenmaster gesendet wird die mp3 Datei in der gesamten Gruppe gespielt. &lt;br /&gt;
* Wird der speak Befehl an ein Mitglied einer Gruppe gesendet (nicht den Master) wird die Gruppe aufgetrennt und später wieder hergestellt.&lt;br /&gt;
Die Erweiterung der setList im MQTT2 Player Device sieht wie folgt aus. Man kann den Befehl einfach bei allen Playern mit dem obigen [[Sonos2mqtt#Befehle nachr.C3.BCsten|Codeschnipsel]] nachrüsten.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
speak:textField { my $tts=&amp;quot;SonosTTS&amp;quot;;my ($cmd,$vol,$text)=split(&#039; &#039;, $EVENT,3);fhem(&amp;quot;set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Will man keine laufenden Sendung unterbrechen sondern einfach eine Ansage machen und danach etwas starten, kann man so vorgehen:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set SonosTTS tts Hier steht die Ansage;sleep SonosTTS:playing:.0 ; set alias=PlayerAlias playUri [SonosTTS:httpName]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Spiele feste Sounds ====&lt;br /&gt;
Generell kann man feste mp3 Dateien (Klingeltöne, Klänge usw.) auch im cache Verzeichnis ablegen und direkt mit dem Link starten. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Soundquellen im Internet, ist der gewünschte Sound dabei kann man ihn innerhalb FHEM herunterladen und an Ort und Stelle platzieren. (Beispiel ohne und mit Umbennung)&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;wget -qP ./cache https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;quot;wget -qO ./cache/KlingelTon.mp3 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Vergewissern ob der gewünschte Sound auch da ist: {qx(ls -lha ./cache)}&lt;br /&gt;
&lt;br /&gt;
Mit set magic kann man dabei einfach Teile aus anderen Readings holen.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro notify 25 {(&#039;http://[SonosTTS:host]/fhem/cache/KlingelTon.mp3&#039;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Man kann auch den setter im Gerät erweitern:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
playSound:textField {my $tts=&amp;quot;SonosTTS&amp;quot;;my ($cmd,$vol,$file)=split(&#039; &#039;, $EVENT,3);$file=($file=~m/.*\.mp3$/)?&amp;quot;$file&amp;quot;:&amp;quot;$file.mp3&amp;quot;;fhem(&amp;quot;set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/$file&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Damit sind dann diese Syntaxen möglich:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon.mp3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SonosBridge aufrüsten ===&lt;br /&gt;
Einige zentrale Dinge sind im SonosBridge Device gut aufgehoben. Seit der Beta 3.1.0-beta.1 ist es möglich die Sonos Umgebung zu aktualisieren ohne sonos2mqtt neu starten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die setList stattet die Bridge mit der Möglichkeit aus alle Player zu stoppen und die Umgebung neu einzulesen (das ist nützlich wenn man Player on/off betreibt)&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
PauseAll:noArg sonos/cmd/pauseall&lt;br /&gt;
CheckSubscription:noArg sonos/cmd/check-subscriptions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die Favoritenliste kann einmal zentral in der SonosBridge abgelegt werden. Dazu müssen wird dort die readingList ergänzen.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
  sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für eine einfache Abholung der aktuellen Favoriten kann der SonosBridge eine getList spendiert werden, man muss dazu einen Player eintragen (RINCON_).&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Favorites:noArg Favorites sonos/RINCON_XXXXXXXXXXXXX/control {&amp;quot;command&amp;quot;: &amp;quot;adv-command&amp;quot;,&amp;quot;input&amp;quot;: {&amp;quot;cmd&amp;quot;: &amp;quot;GetFavorites&amp;quot;,&amp;quot;reply&amp;quot;: &amp;quot;Favorites&amp;quot;}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ToDo: Code straffen und setList mit einbauen.&lt;br /&gt;
&lt;br /&gt;
Wer das nicht per Hand machen will hier zwei Codeblöcke für die Raw Definition:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{my @devlist = devspec2array(&#039;model=sonos2mqtt_bridge&#039;);;\&lt;br /&gt;
 my $attr = &#039;readingList&#039;;;\&lt;br /&gt;
 my $item = q(  sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites);;\&lt;br /&gt;
 my ($first,$sec)=split(&#039; &#039;,$item,2);;\&lt;br /&gt;
 $first=~s/^\s+//;;\&lt;br /&gt;
 foreach (@devlist) {\&lt;br /&gt;
   my @arr = grep {$_ !~ $first} split(&amp;quot;\n&amp;quot;,AttrVal($_,$attr,&#039;&#039;));;\&lt;br /&gt;
   push @arr,$item;;\&lt;br /&gt;
   my $val = join &amp;quot;\n&amp;quot;,@arr;;\&lt;br /&gt;
   $val =~ s/;;/;;;;/g;;\&lt;br /&gt;
   fhem(&amp;quot;attr $_ $attr $val&amp;quot;)}\&lt;br /&gt;
 return &amp;quot;$attr in &amp;quot;.scalar(@devlist).&amp;quot; Definitionen modifiziert&amp;quot;\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Achtung dieser Code schreibt eine neue getList in die SonosBridge, zum Ergänzen müsste der Code analog der bisherigen Beispiele verändert werden.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{my @devlist2 = devspec2array(&#039;MQTT2_RINCON_.*&#039;);;\&lt;br /&gt;
 my @arr2;;\&lt;br /&gt;
 foreach (@devlist2) {push @arr2,InternalVal($_,&#039;DEF&#039;,&#039;&#039;)};;\&lt;br /&gt;
 my $item= q(Favorites:noArg Favorites sonos/).$arr2[int(rand(@arr2))].q(/control  {&amp;quot;command&amp;quot;: &amp;quot;adv-command&amp;quot;,&amp;quot;input&amp;quot;: {&amp;quot;cmd&amp;quot;: &amp;quot;GetFavorites&amp;quot;,&amp;quot;reply&amp;quot;: &amp;quot;Favorites&amp;quot;}});;\&lt;br /&gt;
 fhem(&amp;quot;attr model=sonos2mqtt_bridge getList $item&amp;quot;)\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Player mit Favoritenliste ausstatten ===&lt;br /&gt;
Wenn nicht schon geschehen muss man jetzt die Favoriten zum ersten Mal einlesen: get SonosBridge Favorites&lt;br /&gt;
&lt;br /&gt;
Nachdem die SonosBridge &amp;quot;aufgerüstet&amp;quot; ist kann man allen Playern die Favoritenliste zum Auswählen eintragen. Dieser Code ist etwas umfangreicher und wieder ein &amp;quot;Script&amp;quot; für die Raw Def.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{use JSON;;use HTML::Entities;;use Encode qw(encode decode);;\&lt;br /&gt;
 my $enc = &#039;UTF8&#039;;;\&lt;br /&gt;
 my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;\&lt;br /&gt;
 my $read = &#039;Favorites&#039;;;\&lt;br /&gt;
 my $decoded = decode_json(ReadingsVal($dev,$read,&#039;&#039;));;\&lt;br /&gt;
 my @arr  = @{$decoded-&amp;gt;{&#039;Result&#039;}};;\&lt;br /&gt;
 my @out;;\&lt;br /&gt;
 foreach (@arr) {\&lt;br /&gt;
   my $dec=encode($enc, decode_entities($_-&amp;gt;{&#039;Title&#039;}));;\&lt;br /&gt;
   $dec =~ s/\s/./g;;\&lt;br /&gt;
   push @out,$dec}\&lt;br /&gt;
 my $favliste= join &#039;,&#039;, sort @out;;\&lt;br /&gt;
 \&lt;br /&gt;
 my @devlist = devspec2array(&#039;MQTT2_RINCON_.*&#039;);;\&lt;br /&gt;
 my $attr = &#039;setList&#039;;;\&lt;br /&gt;
 my $item = &#039;  playFav:&#039;.$favliste.q( {use JSON;;use HTML::Entities;;use Encode qw(encode decode);;my $enc = &#039;UTF8&#039;;;my $uri=&#039;&#039;;;my $search=(split(&#039; &#039;, $EVENT,2))[1];;$search=~s/[\/()]/./g;;my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $read=&#039;Favorites&#039;;;my $decoded = decode_json(ReadingsVal($dev,$read,&#039;&#039;));;my @arr=@{$decoded-&amp;gt;{&#039;Result&#039;}};;foreach (@arr) {if (encode($enc, decode_entities($_-&amp;gt;{&#039;Title&#039;}))=~/$search/i){$uri = $_-&amp;gt;{&#039;TrackUri&#039;} }};;fhem(&amp;quot;set $NAME playUri $uri&amp;quot;) if ($uri ne &#039;&#039;)});;\&lt;br /&gt;
 my ($first,$sec)=split(&#039;:&#039;,$item,2);;\&lt;br /&gt;
  $first=~s/^\s+//;;\&lt;br /&gt;
 foreach (@devlist) {\&lt;br /&gt;
   my @arr = grep {$_ !~ $first} split(&amp;quot;\n&amp;quot;,AttrVal($_,$attr,&#039;&#039;));;\&lt;br /&gt;
   push @arr,$item;;\&lt;br /&gt;
   my $val = join &amp;quot;\n&amp;quot;,@arr;;\&lt;br /&gt;
   $val =~ s/;;/;;;;/g;;\&lt;br /&gt;
   fhem(&amp;quot;attr $_ $attr $val&amp;quot;)}\&lt;br /&gt;
 return &amp;quot;$attr in &amp;quot;.scalar(@devlist).&amp;quot; Definitionen modifiziert&amp;quot;\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der erste Teil des Codes erzeugt aus den Favoriten ein Komma separierte, sortierte Liste der Titel und ersetzt die Leerzeichen durch Punkte. Damit eignet sich diese Liste für die Auswahlbox. Dies wird als Ergänzung der setList im zweiten Teil des Codes erzeugt und bei allen Playern eingetragen.&lt;br /&gt;
&lt;br /&gt;
Man kann den playFav Befehl auch mit im set Befehl mit einem Teil des Favoriten Namen verwenden. Enthält die Favoritenliste z.B. Radio Leipzig würde der auch mit diesem Befehl angesteuert werden:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Bad playFav leipzig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Radioliste durchtasten ===&lt;br /&gt;
Will man eine Liste von bestimmten Radiostation mit einem Taster &amp;quot;durchtasten&amp;quot; kann man das wie folgt tun:&lt;br /&gt;
&lt;br /&gt;
Eigene Radio Liste in ein Reading schreiben (Die Namen müssen zumindest in Teilen mit den Favoriten Titeln übereinstimmen)&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
setreading model=sonos2mqtt_bridge favRadios Deutschlandfunk Kultur,Radio Leipzig,Radio Station 3 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Befehl zum weiterschalten. Jedesmal wenn dieser Befehl ausgeführt wird, wird der nächste Favorit gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Arbeitszimmer playFav {(my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;Each($dev,ReadingsVal($dev,&#039;favRadios&#039;,&#039;&#039;)))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man vor dem Radiostart noch die Ansage des Senders haben, geht das zwar auch mit dem speak Befehl, die direkte Ausgabe ohne Restore der Umgebung (sonos2mqtt notify) ist aber effektiver.&lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen wir die Events einschränken: &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr model=sonos2mqtt_speaker event-on-change-reading .*&lt;br /&gt;
{my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $r=Each($dev,ReadingsVal($dev,&#039;favRadios&#039;,&#039;&#039;));;my $play = (devspec2array(&#039;alias=Büro&#039;))[0];;my $tts=&amp;quot;SonosTTS&amp;quot;;;fhem(&amp;quot;set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $play playUri [$tts:httpName];;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED;;set $play playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Kurze Erklärung zum Code &lt;br /&gt;
* ermittelt den nächsten Radiosender in der Liste,&lt;br /&gt;
* erzeugt die Ansage &amp;quot;Es folgt SenderXY&amp;quot;,&lt;br /&gt;
* wenn die mp3 Datei fertig erzeugt ist wird sie mit dem Befehl playUri an den Player gesendet,&lt;br /&gt;
* es wird eine Eventfolge abgewartet -&amp;gt; play / PLAYING / STOPPED,&lt;br /&gt;
* danach wird der Radiosender gestartet.&lt;br /&gt;
Der Code ist so einfach und relativ &amp;quot;steif&amp;quot; für die Kommandozeile. Man kann das auch in einen Setter packen:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
toggleRadio:noArg {my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];my $r=Each($dev,ReadingsVal($dev,&#039;favRadios&#039;,&#039;&#039;));my $tts=&amp;quot;SonosTTS&amp;quot;;fhem(&amp;quot;set $tts tts Es folgt $r;sleep $tts:playing:.0;set $NAME playUri [$tts:httpName];sleep $NAME:play;sleep $NAME:PLAYING;sleep $NAME:STOPPED;set $NAME playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dokumentationen und weitere Entwicklungen ==&lt;br /&gt;
ToDo&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=34413</id>
		<title>Sonos2mqtt</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=34413"/>
		<updated>2020-12-18T13:23:46Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundeinrichtung ==&lt;br /&gt;
Die Grundeinrichtung ist bereits im Artikel [[MQTT2-Module - Praxisbeispiele#Sonos2Mqtt|MQTT2-Module - Praxisbeispiele]] beschrieben. Hier soll es um die praktische Verwendung und Erweiterung gehen. &lt;br /&gt;
&lt;br /&gt;
Für alle Erweiterungen wird versucht vorhandene Devices in FHEM zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Viele Dinge werden derzeit noch entwickelt und können frei gestaltet werden - der Vorteil von generischen FHEM Devices.&lt;br /&gt;
&lt;br /&gt;
== Tipps zur Verwendung ==&lt;br /&gt;
Die automatische Konfiguration setzt den alias entsprechend dem Namen im Sonos vergeben. Die langen MQTT2_RINCON_ Namen sind unhandlich und schlecht lesbar. Man kann Player mit einem devspec ansprechen, das simpelste ist:&lt;br /&gt;
&lt;br /&gt;
set alias=Büro play&lt;br /&gt;
&lt;br /&gt;
Oder alle Player&lt;br /&gt;
&lt;br /&gt;
set model=sonos2mqtt_speaker leaveGroup&lt;br /&gt;
&lt;br /&gt;
== Ansicht der Player ==&lt;br /&gt;
Im Template wird nur ein simples devStateIcon ausgeliefert. Dort kann man sehr viel mehr reinpacken. Hier mal die aktuelle Arbeitsvariante zum nachrüsten in der [[Import von Code Snippets|Raw Definition]]:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr model=sonos2mqtt_speaker devStateIcon {\&lt;br /&gt;
my $wpix = &#039;250px&#039;;;\&lt;br /&gt;
my $groupname = ReadingsVal($name,&#039;groupName&#039;,&#039;0&#039;);;\&lt;br /&gt;
my $sgroupname = (split(&#039; &#039;,ReadingsVal($name,&#039;groupName&#039;,&#039;&#039;)))[0];;\&lt;br /&gt;
my $uuidtoname = (devspec2array(&#039;DEF=&#039;.ReadingsVal($name,&#039;coordinatorUuid&#039;,&#039;0&#039;)))[0];;\&lt;br /&gt;
my $vol = ReadingsVal($name,&#039;volume&#039;,&#039;&#039;);;\&lt;br /&gt;
my $img = ReadingsVal($name,&#039;currentTrack_AlbumArtUri&#039;,&#039;&#039;);;\&lt;br /&gt;
my $mystate = $name eq $uuidtoname \&lt;br /&gt;
  ? ReadingsVal($name,&#039;state&#039;,&#039;FEHLER&#039;) : ReadingsVal($uuidtoname,&#039;state&#039;,&#039;&#039;);;\&lt;br /&gt;
my $playpic = $mystate eq &#039;PLAYING&#039;\&lt;br /&gt;
  ? &#039;rc_PAUSE@red&#039;    : $mystate eq &#039;PAUSED_PLAYBACK&#039;\&lt;br /&gt;
  ? &#039;rc_PLAY@green&#039;   : $mystate eq &#039;STOPPED&#039;\&lt;br /&gt;
  ? &#039;rc_PLAY@green&#039;   : $mystate eq &#039;TRANSITIONING&#039;\&lt;br /&gt;
  ? &#039;rc_PLAY@blue&#039;    : $mystate eq &#039;set_next&#039;\&lt;br /&gt;
  ? &#039;rc_NEXT@blue&#039;    : $mystate eq &#039;set_previous&#039;\&lt;br /&gt;
  ? &#039;rc_PREVIOUS@blue&#039;: $mystate eq &#039;set_volumeUp&#039;\&lt;br /&gt;
  ? &#039;rc_VOLUP@blue&#039;   : $mystate eq &#039;set_volumeDown&#039;\&lt;br /&gt;
  ? &#039;rc_VOLDOWN@blue&#039; : $mystate eq &#039;set_mute&#039;\&lt;br /&gt;
  ? &#039;rc_MUTE@blue&#039;    : &#039;rc_PLAY@yellow&#039;;;\&lt;br /&gt;
my $mutecmd = ReadingsVal($name,&#039;mute&#039;,&#039;0&#039;) eq &#039;false&#039;?&#039;true&#039;:&#039;false&#039;;;\&lt;br /&gt;
my $mutepic = $mutecmd eq &#039;on&#039;?&#039;rc_MUTE&#039;:&#039;rc_VOLUP&#039;;;\&lt;br /&gt;
my $show = &#039;FEHLER&#039;;;\&lt;br /&gt;
my $currentTrack_Artist = ReadingsVal($name,&#039;currentTrack_Artist&#039;,&#039;FEHLER&#039;);;\&lt;br /&gt;
my $currentTrack_Title = ReadingsVal($name,&#039;currentTrack_Title&#039;,&#039;FEHLER&#039;);;\&lt;br /&gt;
if ($currentTrack_Title =~ &#039;x-sonosapi-stream:&#039;){$currentTrack_Title=&#039;&#039;};;\&lt;br /&gt;
my $currentTrack = $mystate eq &#039;TRANSITIONING&#039;\&lt;br /&gt;
  ? &#039;Puffern...&#039; : $currentTrack_Artist.&#039; - &#039;.$currentTrack_Title;;\&lt;br /&gt;
my $nextTrack_Artist = ReadingsVal($name,&#039;nextTrack_Artist&#039;,&#039;FEHLER&#039;);;\&lt;br /&gt;
my $nextTrack_Title = ReadingsVal($name,&#039;nextTrack_Title&#039;,&#039;FEHLER&#039;);;\&lt;br /&gt;
my $nextTrack = $nextTrack_Artist.&#039; - &#039;.$nextTrack_Title;;\&lt;br /&gt;
my $previouspic = &#039;rc_PREVIOUS&#039;;;\&lt;br /&gt;
my $nextpic = &#039;rc_NEXT&#039;;;\&lt;br /&gt;
my $voldownpic = &#039;rc_VOLDOWN&#039;;;\&lt;br /&gt;
my $voluppic = &#039;rc_VOLUP&#039;;;\&lt;br /&gt;
my $leavegrouppic = &#039;rc_LEFT&#039;;;\&lt;br /&gt;
my $showlg = ReadingsVal($name,&amp;quot;name&amp;quot;,&amp;quot;0&amp;quot;) ne $groupname ? &amp;quot;&amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name leaveGroup&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($leavegrouppic).&amp;quot;&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;;\&lt;br /&gt;
if (($mystate eq &#039;PLAYING&#039;)\&lt;br /&gt;
  || ($mystate eq &#039;TRANSITIONING&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_next&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_previous&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_volumeUp&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_volumeDown&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_mute&#039; )) { \&lt;br /&gt;
    my $shownp = ReadingsVal($name,&#039;name&#039;,&#039;&#039;) eq $sgroupname \&lt;br /&gt;
    ? &amp;quot;&amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name previous&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($previouspic).&amp;quot;&amp;lt;/a&amp;gt;\&lt;br /&gt;
       &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name next&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($nextpic).&amp;quot;&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;;  \&lt;br /&gt;
    $show = &amp;quot;$showlg &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name toggle&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($playpic).&amp;quot;&amp;lt;/a&amp;gt;\&lt;br /&gt;
    &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name volumeDown&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($voldownpic).&amp;quot;&amp;lt;/a&amp;gt;\&lt;br /&gt;
    $shownp\&lt;br /&gt;
    &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name volumeUp&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($voluppic).&amp;quot;&amp;lt;/a&amp;gt;\&lt;br /&gt;
    &amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;\&lt;br /&gt;
    &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name mute $mutecmd&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($mutepic).&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;quot;;;\&lt;br /&gt;
  \&lt;br /&gt;
    if (ReadingsVal($name,&#039;name&#039;,&#039;&#039;) eq $sgroupname) {\&lt;br /&gt;
      $show = ReadingsVal($name,&#039;currentTrack_TrackUri&#039;,&#039;&#039;) =~ &#039;spdif&#039;\&lt;br /&gt;
      ? &#039;TV&#039;: ReadingsVal($name,&#039;enqueuedMetadata_UpnpClass&#039;,&#039;FEHLER&#039;) ne &#039;object.item.audioItem.audioBroadcast&#039;\&lt;br /&gt;
      ? &amp;quot;$show&amp;lt;marquee style=&#039;width: $wpix&#039;&amp;gt;Aktueller Track: $currentTrack&amp;lt;br&amp;gt;Nächster Track: $nextTrack&amp;lt;/marquee&amp;gt;&amp;quot;\&lt;br /&gt;
      : &amp;quot;$show&amp;lt;marquee style=&#039;width: $wpix&#039;&amp;gt;Radio: $currentTrack&amp;lt;/marquee&amp;gt;&amp;quot;\&lt;br /&gt;
    }\&lt;br /&gt;
    elsif (ReadingsVal($name,&#039;name&#039;,&#039;&#039;) ne $groupname) {\&lt;br /&gt;
      $show = &amp;quot;$show Master: $sgroupname&amp;quot;}\&lt;br /&gt;
    }\&lt;br /&gt;
    else {\&lt;br /&gt;
      $show = $name eq $uuidtoname\&lt;br /&gt;
      ? &amp;quot;$showlg &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name toggle&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($playpic).&amp;quot;&amp;lt;/a&amp;gt;&amp;quot;\&lt;br /&gt;
      : &amp;quot;$showlg &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name toggle&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($playpic).&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;Master: $sgroupname&amp;quot;\&lt;br /&gt;
    }\&lt;br /&gt;
  &amp;quot;&amp;lt;div&amp;gt;\&lt;br /&gt;
   &amp;lt;table&amp;gt;\&lt;br /&gt;
     &amp;lt;tr&amp;gt;\&lt;br /&gt;
       &amp;lt;td&amp;gt;&amp;lt;div style=&#039;display: inline-block;; margin-right: 5px;; border: 1px solid lightgray;;\&lt;br /&gt;
              height: 4.00em;; width: 4.00em;; background-image: url($img);; background-size: contain;;&#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;\&lt;br /&gt;
       &amp;lt;td&amp;gt;$show&amp;lt;/td&amp;gt;\&lt;br /&gt;
     &amp;lt;/tr&amp;gt;\&lt;br /&gt;
   &amp;lt;/table&amp;gt;\&lt;br /&gt;
   &amp;lt;/div&amp;gt;&amp;quot;\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Befehle nachrüsten ==&lt;br /&gt;
Um Befehle nicht manuell in die setList / readingList Einträge jedes Players machen zu müssen, wird diese Routine verwendet. &lt;br /&gt;
&lt;br /&gt;
Der Code ist für die Raw Definition gedacht. Die ersten drei Zeilen sind jeweils anzupassen! &lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel wird der setter für den folgenden Speak Befehl eingefügt bzw. ersetzt. &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{my @devlist = devspec2array(&#039;MQTT2_RINCON_.*&#039;);;\&lt;br /&gt;
 my $attr = &#039;setList&#039;;;\&lt;br /&gt;
 my $item = q(  speak:textField { my $tts=&amp;quot;SonosTTS&amp;quot;;;my ($cmd,$vol,$text)=split(&#039; &#039;, $EVENT,3);;fhem(&amp;quot;set $tts tts $text;;sleep $tts:playing:.0 ;;set $NAME notify $vol [$tts:httpName]&amp;quot;)});;\&lt;br /&gt;
 my ($first,$sec)=split(&#039; &#039;,$item,2);;\&lt;br /&gt;
 $first=~s/^\s+//;;\&lt;br /&gt;
 foreach (@devlist) {\&lt;br /&gt;
   my @arr = grep {$_ !~ $first} split(&amp;quot;\n&amp;quot;,AttrVal($_,$attr,&#039;&#039;));;\&lt;br /&gt;
   push @arr,$item;;\&lt;br /&gt;
   my $val = join &amp;quot;\n&amp;quot;,@arr;;\&lt;br /&gt;
   $val =~ s/;;/;;;;/g;;\&lt;br /&gt;
   fhem(&amp;quot;attr $_ $attr $val&amp;quot;)}\&lt;br /&gt;
 return &amp;quot;$attr in &amp;quot;.scalar(@devlist).&amp;quot; Definitionen modifiziert&amp;quot;\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Vorhandenen Zeilen werden ersetzt. Identifiziert wird nur der erste Teil. &lt;br /&gt;
&lt;br /&gt;
=== Speak Befehl ===&lt;br /&gt;
Verwendet wird ein Befehl ähnlich wie in der Sonos Umgebung:&lt;br /&gt;
&lt;br /&gt;
set Player speak &amp;lt;volume&amp;gt; text&lt;br /&gt;
&lt;br /&gt;
Zwei zusätzliche Geräte sind notwendig:&lt;br /&gt;
* [[Text2Speech]] im Servermodus, erzeugt mp3 Dateien im cache Verzeichnis und legt einen Link im Reading httpName ab.&lt;br /&gt;
* Ein HTTP Server stellt die Dateien im gleichen Verzeichnis bereit&lt;br /&gt;
Der speak Befehl im Player Device läuft in 3 Schritten:&lt;br /&gt;
# mit dem TTS Gerät wird die mp3 Datei erzeugt,&lt;br /&gt;
# mit dem sleep wird auf die Fertigstellung gewartet,&lt;br /&gt;
# die Datei wird mit set Player notify volume uri abgespielt.&lt;br /&gt;
Für die Funktion ist wichtig, dass das Sonos System den Host im Link zur Datei richtig auflösen kann. Deshalb wird der Hostname und Port des Servers im Reading host des TTS Device als Name oder IP Adresse abgelegt! Dies kann entweder mit dem hier gezeigten Befehl oder vollständig manuell erfolgen.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod SonosTTS Text2Speech none&lt;br /&gt;
attr SonosTTS TTS_UseMP3Wrap 1&lt;br /&gt;
attr SonosTTS userReadings httpName:lastFilename.* {&#039;http://&#039;.ReadingsVal($name,&#039;host&#039;,&#039;set host:port first&#039;).&#039;/fhem/&#039;.ReadingsVal($name,&#039;lastFilename&#039;,&#039;&#039;)}&lt;br /&gt;
attr SonosTTS TTS_CacheFileDir cache&lt;br /&gt;
setreading SonosTTS host {(qx(hostname -s|tr -d &#039;\n&#039;).&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host {((split(&#039; &#039;, qx(hostname -I)))[0].&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
&lt;br /&gt;
defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Durch den &amp;quot;sonos2mqtt notify&amp;quot; Befehl wird die laufende Umgebung wiederhergestellt. &lt;br /&gt;
* Wird der speak Befehl an den Gruppenmaster gesendet wird die mp3 Datei in der gesamten Gruppe gespielt. &lt;br /&gt;
* Wird der speak Befehl an ein Mitglied einer Gruppe gesendet (nicht den Master) wird die Gruppe aufgetrennt und später wieder hergestellt.&lt;br /&gt;
Die Erweiterung der setList im MQTT2 Player Device sieht wie folgt aus. Man kann den Befehl einfach bei allen Playern mit dem obigen [[Sonos2mqtt#Befehle nachr.C3.BCsten|Codeschnipsel]] nachrüsten.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
speak:textField { my $tts=&amp;quot;SonosTTS&amp;quot;;my ($cmd,$vol,$text)=split(&#039; &#039;, $EVENT,3);fhem(&amp;quot;set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Will man keine laufenden Sendung unterbrechen sondern einfach eine Ansage machen und danach etwas starten, kann man so vorgehen:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set SonosTTS tts Hier steht die Ansage;sleep SonosTTS:playing:.0 ; set alias=PlayerAlias playUri [SonosTTS:httpName]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Spiele feste Sounds ====&lt;br /&gt;
Generell kann man feste mp3 Dateien (Klingeltöne, Klänge usw.) auch im cache Verzeichnis ablegen und direkt mit dem Link starten. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Soundquellen im Internet, ist der gewünschte Sound dabei kann man ihn innerhalb FHEM herunterladen und an Ort und Stelle platzieren. (Beispiel ohne und mit Umbennung)&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;wget -qP ./cache https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;quot;wget -qO ./cache/KlingelTon.mp3 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Vergewissern ob der gewünschte Sound auch da ist: {qx(ls -lha ./cache)}&lt;br /&gt;
&lt;br /&gt;
Mit set magic kann man dabei einfach Teile aus anderen Readings holen.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro notify 25 {(&#039;http://[SonosTTS:host]/fhem/cache/KlingelTon.mp3&#039;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Man kann auch den setter im Gerät erweitern:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
playSound:textField {my $tts=&amp;quot;SonosTTS&amp;quot;;my ($cmd,$vol,$file)=split(&#039; &#039;, $EVENT,3);$file=($file=~m/.*\.mp3$/)?&amp;quot;$file&amp;quot;:&amp;quot;$file.mp3&amp;quot;;fhem(&amp;quot;set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/$file&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Damit sind dann diese Syntaxen möglich:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon.mp3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SonosBridge aufrüsten ===&lt;br /&gt;
Einige zentrale Dinge sind im SonosBridge Device gut aufgehoben. Seit der Beta 3.1.0-beta.1 ist es möglich die Sonos Umgebung zu aktualisieren ohne sonos2mqtt neu starten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die setList stattet die Bridge mit der Möglichkeit aus alle Player zu stoppen und die Umgebung neu einzulesen (das ist nützlich wenn man Player on/off betreibt)&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
PauseAll:noArg sonos/cmd/pauseall&lt;br /&gt;
CheckSubscription:noArg sonos/cmd/check-subscriptions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die Favoritenliste kann einmal zentral in der SonosBridge abgelegt werden. Dazu müssen wird dort die readingList ergänzen.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
  sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für eine einfache Abholung der aktuellen Favoriten kann der SonosBridge eine getList spendiert werden, man muss dazu einen Player eintragen (RINCON_).&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Favorites:noArg Favorites sonos/RINCON_XXXXXXXXXXXXX/control {&amp;quot;command&amp;quot;: &amp;quot;adv-command&amp;quot;,&amp;quot;input&amp;quot;: {&amp;quot;cmd&amp;quot;: &amp;quot;GetFavorites&amp;quot;,&amp;quot;reply&amp;quot;: &amp;quot;Favorites&amp;quot;}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ToDo: Code straffen und setList mit einbauen.&lt;br /&gt;
&lt;br /&gt;
Wer das nicht per Hand machen will hier zwei Codeblöcke für die Raw Definition:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{my @devlist = devspec2array(&#039;model=sonos2mqtt_bridge&#039;);;\&lt;br /&gt;
 my $attr = &#039;readingList&#039;;;\&lt;br /&gt;
 my $item = q(  sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites);;\&lt;br /&gt;
 my ($first,$sec)=split(&#039; &#039;,$item,2);;\&lt;br /&gt;
 $first=~s/^\s+//;;\&lt;br /&gt;
 foreach (@devlist) {\&lt;br /&gt;
   my @arr = grep {$_ !~ $first} split(&amp;quot;\n&amp;quot;,AttrVal($_,$attr,&#039;&#039;));;\&lt;br /&gt;
   push @arr,$item;;\&lt;br /&gt;
   my $val = join &amp;quot;\n&amp;quot;,@arr;;\&lt;br /&gt;
   $val =~ s/;;/;;;;/g;;\&lt;br /&gt;
   fhem(&amp;quot;attr $_ $attr $val&amp;quot;)}\&lt;br /&gt;
 return &amp;quot;$attr in &amp;quot;.scalar(@devlist).&amp;quot; Definitionen modifiziert&amp;quot;\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Achtung dieser Code schreibt eine neue getList in die SonosBridge, zum Ergänzen müsste der Code analog der bisherigen Beispiele verändert werden.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{my @devlist2 = devspec2array(&#039;MQTT2_RINCON_.*&#039;);;\&lt;br /&gt;
 my @arr2;;\&lt;br /&gt;
 foreach (@devlist2) {push @arr2,InternalVal($_,&#039;DEF&#039;,&#039;&#039;)};;\&lt;br /&gt;
 my $item= q(Favorites:noArg Favorites sonos/).$arr2[int(rand(@arr2))].q(/control  {&amp;quot;command&amp;quot;: &amp;quot;adv-command&amp;quot;,&amp;quot;input&amp;quot;: {&amp;quot;cmd&amp;quot;: &amp;quot;GetFavorites&amp;quot;,&amp;quot;reply&amp;quot;: &amp;quot;Favorites&amp;quot;}});;\&lt;br /&gt;
 fhem(&amp;quot;attr model=sonos2mqtt_bridge getList $item&amp;quot;)\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Player mit Favoritenliste ausstatten ===&lt;br /&gt;
Wenn nicht schon geschehen muss man jetzt die Favoriten zum ersten Mal einlesen: get SonosBridge Favorites&lt;br /&gt;
&lt;br /&gt;
Nachdem die SonosBridge &amp;quot;aufgerüstet&amp;quot; ist kann man allen Playern die Favoritenliste zum Auswählen eintragen. Dieser Code ist etwas umfangreicher und wieder ein &amp;quot;Script&amp;quot; für die Raw Def.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{use JSON;;use HTML::Entities;;use Encode qw(encode decode);;\&lt;br /&gt;
 my $enc = &#039;UTF8&#039;;;\&lt;br /&gt;
 my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;\&lt;br /&gt;
 my $read = &#039;Favorites&#039;;;\&lt;br /&gt;
 my $decoded = decode_json(ReadingsVal($dev,$read,&#039;&#039;));;\&lt;br /&gt;
 my @arr  = @{$decoded-&amp;gt;{&#039;Result&#039;}};;\&lt;br /&gt;
 my @out;;\&lt;br /&gt;
 foreach (@arr) {\&lt;br /&gt;
   my $dec=encode($enc, decode_entities($_-&amp;gt;{&#039;Title&#039;}));;\&lt;br /&gt;
   $dec =~ s/\s/./g;;\&lt;br /&gt;
   push @out,$dec}\&lt;br /&gt;
 my $favliste= join &#039;,&#039;, sort @out;;\&lt;br /&gt;
 \&lt;br /&gt;
 my @devlist = devspec2array(&#039;MQTT2_RINCON_.*&#039;);;\&lt;br /&gt;
 my $attr = &#039;setList&#039;;;\&lt;br /&gt;
 my $item = &#039;  playFav:&#039;.$favliste.q( {use JSON;;use HTML::Entities;;use Encode qw(encode decode);;my $enc = &#039;UTF8&#039;;;my $uri=&#039;&#039;;;my $search=(split(&#039; &#039;, $EVENT,2))[1];;$search=~s/[\/()]/./g;;my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $read=&#039;Favorites&#039;;;my $decoded = decode_json(ReadingsVal($dev,$read,&#039;&#039;));;my @arr=@{$decoded-&amp;gt;{&#039;Result&#039;}};;foreach (@arr) {if (encode($enc, decode_entities($_-&amp;gt;{&#039;Title&#039;}))=~/$search/i){$uri = $_-&amp;gt;{&#039;TrackUri&#039;} }};;fhem(&amp;quot;set $NAME playUri $uri&amp;quot;) if ($uri ne &#039;&#039;)});;\&lt;br /&gt;
 my ($first,$sec)=split(&#039;:&#039;,$item,2);;\&lt;br /&gt;
  $first=~s/^\s+//;;\&lt;br /&gt;
 foreach (@devlist) {\&lt;br /&gt;
   my @arr = grep {$_ !~ $first} split(&amp;quot;\n&amp;quot;,AttrVal($_,$attr,&#039;&#039;));;\&lt;br /&gt;
   push @arr,$item;;\&lt;br /&gt;
   my $val = join &amp;quot;\n&amp;quot;,@arr;;\&lt;br /&gt;
   $val =~ s/;;/;;;;/g;;\&lt;br /&gt;
   fhem(&amp;quot;attr $_ $attr $val&amp;quot;)}\&lt;br /&gt;
 return &amp;quot;$attr in &amp;quot;.scalar(@devlist).&amp;quot; Definitionen modifiziert&amp;quot;\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der erste Teil des Codes erzeugt aus den Favoriten ein Komma separierte, sortierte Liste der Titel und ersetzt die Leerzeichen durch Punkte. Damit eignet sich diese Liste für die Auswahlbox. Dies wird als Ergänzung der setList im zweiten Teil des Codes erzeugt und bei allen Playern eingetragen.&lt;br /&gt;
&lt;br /&gt;
Man kann den playFav Befehl auch mit im set Befehl mit einem Teil des Favoriten Namen verwenden. Enthält die Favoritenliste z.B. Radio Leipzig würde der auch mit diesem Befehl angesteuert werden:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Bad playFav leipzig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Radioliste durchtasten ===&lt;br /&gt;
Will man eine Liste von bestimmten Radiostation mit einem Taster &amp;quot;durchtasten&amp;quot; kann man das wie folgt tun:&lt;br /&gt;
&lt;br /&gt;
Eigene Radio Liste in ein Reading schreiben (Die Namen müssen zumindest in Teilen mit den Favoriten Titeln übereinstimmen)&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
setreading model=sonos2mqtt_bridge favRadios Deutschlandfunk Kultur,Radio Leipzig,Radio Station 3 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Befehl zum weiterschalten. Jedesmal wenn dieser Befehl ausgeführt wird, wird der nächste Favorit gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Arbeitszimmer playFav {(my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;Each($dev,ReadingsVal($dev,&#039;favRadios&#039;,&#039;&#039;)))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man vor dem Radiostart noch die Ansage des Senders haben, geht das zwar auch mit dem speak Befehl, die direkte Ausgabe ohne Restore der Umgebung (sonos2mqtt notify) ist aber effektiver.&lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen wir die Events einschränken: &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr model=sonos2mqtt_speaker event-on-change-reading .*&lt;br /&gt;
{my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $r=Each($dev,ReadingsVal($dev,&#039;favRadios&#039;,&#039;&#039;));;my $play = (devspec2array(&#039;alias=Büro&#039;))[0];;my $tts=&amp;quot;SonosTTS&amp;quot;;;fhem(&amp;quot;set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $play playUri [$tts:httpName];;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED;;set $play playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Kurze Erklärung zum Code &lt;br /&gt;
* ermittelt den nächsten Radiosender in der Liste,&lt;br /&gt;
* erzeugt die Ansage &amp;quot;Es folgt SenderXY&amp;quot;,&lt;br /&gt;
* wenn die mp3 Datei fertig erzeugt ist wird sie mit dem Befehl playUri an den Player gesendet,&lt;br /&gt;
* es wird eine Eventfolge abgewartet -&amp;gt; play / PLAYING / STOPPED,&lt;br /&gt;
* danach wird der Radiosender gestartet.&lt;br /&gt;
Der Code ist so einfach und relativ &amp;quot;steif&amp;quot; für die Kommandozeile. Man kann das auch in einen Setter packen:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
toggleRadio:noArg {my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];my $r=Each($dev,ReadingsVal($dev,&#039;favRadios&#039;,&#039;&#039;));my $tts=&amp;quot;SonosTTS&amp;quot;;fhem(&amp;quot;set $tts tts Es folgt $r;sleep $tts:playing:.0;set $NAME playUri [$tts:httpName];sleep $NAME:play;sleep $NAME:PLAYING;sleep $NAME:STOPPED;set $NAME playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dokumentationen und weitere Entwicklungen ==&lt;br /&gt;
ToDo&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Mi_vacuum&amp;diff=34242</id>
		<title>Mi vacuum</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Mi_vacuum&amp;diff=34242"/>
		<updated>2020-11-16T16:47:26Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Vorarbeiten (Linux) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Todo|Aktualiserung / Einbindung Info-Box}}&lt;br /&gt;
=Mi Vacuum=&lt;br /&gt;
Wie der preiswerte Staubsaugerroboter auch auf FHEM hört...&lt;br /&gt;
&lt;br /&gt;
==Für wen ist die Anleitung gedacht?==&lt;br /&gt;
Ich gehe davon aus, dass ihr ein funktionierendes FHEM auf einem Linux Rechner (Debian) betreibt.&lt;br /&gt;
&lt;br /&gt;
Weiterhin denke ich, dass euer Hauptarbeitsrechner unter Windows läuft.&lt;br /&gt;
&lt;br /&gt;
Als Smartphone OS Android (wer Apple hat, kann gerne die Token-Auslese-Geschichte hier beschreiben).&lt;br /&gt;
&lt;br /&gt;
Um das Teil auch von Alexa aus ein und aus zu schalten, sollte auch die Installation von Alexa in FHEM fertig sein.&lt;br /&gt;
&lt;br /&gt;
==Die Einrichtung des Moduls==&lt;br /&gt;
===Vorarbeiten (Linux)===&lt;br /&gt;
Zunächst fangen wir mal auf unserem FHEM Rechner an. Mit Putty verbinden wir uns per SSH mit dem FHEM Computer.&lt;br /&gt;
&lt;br /&gt;
Folgende Befehle können benötigt werden (Debian):&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libjson-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libdigest-md5-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libcrypt-cbc-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt install libcryptx-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libcrypt-ecb-perl&amp;lt;/code&amp;gt; (nur nötig, wenn ihr einen verschlüsselten Token mit 96 Zeichen habt)&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo cpan Crypt::Rijndael_PP&amp;lt;/code&amp;gt; (nur nötig, wenn libcryptx-perl aus irgendwelchen Gründen nicht funktioniert)&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo cpan Crypt::Cipher::AES&amp;lt;/code&amp;gt; (nur nötig, wenn Crypt::Rijndael_PP aus irgendwelchen Gründen nicht funktioniert)&lt;br /&gt;
&lt;br /&gt;
Wenn bei dem ein oder anderen Modul die Meldung kommt, dass es schon installiert ist, einfach mit dem nächsten Befehl weiter machen. Das CPAN Teil würde ich am Schluss machen, das braucht ziemlich lang zum installieren.&lt;br /&gt;
&lt;br /&gt;
===Vorarbeiten am Smartphone (Token)===&lt;br /&gt;
Das Problem ist folgendes:&lt;br /&gt;
&lt;br /&gt;
Wenn der Roboter mit dem WLAN verbunden wird, generiert er einen Token. Das ist ein Schlüssel, ohne den er sich nicht steuern lässt. Damit FHEM drauf zugreifen kann, benötigt man diesen Token.&lt;br /&gt;
&lt;br /&gt;
Mit den neueren Versionen der MiHome App klappt das Auslesen der Tokens leider nicht mehr.&lt;br /&gt;
&lt;br /&gt;
====Auslesen bei Android Endgeräten====&lt;br /&gt;
&lt;br /&gt;
Ich gehe davon aus, dass der Staubsauger mit der original MiHome App eingebunden ist und funktioniert. (Ich habe bei der Einrichtung des Servers =&amp;gt; &amp;quot;other&amp;quot; gewählt. Offenbar wollen neuere Staubsauger sich mit &amp;quot;China Mainland&amp;quot; nicht mehr verbinden. Tut hier an dieser Stelle zwar nichts zur Sache, aber vielleicht hilft es dem ein oder anderen. Wenn man die Region gewechselt hat, muss man auch den Staubsauger neu einbinden)&lt;br /&gt;
&lt;br /&gt;
* MiHome löschen&lt;br /&gt;
* alte MiHome suchen (APKMirror z.B., Version 5.0.19 hat bei mir funktioniert, unsichere Quellen müssen erlaubt sein)&lt;br /&gt;
* runtergeladene MiHome App öffnen und anmelden (sollte ganz normal den Sauger finden)&lt;br /&gt;
* USB-Debugging am Handy einschalten (Entwickleroptionen...)&lt;br /&gt;
* Handy mit USB Kabel und PC verbinden&lt;br /&gt;
* [https://github.com/ultrara1n/MiToolkit/releases MiToolkit] 1.6 runterladen und öffnen&lt;br /&gt;
* [https://github.com/ultrara1n/MiToolkit/releases MiToolkit] erzeugt nun am Handy ein Backup&lt;br /&gt;
* anschließend zeigt es den Token direkt am PC an&lt;br /&gt;
&lt;br /&gt;
====Auslesen bei iOS Endgeräten====&lt;br /&gt;
&lt;br /&gt;
Zum Auslesen des Tokens mit iOS Endgeräten kann die Anleitung unter folgendem Link befolgt werden: [https://forum.smartapfel.de/forum/thread/370-xiaomi-token-auslesen/]&lt;br /&gt;
&lt;br /&gt;
===Installation des inoffiziellen Moduls===&lt;br /&gt;
Das Modul ist seit 28.02.2018 ein offizielles Modul. Eine separates Installation ist nicht (mehr) notwendig.&lt;br /&gt;
&lt;br /&gt;
==Einrichten des Moduls==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Mi_Vacuum XiaomiDevice 192.168.222.77 55387753545937326a33396943557999&lt;br /&gt;
&lt;br /&gt;
attr Mi_Vacuum subType VacuumCleaner&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und schon (=etwa nach 10 Sekunden) sollte euer Roboter in FHEM mit ganz vielen Readings auftauchen.&lt;br /&gt;
&lt;br /&gt;
==Anwendung: Sprachsteuerung mit Alexa (einfach, ein und aus)==&lt;br /&gt;
Wie bindet man das jetzt schnell in Alexa ein?&lt;br /&gt;
&lt;br /&gt;
Wir legen uns in FHEM einen Dummy an. Dieser wird ein Switch (on off). Dazu noch ein DOIF oder ein notify, welches diesen Switch überwacht. Je nach Status des Dummys schalten wir den Roboter.&lt;br /&gt;
&lt;br /&gt;
Ein List meines Dummys:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Internals: &lt;br /&gt;
   CFGFN &lt;br /&gt;
   NAME       Mi_Vacuum_Staubsauger &lt;br /&gt;
   NR         719473 &lt;br /&gt;
   STATE      on &lt;br /&gt;
   TYPE       dummy &lt;br /&gt;
   Readings: &lt;br /&gt;
     2017-09-18 21:10:12   state           on &lt;br /&gt;
 Attributes: &lt;br /&gt;
   alexaName  Mi_Vacuum_Staubsauger &lt;br /&gt;
   genericDeviceType switch &lt;br /&gt;
   room       alexa &lt;br /&gt;
   setList    on off &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mein DOIF:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define di_Mi_Vacuum DOIF ([Mi_Vacuum_Staubsauger:&amp;quot;on&amp;quot;]) (set Mi_Vacuum start) DOELSE (set Mi_Vacuum charge)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Attribut do always nicht vergessen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Den Dummy setzen wir in den Raum, der unsere Alexa Geräte beinhaltet. Nun den Alexa FHEM Service neu starten. Anschließend sollte eine Suche nach neuen Geräten in Alexa unseren Dummy finden. Für diesen legen wir in Alexa einen neuen Raum an, z.B. Staubsauger.&lt;br /&gt;
&lt;br /&gt;
Fertig.&lt;br /&gt;
&lt;br /&gt;
Ein &amp;quot;Alexa schaltet den Staubsauger ein&amp;quot; lässt unseren Mi-Vacuum loslegen. &amp;quot;Alexa schalte den Staubsauger aus&amp;quot; schickt ihn wieder zurück zu seiner Station.&lt;br /&gt;
&lt;br /&gt;
==Zonenreinigung==&lt;br /&gt;
Um nur Teilbereiche einer Wohnung zu reinigen, ist es möglich über das Modul Zonen zu definieren. Hierzu ist es notwendig, die Koordinaten der gewünschten Zone zu ermitteln. Hierzu eignet sich die [https://xiaomi.flole.de/ FloleVac App] die entweder auf einem Android Device oder auf einem Android Emulator (z.B. [https://www.bluestacks.com/download.html BlueStacks]) verwendet werden kann. In der App kann man in der Karte eine Zone für die Reinigung markieren und durch langes Gedrückthalten des &amp;quot;Reinigen-Buttons&amp;quot; in der FloleVac App die Koordinaten dieser Zone in die Zwischenablage kopieren. &lt;br /&gt;
&lt;br /&gt;
Mit diesen Koordindaten im Format [16200,27250,31650,27650,1] kann man dann loslegen die Zonen in FHEM zu definieren:&lt;br /&gt;
&lt;br /&gt;
Entweder direkt über die Werte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set vacuum zone 16200,27250,31650,27650,1 23700,23050,25200,24200,2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder über die passenden Attribute erst ein Alias anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr vacuum zone_names home:[16200,27250,31650,27650,1],[23700,23050,25200,24200,2] livingroom:[16200,26250,23000,30150,1]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Alias kann dann wie folgt genutzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set vacuum zone home&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
* {{Link2Forum|Topic=73052|LinkText=Forums-Thread}}&lt;br /&gt;
* {{Link2Forum|Topic=76940|LinkText=Diskussionsthread}}&lt;br /&gt;
* [http://miniweb.sourceforge.net/ MiniWeb], kleiner WebServer für Windows&lt;br /&gt;
* [https://xiaomi.flole.de/ Flole], alternative App für Android, die das Token nach GoogleDrive exportiert&lt;br /&gt;
* [http://www.roboter-forum.com/forumdisplay.php?130-Xiaomi Roboter-Forum] deutschsprachiges Forum, welches sich mit dem Mi Vacuum beschäftigt (auch vor dem Kauf des Roboters lohnt sich ein Besuch dort)&lt;br /&gt;
* [https://paypal.me/mm0 PayPal]-Link, um Markus M. Dankeschön zu sagen&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UserReadings&amp;diff=33709</id>
		<title>UserReadings</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UserReadings&amp;diff=33709"/>
		<updated>2020-08-26T20:12:37Z</updated>

		<summary type="html">&lt;p&gt;TomLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:userReadings}}  &amp;lt;!-- da richtige Schreibweise kleinen Anfangsbuchstaben hat --&amp;gt;&lt;br /&gt;
Über das Attribut [[userReadings]] können bei einem Device benutzerdefinierte Readings einschließlich der Anweisungen zum Befüllen derselben festgelegt werden. Das können zum Einen Formatänderungen (&amp;quot;sprintf&amp;quot;), oder aber auch durch die &#039;&#039;Modifier&#039;&#039;&lt;br /&gt;
* difference&lt;br /&gt;
* differential&lt;br /&gt;
* integral&lt;br /&gt;
* offset&lt;br /&gt;
* monotonic&lt;br /&gt;
gesteuerte Berechnungen sein.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=&#039;&#039;&#039;Geändertes Verhalten - bitte beachten&#039;&#039;&#039;&lt;br /&gt;
Im April 2016 hat sich die Verarbeitung des &#039;&#039;Triggers&#039;&#039; dahingehend geändert, dass die Trigger-Spezifikation jetzt als [[Regulärer Ausdruck]] interpretiert wird, damit also z.B. ein &amp;lt;code&amp;gt;avgTemp:temperature&amp;lt;/code&amp;gt; geändert werden muss in &amp;lt;code&amp;gt;avgTemp:temperature.*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Technische Details dazu wurden in {{Link2Forum|Topic=52165|LinkText=diesem Forenthread}} diskutiert.}}&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=readingFnAttributes}}.&lt;br /&gt;
&lt;br /&gt;
* Bei Eingabe im Editor-Feld müssen mehrere Befehle mit einem &amp;quot;;&amp;quot; getrennt werden, bei Änderung in der Eingabezeile sind zwei &amp;quot;;&amp;quot; notwendig.&lt;br /&gt;
* Die Variable, dessen Wert man im Reading haben möchte, kann man einfach ans Ende stellen[https://perldoc.perl.org/functions/return.html]&lt;br /&gt;
* mehrere UserReadings werden durch Komma getrennt.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;myreading {my $v = ReadingsVal($name,&amp;quot;actuation&amp;quot;,&amp;quot;error&amp;quot;)+62; fhem(&amp;quot;set PID desired $v&amp;quot;); $v},&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;myreading2 {my $v = ReadingsVal($name,&amp;quot;actuation&amp;quot;,&amp;quot;error&amp;quot;)+62; fhem(&amp;quot;set PID2 desired $v&amp;quot;); $v}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* die mehrzeilige Definition mehrerer UserReadings setzt ein Leerzeichen nach dem Komma voraus&lt;br /&gt;
 myreading {my $v = ReadingsVal($name,&amp;quot;actuation&amp;quot;,&amp;quot;error&amp;quot;)+62;&lt;br /&gt;
 fhem(&amp;quot;set PID desired $v&amp;quot;);&lt;br /&gt;
 $v;},&amp;lt;span style=&amp;quot;background:grey&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
 myreading2 {my $v = ReadingsVal($name,&amp;quot;actuation&amp;quot;,&amp;quot;error&amp;quot;)+62;&lt;br /&gt;
 fhem(&amp;quot;set PID2 desired $v&amp;quot;);&lt;br /&gt;
 $v;}&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
{{Hinweis|Die nachfolgenden Beispiele sind ohne Trigger notiert. In der Regel sollte jedoch geprüft werden, ob nicht ein solcher Trigger gesetzt werden kann. Dies ist insbesondere in den Fällen sinnvoll, in denen in einem Gerät sehr viele Readings vorhanden sind, die ggf. zu unterschiedlichen Zeitpunkten aktualisiert werden. Das erste Beispiel wäre daher besser so zu schreiben:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;attr ElbePegelSchoena userReadings Pegel:value.* { ReadingsVal(&amp;quot;ElbePegelSchoena&amp;quot;,&amp;quot;value&amp;quot;,0) }&amp;lt;/code&amp;gt; }} &lt;br /&gt;
&lt;br /&gt;
==== Ein Reading soll einen anderen Namen bekommen ====&lt;br /&gt;
Das vorhandene Reading &amp;quot;value&amp;quot; des Devices &amp;quot;ElbePegelSchoena&amp;quot; soll künftig in &amp;quot;Pegel&amp;quot; umbenannt werden. Das geht nicht. Man kann aber ein neues Reading &amp;quot;Pegel&amp;quot; mit genau gleichem Wert erzeugen: &lt;br /&gt;
:&amp;lt;code&amp;gt;attr ElbePegelSchoena userReadings Pegel { ReadingsVal(&amp;quot;ElbePegelSchoena1&amp;quot;,&amp;quot;value&amp;quot;,0) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe eines Homematic 3-State Fenstersensor als Zahl für Visualisierung mit Icons ====&lt;br /&gt;
:&amp;lt;code&amp;gt;attr HM_XXXXXX userReadings Statenum {if(ReadingsVal(&amp;quot;HM_XXXXXX&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;closed&amp;quot;) {return 0} elsif (ReadingsVal(&amp;quot;HM_XXXXXX&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;tilted&amp;quot;) {return 1} elsif (ReadingsVal(&amp;quot;HM_XXXXXX&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;open&amp;quot;) {return 2} else {return -1}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe als Moving Average und formatierung mit sprintf ====&lt;br /&gt;
:&amp;lt;code&amp;gt;attr HZ_EINSTRAHLUNG_RAW userReadings Einstr_Mean.av {sprintf(&amp;quot;%.1f&amp;quot;,movingAverage(&amp;quot;HZ_EINSTRAHLUNG_RAW&amp;quot;,&amp;quot;reading&amp;quot;,1200))}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Umrechnung der Temperatur (durch 10 geteilt) und Einheit [°C] angehängt ====&lt;br /&gt;
:&amp;lt;code&amp;gt;attr HZ_EINSTRAHLUNG_T userReadings SolarTemp {ReadingsVal(&amp;quot;HZ_EINSTRAHLUNG_T&amp;quot;,&amp;quot;reading&amp;quot;,0)/10  .&amp;quot; °C&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Batterieüberwachung durch Erweiterung mit notify und userReading ====&lt;br /&gt;
... ist im Detail auf der Seite [[Batterieüberwachung]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== Integralfunktion - integral ====&lt;br /&gt;
Die Verwendung der Integralfunktion bei &#039;&#039;userReadings&#039;&#039; ist ausführlich im Forenbeitrag {{Link2Forum|Topic=26300|Message=193084|LinkText=Integralfunktion bei UserReadings}} erklärt.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2CmdRef|Lang=de|Anker=userReadings}} - userReadings&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Attribut (allgemeingültig)]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=33331</id>
		<title>MQTT2-Module - Praxisbeispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=33331"/>
		<updated>2020-06-02T13:05:39Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Verbinden mehrerer FHEM-Instanzen über MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung: MQTT bzw. MQTT2 in FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] oder benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht&amp;lt;ref&amp;gt;Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden&amp;lt;/ref&amp;gt;. MQTT2_DEVICE unterstützt u.a. auch die &#039;&#039;setExtensions&#039;&#039; direkt, also z.B. &#039;&#039;on-for-timer&amp;lt;ref&amp;gt;Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die &#039;&#039;split&#039;&#039;-Varianten der attrTemplate-Einrichtung zu verwenden.&amp;lt;/ref&amp;gt;&#039;&#039; sowie &#039;&#039;[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]&#039;&#039;&amp;lt;ref&amp;gt;Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muß dies dort per Attribut eingeschaltet werden&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Einstellungen und Hinweise ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für autocreate in Verbindung mit MQTT2_SERVER &#039;&#039;&#039;zwingend&#039;&#039;&#039; jeder über MQTT kommunizierende Client eine ClientID angeben muß. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch &amp;quot;Wegwerf&amp;quot;-ClientID&#039;s. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit &#039;&#039;&#039;MQTT2_SERVER als Server (&amp;quot;Broker&amp;quot;)&#039;&#039;&#039;, für diesen sollte dabei &#039;&#039;autocreate&#039;&#039; nicht deaktiviert sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden&amp;lt;ref&amp;gt;Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) ebenfalls aktiv ist.&amp;lt;/ref&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Beispiel&amp;lt;ref&amp;gt;MQTT2_SERVER verwendet als default-Einstellung für &#039;&#039;autocreate&#039;&#039; &#039;&#039;simple&#039;&#039;, ohne dass ein entsprechendes Attribut gesetzt werden müßte. Die Einstellung &#039;&#039;complex&#039;&#039; empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 define MQTT2_FHEM_Server MQTT2_SERVER 1883 global&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muß ggf. die &amp;quot;\&amp;quot; entfernen!}}&lt;br /&gt;
&lt;br /&gt;
=== MQTT-Einstellungen in den Geräten ===&lt;br /&gt;
Die Beispiele gehen davon aus, dass die einzubindenden Geräte &#039;&#039;&#039;&#039;&#039;mit den default-Einstellungen&#039;&#039;&#039;&#039;&#039; für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere &#039;&#039;&#039;keine Veränderungen der topic-Pfade&#039;&#039;&#039; vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen.  }}&lt;br /&gt;
&lt;br /&gt;
== zigbee2mqtt ==&lt;br /&gt;
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]&lt;br /&gt;
[https://github.com/Koenkk/zigbee2mqtt zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.&lt;br /&gt;
=== Installation von zigbee2mqtt ===&lt;br /&gt;
Die Installation des zigbee2mqtt-Diensts ist auf der Homepage des Projekts beschrieben. Ergänzend muß in der configuration.yaml eine &#039;&#039;client_id&#039;&#039; unter &#039;&#039;mqtt&#039;&#039; (z.B. zigbee_pi) vergeben werden&amp;lt;ref&amp;gt;Die Anführungszeichen sowie genau zwei Leerzeichen sind hier erforderlich!&amp;lt;/ref&amp;gt;.&lt;br /&gt;
 mqtt:&lt;br /&gt;
   client_id: &#039;zigbee_pi&#039;&lt;br /&gt;
Da der Dienst auch später in den Anlernmodus versetzt werden kann, kann man auch gleich &amp;lt;code&amp;gt;permit_join: false&amp;lt;/code&amp;gt; setzen, um das versehentliche Einbinden neuer oder fremder Geräte zu unterbinden.&lt;br /&gt;
{{Hinweis|Wird ein CC2531 auf demselben Linux-Computer verwendet, auf dem auch FHEM installiert ist, kann es vorkommen, dass FHEM diesen mit einem CUL verwechselt und durch &#039;&#039;initialUsbCheck&#039;&#039; in FHEM einbindet, wodurch er für den zigbee2mqtt-Dienst nicht mehr verfügbar ist. Dann sollte &#039;&#039;initialUsbCheck&#039;&#039; deaktiviert und das automatisch angelegte CUL-Device wieder gelöscht werden. Weiter sollte der CC2531 auch in FHEM &#039;&#039;&#039;und&#039;&#039;&#039; zigbee2mqtt &#039;&#039;[[Mehrere USB-Geräte einbinden|by-id]]&#039;&#039; eingebunden werden, um Probleme beim gleichzeitigen Einsatz anderer Geräte, die &#039;&#039;/dev/ttyACMx&#039;&#039; belegen können, zu vermeiden (betrifft z.B. CUL/MapleCUL ).}}&lt;br /&gt;
&lt;br /&gt;
=== Define eines MQTT2-Devices als &amp;quot;Bridge&amp;quot; === &lt;br /&gt;
Dann kann eine Art &amp;quot;Grund-Device&amp;quot; angelegt werden, das für die Ansteuerung des eigentlichen Server-Dienstes genutzt wird, der bereits unmittelbar nach der erfolgreichen Konfiguration von zigbee2mqtt zur Verfügung steht. In der Regel sollte dieses automatisch erstellt werden, wenn der zigbee2mqtt-Dienst (oder der betreffende Rechner) neu gestartet wird (oder FHEM oder dort ein Sensor einen Messwert sendet). Beispiel&amp;lt;ref&amp;gt;Hier waren bereits zwei Zigbee-Geräte angelernt&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 defmod MQTT2_zigbee_pi MQTT2_DEVICE zigbee_pi&lt;br /&gt;
 attr MQTT2_zigbee_pi IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_zigbee_pi readingList zigbee_pi:zigbee2mqtt/bridge/state:.* state\&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/0x90fd9ffffe65db16:.* { json2nameValue($EVENT, &#039;&#039;) }\&#039;&#039;&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/0x90fd9ffffe0bcd51:.* { json2nameValue($EVENT, &#039;&#039;) }\&#039;&#039;&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/bridge/log:.* { json2nameValue($EVENT, &#039;log_&#039;) }&lt;br /&gt;
 attr MQTT2_zigbee_pi room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Für die Funktion einer zigbee2mqtt-Bridge steht ein {{Link2CmdRef|Anker=set|Lang=en|Label=template}} bereit, das direkt die passenden Attribute vergibt, um dem zigbee2mqtt-Dienst passende Anweisungen geben zu können und weitere Geräte für die eigentlichen Aktoren und Sensoren anzulegen:&lt;br /&gt;
&lt;br /&gt;
 set MQTT2_zigbee_pi attrTemplate zigbee2mqtt_bridge&lt;br /&gt;
&lt;br /&gt;
Ist dieses angelegt, kann zigbee2mqtt mit &amp;lt;code&amp;gt;set MQTT2_zigbee_pi permit_join true&amp;lt;/code&amp;gt; in den Anlernmodus versetzt werden, anzulernende Geräte müssen anschließend jeweils nach Bedienungsanleitung in den Anlernmodus gebracht werden.&lt;br /&gt;
&lt;br /&gt;
=== Vereinzeln der eigentlichen Geräte ===&lt;br /&gt;
&lt;br /&gt;
Über das mit dem template vergebene bridgeRegexp-Attribut  &lt;br /&gt;
 attr MQTT2_zigbee_pi bridgeRegexp zigbee2mqtt/([A-Za-z0-9]*)[/]?.*:.* &amp;quot;zigbee_$1&amp;quot; &lt;br /&gt;
werden anschließend neue MQTT2_DEVICE-Geräte automatisch angelegt, sobald ein bisher unbekanntes Zigbee-Gerät einen neuen Status (z.B. einen Meßwert) meldet. Um zu erfragen, welche Geräte dem zigbee-Deinst bekannt sind, kann via &amp;lt;code&amp;gt;get MQTT2_zigbee_pi devicelist true&amp;lt;/code&amp;gt; eine Liste abgefragt werden, die weitere Informationen zu den bereits angelernten Geräten enthält.&lt;br /&gt;
Geräte, die nicht automatisch etwas senden, kann man mit Hilfe des MQTT2_SERVER-Geräts einmalig schalten, damit diese ihren Status bzw. das erfolgreiche Schalten zurückmelden, Beispiel&amp;lt;ref&amp;gt;Die mit 0x... beginnende Angabe entspricht dabei dem &#039;&#039;friendly_name&#039;&#039;.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;ON&amp;quot;,&amp;quot;brightness&amp;quot;:60}&lt;br /&gt;
&lt;br /&gt;
Für Gerätetypen, für die bereits templates vorhanden sind, ist es am einfachsten, diese einmalig auf die Geräte anzuwenden. Das Vorgehen entspricht dabei dem oben für die Bridge beschriebenen. Dafür wird immer vorausgesetzt, dass ein neues Device mit autocreate (ggf. über die bridgeRegexp) angelegt wurde&amp;lt;ref&amp;gt;Dieses befindet sich dann im Raum MQTT2_DEVICE. Um diesen sichtbar zu machen, muß ggf. die Browser-Seite neu geladen werden.&amp;lt;/ref&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
==== IKEA-Tradfri-Birne ====&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Wie wähle ich nun das richtige Template für mein Leuchtmittel aus?&lt;br /&gt;
-&amp;gt; Es wird nicht zwischen einer Birne/Bulb/Lampe und einem LED-Controller unterschieden sondern anhand der möglichen Lichtdarstellung des Gerätes:&lt;br /&gt;
&lt;br /&gt;
light_dimmer:&lt;br /&gt;
Das anzusteuernde Geräte besitzt ausschließlich eine feste Lichtfarbe welche gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_cct:&lt;br /&gt;
Das anzusteuernde Gerät besitzt eine warmweiße sowie kaltweiße Lichtfarbe welche verändert sowie gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_rgb_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und kann gedimmt werden.&lt;br /&gt;
&lt;br /&gt;
light_rgbw_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und besitzt eine warmweiße ODER kaltweiße Lichtfarbe welche eingestellt sowie gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_rgbcct_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und besitzt eine warmweiße UND kaltweiße Lichtfarbe welche verändert sowie gedimmt werden kann.&lt;br /&gt;
   &lt;br /&gt;
   xxx:&lt;br /&gt;
      hex:   Farbänderung mit hex&lt;br /&gt;
      rgb:   Farbänderung mit r g b&lt;br /&gt;
      xy:   Farbänderung mit x sowie y&lt;br /&gt;
      hue:   Farbänderung mit hue und saturation&lt;br /&gt;
&lt;br /&gt;
Warum diese Einteilung in &amp;quot;hex&amp;quot;, &amp;quot;rgb&amp;quot;, &amp;quot;xy&amp;quot; sowie &amp;quot;hue&amp;quot;?&lt;br /&gt;
-&amp;gt; Zigbee2MQTT unterstützt das Übermitteln aller dieser Werte, allerdings unterscheiden sich hier die Geräte. Manche &amp;quot;verstehen&amp;quot; nur z.B. Hex-Farbänderungen, andere halt nur eine Farbänderung mit rgb-Werten.&lt;br /&gt;
-&amp;gt; Aus diesem Grund muss an dieser Stelle probiert werden mit welchem der 4 Templates sich die Farbveränderung des Gerätes steuern lässt!&lt;br /&gt;
&lt;br /&gt;
HINWEIS: Templates für Farbänderungen mithilfe von XY- sowie HUE-Werten wurden bis heute nicht angelegt!&lt;br /&gt;
}}&lt;br /&gt;
Beispiel eines dimmbaren Tradfri-Leuchtmittels&lt;br /&gt;
 defmod IKEA_Bulb2 MQTT2_DEVICE&lt;br /&gt;
 attr IKEA_Bulb2 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr IKEA_Bulb2 icon light_control&lt;br /&gt;
 attr IKEA_Bulb2 devStateIcon {zigbee2mqtt_devStateIcon255($name)}&lt;br /&gt;
 attr IKEA_Bulb2 readingList zigbee_pi:zigbee2mqtt/0x90fd9ffffe0bcd51:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr IKEA_Bulb2 setList on:noArg zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
     off:noArg zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
     brightness:colorpicker,BRI,0,15,255 zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;on&amp;quot;,&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr IKEA_Bulb2 webCmd toggle:on:off:brightness&lt;br /&gt;
 attr IKEA_Bulb2 model L_02a_zigbee2mqtt_bulb&lt;br /&gt;
&lt;br /&gt;
Kann man auch die Farbtemperatur einstellen, wird die setList wie folgt erweitert oder das entsprechende template&amp;lt;ref&amp;gt;Durch die &#039;&#039;model&#039;&#039;-Angabe kann nachvollzogen werden, welches template angewendet wurde.&amp;lt;/ref&amp;gt; anwendet:&lt;br /&gt;
 ...&lt;br /&gt;
 color_temp:colorpicker,CT,250,1,454 zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Die templates sind dabei in der Regel so gestaltet, dass eventuell mehr Optionen in FHEMWEB erscheinen, als tatsächlich vorhanden oder erwünscht sind. &lt;br /&gt;
Da sich obige einfarbige dimmbare Lampe durch Klicken auf das devStateIcon schalten läßt, ist für die vollständige Ansteuerung bereits dieses webCmd hinreichend:&lt;br /&gt;
 attr IKEA_Bulb2 webCmd brightness&lt;br /&gt;
&lt;br /&gt;
==== Temp/Hum. Sensor ====&lt;br /&gt;
tbd&lt;br /&gt;
&lt;br /&gt;
==== Motion Sensor ====&lt;br /&gt;
Als MQTT-Server wird hier &#039;&#039;mosquitto&#039;&#039; verwendet, als IO-Device wird daher ein {{Link2CmdRef|Anker=MQTT2_CLIENT|Lang=en|Label=MQTT2_CLIENT}}-Gerät definiert: &lt;br /&gt;
&lt;br /&gt;
 defmod mqtt2_client MQTT2_CLIENT 192.168.2.4:1883&lt;br /&gt;
 attr mqtt2_client autocreate 1&lt;br /&gt;
 attr mqtt2_client rawEvents zigbee2mqtt/GB_Bewegungsmelder:.*&lt;br /&gt;
 attr mqtt2_client room test&lt;br /&gt;
 attr mqtt2_client subscriptions #&lt;br /&gt;
&lt;br /&gt;
Das eigentliche Device sieht dann so aus:&lt;br /&gt;
 defmod GB_Bewegungsmelder_MQTT2 MQTT2_DEVICE zigbee_158d0001f9d030&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 IODev mqtt2_client&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 devStateIcon motion:motion_detector@red off:motion_detector@green no_motion:motion_detector@green&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 icon motion_detector@blue&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 readingList mqtt2client:zigbee2mqtt/GB_Bewegungsmelder:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 room MQTT2_DEVICE&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 stateFormat {\&lt;br /&gt;
 if(ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;occupancy&amp;quot;,0) eq &amp;quot;true&amp;quot;) {\&lt;br /&gt;
 	sprintf(&amp;quot;motion&amp;quot;);;\&lt;br /&gt;
 	} else {\&lt;br /&gt;
 	sprintf(&amp;quot;no_motion&amp;quot;);;	\&lt;br /&gt;
 	}\&lt;br /&gt;
 }&lt;br /&gt;
==== Anlegen von Zigbee2MQTT-Gruppen in FHEM ====&lt;br /&gt;
{{Hinweis|Die nachfolgende Darstellung ist vorläufig!}}&lt;br /&gt;
{{Hinweis|Bevor man eine Gruppe mithilfe von Zigbee2MQTT anlegen kann, sollte man sicherstellen, dass man über die aktuelleste Version von Zigbee2MQTT verfügt (min. vom 15. Februar 2019). Außerdem sollte auch der Koordinator (zumeist CC2531) die aktuellste Firmware besitzen (min. vom 15. Februar 2019). Falls ein flashen des Koordinators mit der neusten Firmware erfolgen soll, ist darauf zu achten, dass nach einem flashen alle Geräte neu angelernt werden müssen! (Hinweise zum flashen ohne erneutem anlernen sind hier zu finden: https://www.zigbee2mqtt.io/information/flashing_without_re-pairing.html)}}&lt;br /&gt;
&lt;br /&gt;
=====Erstellen einer Zigbee2MQTT-Gruppe=====&lt;br /&gt;
Bevor das Ganze in FHEM funktioniert, muss eine Gruppe in der &amp;quot;configuration.yaml&amp;quot; angelegt werden, dieser Vorgang ist auf folgender Seite beschrieben: https://www.zigbee2mqtt.io/information/groups.html&lt;br /&gt;
Wenn die Geräte anschließend über den FHEM MQTT2-Server der Gruppe hinzugefügen werden sollen, kann dies mit folgendem Befehl erfolgen:&lt;br /&gt;
 set &amp;lt;MQTT2-Server&amp;gt; publish zigbee2mqtt/bridge/group/&amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;/add &amp;lt;Zigbee2MQTT Friendly-Gerätename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/bridge/group/Wohnzimmer/add Stehlampe&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl kann so oft verwendet werden, wie man Geräte zu einer Gruppe hinzufügen möchte.&lt;br /&gt;
&lt;br /&gt;
Zum Entfernen eines Gerätes aus einer Gruppe kann folgender Befehl verwendet werden:&lt;br /&gt;
 set &amp;lt;MQTT2-Server&amp;gt; publish zigbee2mqtt/bridge/group/&amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;/remove &amp;lt;Zigbee2MQTT Friendly-Gerätename&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/bridge/group/Wohnzimmer/remove Kuechenlampe&lt;br /&gt;
&lt;br /&gt;
=====Anlegen der Gruppe in FHEM=====&lt;br /&gt;
Da Gruppen in Zigbee2MQTT aktuell keine Rückmeldung über ihren Status geben, wird auch beim einmaligen Schalten kein Gerät automatisch in FHEM angelegt. Aus diesem Grund muss dies mit folgendem Befehl noch manuell erfolgen:&lt;br /&gt;
 defmod &amp;lt;FHEM NAME&amp;gt; MQTT2_DEVICE&lt;br /&gt;
Beispiel&lt;br /&gt;
 defmod lichtWohnzimmer MQTT2_DEVICE&lt;br /&gt;
Anschließend wird auch für dieses Gerät wieder ein passendes template ausgewählt, wie als wäre es ein normales Zigbee2MQTT-Gerät.&lt;br /&gt;
Im anschließenden Dialog-Fenster welches sich nach dem Setzen des templates öffnet, müssen die folgenden Werte durch passendes ersetzt werden:&lt;br /&gt;
 BASE_TOPIC -&amp;gt; zigbee2mqtt&lt;br /&gt;
 DEV_ID -&amp;gt; &amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach sollte sich die Gruppe wie ein normales Zigbee2MQTT Gerät steuern lassen.&lt;br /&gt;
&lt;br /&gt;
== Tasmota ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. &lt;br /&gt;
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter &#039;&#039;&amp;lt;nowiki&amp;gt;topic = %topic% (tasmota)&amp;lt;/nowiki&amp;gt;&#039;&#039; ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem  Eingabefeld für &#039;&#039;&amp;quot;client ...&amp;quot;&#039;&#039;, siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
=== MQTT2_DEVICE ===&lt;br /&gt;
Dieses sollte bei aktiviertem &#039;&#039;autocreate&#039;&#039; am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen ===&lt;br /&gt;
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden:  &lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD IODev m2server&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    DVES_9B01BD:cmnd/DVES_9B01BD/POWER:.* POWER\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr MQTT2_DVES_9B01BD room MQTT2_DEVICE&lt;br /&gt;
 attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\&lt;br /&gt;
    off cmnd/DVES_9B01BD/POWER off\&lt;br /&gt;
    reboot cmnd/DVES_9B01BD/Restart 1&lt;br /&gt;
 attr MQTT2_DVES_9B01BD webCmd on:off:reboot&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
&lt;br /&gt;
===== Allgemeines =====&lt;br /&gt;
Für gängige Tasmota-Geräte stehen &#039;&#039;templates&#039;&#039; bereit, mit denen sich diese schnell konfigurieren lassen. &lt;br /&gt;
Beachten Sie dazu den Abschnitt &#039;&#039;attrTemplate&#039;&#039; in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}&lt;br /&gt;
&lt;br /&gt;
===== Kein passendes attrTemplate vorhanden? =====&lt;br /&gt;
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das &amp;quot;&#039;&#039;tasmota_basic&#039;&#039;&amp;quot; anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults &amp;quot;ON&amp;quot; bzw. &amp;quot;OFF&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Allerdings stellt dieses das &#039;&#039;autocreate&#039;&#039; an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das &#039;&#039;autocreate&#039;&#039;-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im &#039;&#039;jsonMap&#039;&#039;-Attribut nur die Angabe &amp;quot;&#039;&#039;POWER1:state&#039;&#039;&amp;quot; zu belassen.&lt;br /&gt;
&lt;br /&gt;
=== on-for-timer ===&lt;br /&gt;
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen &#039;&#039;setter&#039;&#039; in der &#039;&#039;setList&#039;&#039; werden die &#039;&#039;&#039;SetExtensions&#039;&#039;&#039; verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:&lt;br /&gt;
&lt;br /&gt;
==== delay ==== &lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (Attributeingabe via FHEMWEB!):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1*10; &#039;cmnd/DVES_575127/Backlog POWER1 1; delay &#039;.$duration.&#039;; POWER1 0&#039;}&lt;br /&gt;
&lt;br /&gt;
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe https://github.com/arendst/Tasmota/wiki/Commands#delay), also eine Stunde.&lt;br /&gt;
&lt;br /&gt;
====pulseTime ====&lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (s.o.):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1 &amp;lt; 11.2 ? $EVTPART1*10 : $EVTPART1+100; &#039;CMNDTOPIC/Backlog pulseTime1 &#039;.$duration.&#039;; POWER1 1&#039;}&lt;br /&gt;
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit &#039;&#039;delay&#039;&#039;. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren &amp;quot;normalen&amp;quot; Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites &#039;&#039;save&#039;&#039; nur bis zum nächsten reboot des Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
== ESPurna ==&lt;br /&gt;
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool&#039;sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als &amp;quot;on&amp;quot; oder &amp;quot;off&amp;quot; oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.&lt;br /&gt;
&lt;br /&gt;
== Shelly ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.&lt;br /&gt;
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen weitere Geräte angelegt und konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly1 ===&lt;br /&gt;
&lt;br /&gt;
=== Shellybulb ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate  angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
 Internals:&lt;br /&gt;
   CFGFN     &lt;br /&gt;
   CID        shellybulb_3CC533&lt;br /&gt;
   DEF        shellybulb_3CC533&lt;br /&gt;
   DEVICETOPIC MQTT2_shellybulb_3CC533&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   NAME       MQTT2_shellybulb_3CC533&lt;br /&gt;
   NR         246&lt;br /&gt;
   STATE      ???&lt;br /&gt;
   TYPE       MQTT2_DEVICE&lt;br /&gt;
   READINGS:&lt;br /&gt;
     2018-12-12 19:28:08   status_blue     0&lt;br /&gt;
     2018-12-12 19:28:08   status_brightness 61&lt;br /&gt;
     2018-12-12 19:28:08   status_effect   0&lt;br /&gt;
     2018-12-12 19:28:08   status_gain     26&lt;br /&gt;
     2018-12-12 19:28:08   status_green    0&lt;br /&gt;
     2018-12-12 19:28:08   status_ison     true&lt;br /&gt;
     2018-12-12 19:28:08   status_mode     color&lt;br /&gt;
     2018-12-12 19:28:08   status_red      255&lt;br /&gt;
     2018-12-12 19:28:08   status_temp     3250&lt;br /&gt;
     2018-12-12 19:28:08   status_white    0&lt;br /&gt;
 Attributes:&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, &#039;status_&#039;) }&lt;br /&gt;
   room       MQTT2_DEVICE&lt;br /&gt;
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate &amp;quot;shellybulb&amp;quot; auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly Plug S ===&lt;br /&gt;
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb &amp;gt; 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:&lt;br /&gt;
  attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state =&amp;gt; $EVTPART0&amp;lt;100?&amp;quot;off&amp;quot;:&amp;quot;on&amp;quot; } }&lt;br /&gt;
Der Status des MQTT2 Devices zeigt dann bei &amp;lt;100W &amp;quot;off&amp;quot; und sonst &amp;quot;on&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
=== HTTP-Commands ===&lt;br /&gt;
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.&lt;br /&gt;
&lt;br /&gt;
== 8-Port-Ethernet Board ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse&lt;br /&gt;
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
In diesem [https://forum.fhem.de/index.php/topic,107536.msg1016379.html#msg1016379 Forenbeitrag] bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.&lt;br /&gt;
&lt;br /&gt;
== Milight-Bridge ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von &#039;&#039;openmili&#039;&#039; eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel.&lt;br /&gt;
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway&amp;lt;ref&amp;gt;Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist.&lt;br /&gt;
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen am MiLight-Hub ===&lt;br /&gt;
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.&lt;br /&gt;
Die Einstellungen für &#039;&#039;MQTT topic pattern&#039;&#039; usw. können auf den default-Werten&amp;lt;ref&amp;gt;Diese sind: &amp;lt;br&amp;gt;&#039;&#039;milight/:device_id/:device_type/:group_id&#039;&#039; für &amp;quot;topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/updates/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;update topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/states/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;state topic pattern&amp;quot;. Der Autor hat derzeit folgende Infotypen zum Senden markiert: &amp;quot;status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color&amp;quot; (enthält eventuell zu viele Angaben. Bei einem Eventhandler muß man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).&amp;lt;/ref&amp;gt; belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (&#039;&#039;MQTT Client Status Topic&#039;&#039;), tragen Sie &#039;&#039;milight/LWT&#039;&#039; ein und aktivieren &#039;&#039;Detailed&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Devices ===&lt;br /&gt;
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]&lt;br /&gt;
==== Bridge ====&lt;br /&gt;
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:&lt;br /&gt;
 defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses Device wird nun das &#039;&#039;template&#039;&#039; &#039;&#039;&#039;esp_milight_hub_bridge&#039;&#039;&#039; angewandt.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Leuchtmittel ====&lt;br /&gt;
&lt;br /&gt;
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:&lt;br /&gt;
 defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Devices werden genauso erstellt. &lt;br /&gt;
&lt;br /&gt;
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template &#039;&#039;X_01a_esp_milight_hub_make_rgbw_group&#039;&#039; verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt &#039;&#039;&#039;eine Kopie&#039;&#039;&#039;, die dann modifiziert wird. Diese Kopie ist unter dem Namen &#039;&#039;milight_&amp;lt;RemoteID&amp;gt;_0&#039;&#039; im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepaßt werden. &lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele:&lt;br /&gt;
Beispiel für ein RGB-CCT-Device:&lt;br /&gt;
 defmod Licht_Wz_all MQTT2_DEVICE&lt;br /&gt;
 attr Licht_Wz_all IODev MQTT2_Broker&lt;br /&gt;
 attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/&lt;br /&gt;
 attr Licht_Wz_all group Licht&lt;br /&gt;
 attr Licht_Wz_all icon light_control&lt;br /&gt;
 attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 &lt;br /&gt;
 attr Licht_Wz_all room Wohnzimmer&lt;br /&gt;
 attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
 off milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
 level milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 next_mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_up milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 device_id milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 effect milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 commands milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr Licht_Wz_all sortby 1&lt;br /&gt;
 attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue&lt;br /&gt;
 attr Licht_Wz_all webCmdLabel command\ &lt;br /&gt;
 :brightness:saturation\&lt;br /&gt;
 :color_temp:hue&lt;br /&gt;
==== Ein Leuchtmittel, mehrere Fernbedienungen ====&lt;br /&gt;
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen &amp;quot;hört&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }&lt;br /&gt;
&lt;br /&gt;
==== Fernbedienung als Input-Device nutzen ====&lt;br /&gt;
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.&lt;br /&gt;
Um hier nur Differenz-Meldungen zu erhalten und doppelte Events zu verhindern, sollte hier die readingList so angepaßt werden, dass nur Messages aus dem &amp;quot;updates&amp;quot;-Zweig ausgewertet werden: &lt;br /&gt;
 defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0&lt;br /&gt;
 attr MiLight_RC1_0 readingList milight/updates/0xABCD/fut089/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/fut089/0:.* {}&lt;br /&gt;
&lt;br /&gt;
== eBus ==&lt;br /&gt;
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition am eBus ===&lt;br /&gt;
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.&lt;br /&gt;
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. &#039;&#039;ebusd/%circuit/%name&#039;&#039;.&lt;br /&gt;
 --accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name&lt;br /&gt;
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic &#039;&#039;ebusd&#039;&#039; verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit &#039;&#039;ebus...&#039;&#039; zu beginnen!}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition  in FHEM ===&lt;br /&gt;
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem &#039;&#039;&#039;&#039;&#039;vor&#039;&#039;&#039;&#039;&#039; den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der &#039;&#039;readingList&#039;&#039; enthalten, die vom ebus stammen. Da wir die &#039;&#039;readingList&#039;&#039; anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche &#039;&#039;readingList&#039;&#039;-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-&amp;quot;Sammeldevices&amp;quot; genutzt werden, und dessen &#039;&#039;CID&#039;&#039; auf &#039;&#039;ebusd&#039;&#039; geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der &#039;&#039;readingList&#039;&#039; des &amp;quot;Sammeldevices&amp;quot; gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. &lt;br /&gt;
&lt;br /&gt;
Sind die Vorbereitungen abgeschlossen, aktivieren wir &#039;&#039;autocreate&#039;&#039; wieder, allerdings wählen wir als autocreate-Methode &#039;&#039;complex&#039;&#039; aus, da der eBus-Dämon teilweise&amp;lt;ref&amp;gt;Dies betrifft vorrangig die Statusmeldungen&amp;lt;/ref&amp;gt; eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt&amp;lt;ref&amp;gt;Bei Verwendung des MQTT2_CLIENT wird dann die &#039;&#039;readingList&#039;&#039; am bereits definierten MQTT2_DEVICE aus der Kopie des &amp;quot;Sammeldevice&amp;quot; automatisch wieder erstellt bzw. gefüllt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;ebus-Bridge&amp;quot; ====&lt;br /&gt;
Auf das von &#039;&#039;autocreate&#039;&#039; erstellte MQTT2_DEVICE wird nunmehr das template &#039;&#039;eBus_daemon_splitter&#039;&#039; angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. &lt;br /&gt;
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen &#039;&#039;uptime&#039;&#039;, alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;attrTemplate&#039;&#039; läd eine weitere &#039;&#039;attrTemplate&#039;&#039;-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. &lt;br /&gt;
==== &amp;quot;ebusd_bai&amp;quot; und weitere Geräte ====&lt;br /&gt;
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}&lt;br /&gt;
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens &#039;&#039;MQTT2_ebus_bai&#039;&#039; angelegt worden sein.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Hinweise ==&lt;br /&gt;
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===&lt;br /&gt;
Nutzt man das rawEvents-Attribut am MQTT2-IO&amp;lt;ref&amp;gt;z.B. &amp;lt;code&amp;gt;attr MQTT2_FHEM_Server rawEvents .*&amp;lt;/code&amp;gt;, der regex-Filter kann wie üblich angepaßt werden&amp;lt;/ref&amp;gt;, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.&lt;br /&gt;
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit &amp;lt;code&amp;gt;attr mqtt2_server verbose 5&amp;lt;/code&amp;gt; auch alles ins FHEM-Log schreiben lassen.&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; genutzt werden. &lt;br /&gt;
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate: Es werden nicht alle templates angezeigt ===&lt;br /&gt;
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate und Sprachsteuerung ===&lt;br /&gt;
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; dem betreffenden Hauptartikel zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
=== bridgeRegexp ===&lt;br /&gt;
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch &#039;&#039;&#039;&#039;&#039;einem&#039;&#039;&#039;&#039;&#039; &#039;&#039;MQTT2_DEVICE&#039;&#039; zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. Das &#039;&#039;&#039;Attribut&#039;&#039;&#039; &#039;&#039;bridgeRegexp&#039;&#039; kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem &#039;&#039;&#039;anderen Device&#039;&#039;&#039; (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als &#039;&#039;newClientId&#039;&#039; hinterlegte Angabe verwendet. &lt;br /&gt;
Dementsprechend sind in den hier aufgeführten Beispielen &#039;&#039;bridgeRegexp&#039;&#039;-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren. Ein Sonderfall hierbei ist das template &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem &#039;&#039;mosquitto&#039;&#039;-Server und würden sonst alle einem einem MQTT2_DEVICE zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Ständig neue Devices? ===&lt;br /&gt;
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:&lt;br /&gt;
==== Vergabe einer ClientID ====&lt;br /&gt;
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). &lt;br /&gt;
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID&#039;s. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.&lt;br /&gt;
&lt;br /&gt;
==== Löschen der ClientID aus der readingList usw. ====&lt;br /&gt;
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den &#039;&#039;default&#039;&#039; &amp;quot;sonoff&amp;quot; zu ändern).&lt;br /&gt;
Beispielsweise wäre &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt; zu ändern in &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt;&lt;br /&gt;
Die über &#039;&#039;attrTemplate&#039;&#039; verfügbaren Konfigurationen verwenden in der Regel keine ClientID&#039;s bzw. entfernen diese.&lt;br /&gt;
&lt;br /&gt;
=== Wildcards in readingList und setList ===&lt;br /&gt;
Auch in readingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;readingList&#039;&#039; werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise durch einen &amp;quot;/&amp;quot;) kann man so schreiben: &amp;quot;[^/]+&amp;quot; (entspricht: &amp;quot;Mindestens ein Zeichen, das kein Schrägstrich ist&amp;quot;). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;setList&#039;&#039; gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht &amp;quot;+&amp;quot; für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es &amp;quot;Gruppen-Topics&amp;quot;, auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Themen ===&lt;br /&gt;
==== Verbinden mehrerer FHEM-Instanzen über MQTT ====&lt;br /&gt;
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeugen kann. So kann man z.B. Messdaten eines Systems über ein &#039;&#039;notify&#039;&#039; iVm. einer einfachen &#039;&#039;publish&#039;&#039;-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.&lt;br /&gt;
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten &#039;&#039;bridgeRegexp&#039;&#039; automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:&lt;br /&gt;
 attr MQTT2_myMqttServer bridgeRegexp \&lt;br /&gt;
   SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* &amp;quot;mgb2_$1&amp;quot;&lt;br /&gt;
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema &#039;&#039;SmartHome/MqttGenericBridge2/&amp;lt;Device-Name&amp;gt;/&amp;lt;Reading-Name&amp;gt;&#039;&#039; versendet.&lt;br /&gt;
&lt;br /&gt;
==== Umstellung von MQTT_DEVICE (und Derivaten wie XiaomiMQTTDevice) zu MQTT2_DEVICE ====&lt;br /&gt;
Wer beabsichtigt, von der Implementierung MQTT+MQTT_DEVICE zu MQTT2-IO und MQTT2_DEVICE zu wechseln, sollte einige Punkte beachten. Viele diesbezügliche Fragen sind vor allem in  {{Link2Forum|Topic=103762|LinkText=diesem Foren-Thread}}&lt;br /&gt;
&lt;br /&gt;
näher erläutert.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}&lt;br /&gt;
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}&lt;br /&gt;
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;br /&gt;
[[Kategorie:ZigBee]]&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=33330</id>
		<title>MQTT2-Module - Praxisbeispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=33330"/>
		<updated>2020-06-02T13:04:13Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Wildcards in readingList und setList */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung: MQTT bzw. MQTT2 in FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] oder benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht&amp;lt;ref&amp;gt;Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden&amp;lt;/ref&amp;gt;. MQTT2_DEVICE unterstützt u.a. auch die &#039;&#039;setExtensions&#039;&#039; direkt, also z.B. &#039;&#039;on-for-timer&amp;lt;ref&amp;gt;Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die &#039;&#039;split&#039;&#039;-Varianten der attrTemplate-Einrichtung zu verwenden.&amp;lt;/ref&amp;gt;&#039;&#039; sowie &#039;&#039;[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]&#039;&#039;&amp;lt;ref&amp;gt;Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muß dies dort per Attribut eingeschaltet werden&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Einstellungen und Hinweise ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für autocreate in Verbindung mit MQTT2_SERVER &#039;&#039;&#039;zwingend&#039;&#039;&#039; jeder über MQTT kommunizierende Client eine ClientID angeben muß. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch &amp;quot;Wegwerf&amp;quot;-ClientID&#039;s. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit &#039;&#039;&#039;MQTT2_SERVER als Server (&amp;quot;Broker&amp;quot;)&#039;&#039;&#039;, für diesen sollte dabei &#039;&#039;autocreate&#039;&#039; nicht deaktiviert sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden&amp;lt;ref&amp;gt;Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) ebenfalls aktiv ist.&amp;lt;/ref&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Beispiel&amp;lt;ref&amp;gt;MQTT2_SERVER verwendet als default-Einstellung für &#039;&#039;autocreate&#039;&#039; &#039;&#039;simple&#039;&#039;, ohne dass ein entsprechendes Attribut gesetzt werden müßte. Die Einstellung &#039;&#039;complex&#039;&#039; empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 define MQTT2_FHEM_Server MQTT2_SERVER 1883 global&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muß ggf. die &amp;quot;\&amp;quot; entfernen!}}&lt;br /&gt;
&lt;br /&gt;
=== MQTT-Einstellungen in den Geräten ===&lt;br /&gt;
Die Beispiele gehen davon aus, dass die einzubindenden Geräte &#039;&#039;&#039;&#039;&#039;mit den default-Einstellungen&#039;&#039;&#039;&#039;&#039; für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere &#039;&#039;&#039;keine Veränderungen der topic-Pfade&#039;&#039;&#039; vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen.  }}&lt;br /&gt;
&lt;br /&gt;
== zigbee2mqtt ==&lt;br /&gt;
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]&lt;br /&gt;
[https://github.com/Koenkk/zigbee2mqtt zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.&lt;br /&gt;
=== Installation von zigbee2mqtt ===&lt;br /&gt;
Die Installation des zigbee2mqtt-Diensts ist auf der Homepage des Projekts beschrieben. Ergänzend muß in der configuration.yaml eine &#039;&#039;client_id&#039;&#039; unter &#039;&#039;mqtt&#039;&#039; (z.B. zigbee_pi) vergeben werden&amp;lt;ref&amp;gt;Die Anführungszeichen sowie genau zwei Leerzeichen sind hier erforderlich!&amp;lt;/ref&amp;gt;.&lt;br /&gt;
 mqtt:&lt;br /&gt;
   client_id: &#039;zigbee_pi&#039;&lt;br /&gt;
Da der Dienst auch später in den Anlernmodus versetzt werden kann, kann man auch gleich &amp;lt;code&amp;gt;permit_join: false&amp;lt;/code&amp;gt; setzen, um das versehentliche Einbinden neuer oder fremder Geräte zu unterbinden.&lt;br /&gt;
{{Hinweis|Wird ein CC2531 auf demselben Linux-Computer verwendet, auf dem auch FHEM installiert ist, kann es vorkommen, dass FHEM diesen mit einem CUL verwechselt und durch &#039;&#039;initialUsbCheck&#039;&#039; in FHEM einbindet, wodurch er für den zigbee2mqtt-Dienst nicht mehr verfügbar ist. Dann sollte &#039;&#039;initialUsbCheck&#039;&#039; deaktiviert und das automatisch angelegte CUL-Device wieder gelöscht werden. Weiter sollte der CC2531 auch in FHEM &#039;&#039;&#039;und&#039;&#039;&#039; zigbee2mqtt &#039;&#039;[[Mehrere USB-Geräte einbinden|by-id]]&#039;&#039; eingebunden werden, um Probleme beim gleichzeitigen Einsatz anderer Geräte, die &#039;&#039;/dev/ttyACMx&#039;&#039; belegen können, zu vermeiden (betrifft z.B. CUL/MapleCUL ).}}&lt;br /&gt;
&lt;br /&gt;
=== Define eines MQTT2-Devices als &amp;quot;Bridge&amp;quot; === &lt;br /&gt;
Dann kann eine Art &amp;quot;Grund-Device&amp;quot; angelegt werden, das für die Ansteuerung des eigentlichen Server-Dienstes genutzt wird, der bereits unmittelbar nach der erfolgreichen Konfiguration von zigbee2mqtt zur Verfügung steht. In der Regel sollte dieses automatisch erstellt werden, wenn der zigbee2mqtt-Dienst (oder der betreffende Rechner) neu gestartet wird (oder FHEM oder dort ein Sensor einen Messwert sendet). Beispiel&amp;lt;ref&amp;gt;Hier waren bereits zwei Zigbee-Geräte angelernt&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 defmod MQTT2_zigbee_pi MQTT2_DEVICE zigbee_pi&lt;br /&gt;
 attr MQTT2_zigbee_pi IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_zigbee_pi readingList zigbee_pi:zigbee2mqtt/bridge/state:.* state\&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/0x90fd9ffffe65db16:.* { json2nameValue($EVENT, &#039;&#039;) }\&#039;&#039;&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/0x90fd9ffffe0bcd51:.* { json2nameValue($EVENT, &#039;&#039;) }\&#039;&#039;&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/bridge/log:.* { json2nameValue($EVENT, &#039;log_&#039;) }&lt;br /&gt;
 attr MQTT2_zigbee_pi room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Für die Funktion einer zigbee2mqtt-Bridge steht ein {{Link2CmdRef|Anker=set|Lang=en|Label=template}} bereit, das direkt die passenden Attribute vergibt, um dem zigbee2mqtt-Dienst passende Anweisungen geben zu können und weitere Geräte für die eigentlichen Aktoren und Sensoren anzulegen:&lt;br /&gt;
&lt;br /&gt;
 set MQTT2_zigbee_pi attrTemplate zigbee2mqtt_bridge&lt;br /&gt;
&lt;br /&gt;
Ist dieses angelegt, kann zigbee2mqtt mit &amp;lt;code&amp;gt;set MQTT2_zigbee_pi permit_join true&amp;lt;/code&amp;gt; in den Anlernmodus versetzt werden, anzulernende Geräte müssen anschließend jeweils nach Bedienungsanleitung in den Anlernmodus gebracht werden.&lt;br /&gt;
&lt;br /&gt;
=== Vereinzeln der eigentlichen Geräte ===&lt;br /&gt;
&lt;br /&gt;
Über das mit dem template vergebene bridgeRegexp-Attribut  &lt;br /&gt;
 attr MQTT2_zigbee_pi bridgeRegexp zigbee2mqtt/([A-Za-z0-9]*)[/]?.*:.* &amp;quot;zigbee_$1&amp;quot; &lt;br /&gt;
werden anschließend neue MQTT2_DEVICE-Geräte automatisch angelegt, sobald ein bisher unbekanntes Zigbee-Gerät einen neuen Status (z.B. einen Meßwert) meldet. Um zu erfragen, welche Geräte dem zigbee-Deinst bekannt sind, kann via &amp;lt;code&amp;gt;get MQTT2_zigbee_pi devicelist true&amp;lt;/code&amp;gt; eine Liste abgefragt werden, die weitere Informationen zu den bereits angelernten Geräten enthält.&lt;br /&gt;
Geräte, die nicht automatisch etwas senden, kann man mit Hilfe des MQTT2_SERVER-Geräts einmalig schalten, damit diese ihren Status bzw. das erfolgreiche Schalten zurückmelden, Beispiel&amp;lt;ref&amp;gt;Die mit 0x... beginnende Angabe entspricht dabei dem &#039;&#039;friendly_name&#039;&#039;.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;ON&amp;quot;,&amp;quot;brightness&amp;quot;:60}&lt;br /&gt;
&lt;br /&gt;
Für Gerätetypen, für die bereits templates vorhanden sind, ist es am einfachsten, diese einmalig auf die Geräte anzuwenden. Das Vorgehen entspricht dabei dem oben für die Bridge beschriebenen. Dafür wird immer vorausgesetzt, dass ein neues Device mit autocreate (ggf. über die bridgeRegexp) angelegt wurde&amp;lt;ref&amp;gt;Dieses befindet sich dann im Raum MQTT2_DEVICE. Um diesen sichtbar zu machen, muß ggf. die Browser-Seite neu geladen werden.&amp;lt;/ref&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
==== IKEA-Tradfri-Birne ====&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Wie wähle ich nun das richtige Template für mein Leuchtmittel aus?&lt;br /&gt;
-&amp;gt; Es wird nicht zwischen einer Birne/Bulb/Lampe und einem LED-Controller unterschieden sondern anhand der möglichen Lichtdarstellung des Gerätes:&lt;br /&gt;
&lt;br /&gt;
light_dimmer:&lt;br /&gt;
Das anzusteuernde Geräte besitzt ausschließlich eine feste Lichtfarbe welche gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_cct:&lt;br /&gt;
Das anzusteuernde Gerät besitzt eine warmweiße sowie kaltweiße Lichtfarbe welche verändert sowie gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_rgb_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und kann gedimmt werden.&lt;br /&gt;
&lt;br /&gt;
light_rgbw_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und besitzt eine warmweiße ODER kaltweiße Lichtfarbe welche eingestellt sowie gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_rgbcct_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und besitzt eine warmweiße UND kaltweiße Lichtfarbe welche verändert sowie gedimmt werden kann.&lt;br /&gt;
   &lt;br /&gt;
   xxx:&lt;br /&gt;
      hex:   Farbänderung mit hex&lt;br /&gt;
      rgb:   Farbänderung mit r g b&lt;br /&gt;
      xy:   Farbänderung mit x sowie y&lt;br /&gt;
      hue:   Farbänderung mit hue und saturation&lt;br /&gt;
&lt;br /&gt;
Warum diese Einteilung in &amp;quot;hex&amp;quot;, &amp;quot;rgb&amp;quot;, &amp;quot;xy&amp;quot; sowie &amp;quot;hue&amp;quot;?&lt;br /&gt;
-&amp;gt; Zigbee2MQTT unterstützt das Übermitteln aller dieser Werte, allerdings unterscheiden sich hier die Geräte. Manche &amp;quot;verstehen&amp;quot; nur z.B. Hex-Farbänderungen, andere halt nur eine Farbänderung mit rgb-Werten.&lt;br /&gt;
-&amp;gt; Aus diesem Grund muss an dieser Stelle probiert werden mit welchem der 4 Templates sich die Farbveränderung des Gerätes steuern lässt!&lt;br /&gt;
&lt;br /&gt;
HINWEIS: Templates für Farbänderungen mithilfe von XY- sowie HUE-Werten wurden bis heute nicht angelegt!&lt;br /&gt;
}}&lt;br /&gt;
Beispiel eines dimmbaren Tradfri-Leuchtmittels&lt;br /&gt;
 defmod IKEA_Bulb2 MQTT2_DEVICE&lt;br /&gt;
 attr IKEA_Bulb2 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr IKEA_Bulb2 icon light_control&lt;br /&gt;
 attr IKEA_Bulb2 devStateIcon {zigbee2mqtt_devStateIcon255($name)}&lt;br /&gt;
 attr IKEA_Bulb2 readingList zigbee_pi:zigbee2mqtt/0x90fd9ffffe0bcd51:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr IKEA_Bulb2 setList on:noArg zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
     off:noArg zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
     brightness:colorpicker,BRI,0,15,255 zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;on&amp;quot;,&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr IKEA_Bulb2 webCmd toggle:on:off:brightness&lt;br /&gt;
 attr IKEA_Bulb2 model L_02a_zigbee2mqtt_bulb&lt;br /&gt;
&lt;br /&gt;
Kann man auch die Farbtemperatur einstellen, wird die setList wie folgt erweitert oder das entsprechende template&amp;lt;ref&amp;gt;Durch die &#039;&#039;model&#039;&#039;-Angabe kann nachvollzogen werden, welches template angewendet wurde.&amp;lt;/ref&amp;gt; anwendet:&lt;br /&gt;
 ...&lt;br /&gt;
 color_temp:colorpicker,CT,250,1,454 zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Die templates sind dabei in der Regel so gestaltet, dass eventuell mehr Optionen in FHEMWEB erscheinen, als tatsächlich vorhanden oder erwünscht sind. &lt;br /&gt;
Da sich obige einfarbige dimmbare Lampe durch Klicken auf das devStateIcon schalten läßt, ist für die vollständige Ansteuerung bereits dieses webCmd hinreichend:&lt;br /&gt;
 attr IKEA_Bulb2 webCmd brightness&lt;br /&gt;
&lt;br /&gt;
==== Temp/Hum. Sensor ====&lt;br /&gt;
tbd&lt;br /&gt;
&lt;br /&gt;
==== Motion Sensor ====&lt;br /&gt;
Als MQTT-Server wird hier &#039;&#039;mosquitto&#039;&#039; verwendet, als IO-Device wird daher ein {{Link2CmdRef|Anker=MQTT2_CLIENT|Lang=en|Label=MQTT2_CLIENT}}-Gerät definiert: &lt;br /&gt;
&lt;br /&gt;
 defmod mqtt2_client MQTT2_CLIENT 192.168.2.4:1883&lt;br /&gt;
 attr mqtt2_client autocreate 1&lt;br /&gt;
 attr mqtt2_client rawEvents zigbee2mqtt/GB_Bewegungsmelder:.*&lt;br /&gt;
 attr mqtt2_client room test&lt;br /&gt;
 attr mqtt2_client subscriptions #&lt;br /&gt;
&lt;br /&gt;
Das eigentliche Device sieht dann so aus:&lt;br /&gt;
 defmod GB_Bewegungsmelder_MQTT2 MQTT2_DEVICE zigbee_158d0001f9d030&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 IODev mqtt2_client&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 devStateIcon motion:motion_detector@red off:motion_detector@green no_motion:motion_detector@green&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 icon motion_detector@blue&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 readingList mqtt2client:zigbee2mqtt/GB_Bewegungsmelder:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 room MQTT2_DEVICE&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 stateFormat {\&lt;br /&gt;
 if(ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;occupancy&amp;quot;,0) eq &amp;quot;true&amp;quot;) {\&lt;br /&gt;
 	sprintf(&amp;quot;motion&amp;quot;);;\&lt;br /&gt;
 	} else {\&lt;br /&gt;
 	sprintf(&amp;quot;no_motion&amp;quot;);;	\&lt;br /&gt;
 	}\&lt;br /&gt;
 }&lt;br /&gt;
==== Anlegen von Zigbee2MQTT-Gruppen in FHEM ====&lt;br /&gt;
{{Hinweis|Die nachfolgende Darstellung ist vorläufig!}}&lt;br /&gt;
{{Hinweis|Bevor man eine Gruppe mithilfe von Zigbee2MQTT anlegen kann, sollte man sicherstellen, dass man über die aktuelleste Version von Zigbee2MQTT verfügt (min. vom 15. Februar 2019). Außerdem sollte auch der Koordinator (zumeist CC2531) die aktuellste Firmware besitzen (min. vom 15. Februar 2019). Falls ein flashen des Koordinators mit der neusten Firmware erfolgen soll, ist darauf zu achten, dass nach einem flashen alle Geräte neu angelernt werden müssen! (Hinweise zum flashen ohne erneutem anlernen sind hier zu finden: https://www.zigbee2mqtt.io/information/flashing_without_re-pairing.html)}}&lt;br /&gt;
&lt;br /&gt;
=====Erstellen einer Zigbee2MQTT-Gruppe=====&lt;br /&gt;
Bevor das Ganze in FHEM funktioniert, muss eine Gruppe in der &amp;quot;configuration.yaml&amp;quot; angelegt werden, dieser Vorgang ist auf folgender Seite beschrieben: https://www.zigbee2mqtt.io/information/groups.html&lt;br /&gt;
Wenn die Geräte anschließend über den FHEM MQTT2-Server der Gruppe hinzugefügen werden sollen, kann dies mit folgendem Befehl erfolgen:&lt;br /&gt;
 set &amp;lt;MQTT2-Server&amp;gt; publish zigbee2mqtt/bridge/group/&amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;/add &amp;lt;Zigbee2MQTT Friendly-Gerätename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/bridge/group/Wohnzimmer/add Stehlampe&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl kann so oft verwendet werden, wie man Geräte zu einer Gruppe hinzufügen möchte.&lt;br /&gt;
&lt;br /&gt;
Zum Entfernen eines Gerätes aus einer Gruppe kann folgender Befehl verwendet werden:&lt;br /&gt;
 set &amp;lt;MQTT2-Server&amp;gt; publish zigbee2mqtt/bridge/group/&amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;/remove &amp;lt;Zigbee2MQTT Friendly-Gerätename&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/bridge/group/Wohnzimmer/remove Kuechenlampe&lt;br /&gt;
&lt;br /&gt;
=====Anlegen der Gruppe in FHEM=====&lt;br /&gt;
Da Gruppen in Zigbee2MQTT aktuell keine Rückmeldung über ihren Status geben, wird auch beim einmaligen Schalten kein Gerät automatisch in FHEM angelegt. Aus diesem Grund muss dies mit folgendem Befehl noch manuell erfolgen:&lt;br /&gt;
 defmod &amp;lt;FHEM NAME&amp;gt; MQTT2_DEVICE&lt;br /&gt;
Beispiel&lt;br /&gt;
 defmod lichtWohnzimmer MQTT2_DEVICE&lt;br /&gt;
Anschließend wird auch für dieses Gerät wieder ein passendes template ausgewählt, wie als wäre es ein normales Zigbee2MQTT-Gerät.&lt;br /&gt;
Im anschließenden Dialog-Fenster welches sich nach dem Setzen des templates öffnet, müssen die folgenden Werte durch passendes ersetzt werden:&lt;br /&gt;
 BASE_TOPIC -&amp;gt; zigbee2mqtt&lt;br /&gt;
 DEV_ID -&amp;gt; &amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach sollte sich die Gruppe wie ein normales Zigbee2MQTT Gerät steuern lassen.&lt;br /&gt;
&lt;br /&gt;
== Tasmota ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. &lt;br /&gt;
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter &#039;&#039;&amp;lt;nowiki&amp;gt;topic = %topic% (tasmota)&amp;lt;/nowiki&amp;gt;&#039;&#039; ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem  Eingabefeld für &#039;&#039;&amp;quot;client ...&amp;quot;&#039;&#039;, siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
=== MQTT2_DEVICE ===&lt;br /&gt;
Dieses sollte bei aktiviertem &#039;&#039;autocreate&#039;&#039; am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen ===&lt;br /&gt;
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden:  &lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD IODev m2server&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    DVES_9B01BD:cmnd/DVES_9B01BD/POWER:.* POWER\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr MQTT2_DVES_9B01BD room MQTT2_DEVICE&lt;br /&gt;
 attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\&lt;br /&gt;
    off cmnd/DVES_9B01BD/POWER off\&lt;br /&gt;
    reboot cmnd/DVES_9B01BD/Restart 1&lt;br /&gt;
 attr MQTT2_DVES_9B01BD webCmd on:off:reboot&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
&lt;br /&gt;
===== Allgemeines =====&lt;br /&gt;
Für gängige Tasmota-Geräte stehen &#039;&#039;templates&#039;&#039; bereit, mit denen sich diese schnell konfigurieren lassen. &lt;br /&gt;
Beachten Sie dazu den Abschnitt &#039;&#039;attrTemplate&#039;&#039; in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}&lt;br /&gt;
&lt;br /&gt;
===== Kein passendes attrTemplate vorhanden? =====&lt;br /&gt;
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das &amp;quot;&#039;&#039;tasmota_basic&#039;&#039;&amp;quot; anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults &amp;quot;ON&amp;quot; bzw. &amp;quot;OFF&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Allerdings stellt dieses das &#039;&#039;autocreate&#039;&#039; an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das &#039;&#039;autocreate&#039;&#039;-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im &#039;&#039;jsonMap&#039;&#039;-Attribut nur die Angabe &amp;quot;&#039;&#039;POWER1:state&#039;&#039;&amp;quot; zu belassen.&lt;br /&gt;
&lt;br /&gt;
=== on-for-timer ===&lt;br /&gt;
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen &#039;&#039;setter&#039;&#039; in der &#039;&#039;setList&#039;&#039; werden die &#039;&#039;&#039;SetExtensions&#039;&#039;&#039; verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:&lt;br /&gt;
&lt;br /&gt;
==== delay ==== &lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (Attributeingabe via FHEMWEB!):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1*10; &#039;cmnd/DVES_575127/Backlog POWER1 1; delay &#039;.$duration.&#039;; POWER1 0&#039;}&lt;br /&gt;
&lt;br /&gt;
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe https://github.com/arendst/Tasmota/wiki/Commands#delay), also eine Stunde.&lt;br /&gt;
&lt;br /&gt;
====pulseTime ====&lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (s.o.):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1 &amp;lt; 11.2 ? $EVTPART1*10 : $EVTPART1+100; &#039;CMNDTOPIC/Backlog pulseTime1 &#039;.$duration.&#039;; POWER1 1&#039;}&lt;br /&gt;
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit &#039;&#039;delay&#039;&#039;. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren &amp;quot;normalen&amp;quot; Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites &#039;&#039;save&#039;&#039; nur bis zum nächsten reboot des Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
== ESPurna ==&lt;br /&gt;
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool&#039;sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als &amp;quot;on&amp;quot; oder &amp;quot;off&amp;quot; oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.&lt;br /&gt;
&lt;br /&gt;
== Shelly ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.&lt;br /&gt;
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen weitere Geräte angelegt und konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly1 ===&lt;br /&gt;
&lt;br /&gt;
=== Shellybulb ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate  angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
 Internals:&lt;br /&gt;
   CFGFN     &lt;br /&gt;
   CID        shellybulb_3CC533&lt;br /&gt;
   DEF        shellybulb_3CC533&lt;br /&gt;
   DEVICETOPIC MQTT2_shellybulb_3CC533&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   NAME       MQTT2_shellybulb_3CC533&lt;br /&gt;
   NR         246&lt;br /&gt;
   STATE      ???&lt;br /&gt;
   TYPE       MQTT2_DEVICE&lt;br /&gt;
   READINGS:&lt;br /&gt;
     2018-12-12 19:28:08   status_blue     0&lt;br /&gt;
     2018-12-12 19:28:08   status_brightness 61&lt;br /&gt;
     2018-12-12 19:28:08   status_effect   0&lt;br /&gt;
     2018-12-12 19:28:08   status_gain     26&lt;br /&gt;
     2018-12-12 19:28:08   status_green    0&lt;br /&gt;
     2018-12-12 19:28:08   status_ison     true&lt;br /&gt;
     2018-12-12 19:28:08   status_mode     color&lt;br /&gt;
     2018-12-12 19:28:08   status_red      255&lt;br /&gt;
     2018-12-12 19:28:08   status_temp     3250&lt;br /&gt;
     2018-12-12 19:28:08   status_white    0&lt;br /&gt;
 Attributes:&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, &#039;status_&#039;) }&lt;br /&gt;
   room       MQTT2_DEVICE&lt;br /&gt;
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate &amp;quot;shellybulb&amp;quot; auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly Plug S ===&lt;br /&gt;
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb &amp;gt; 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:&lt;br /&gt;
  attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state =&amp;gt; $EVTPART0&amp;lt;100?&amp;quot;off&amp;quot;:&amp;quot;on&amp;quot; } }&lt;br /&gt;
Der Status des MQTT2 Devices zeigt dann bei &amp;lt;100W &amp;quot;off&amp;quot; und sonst &amp;quot;on&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
=== HTTP-Commands ===&lt;br /&gt;
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.&lt;br /&gt;
&lt;br /&gt;
== 8-Port-Ethernet Board ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse&lt;br /&gt;
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
In diesem [https://forum.fhem.de/index.php/topic,107536.msg1016379.html#msg1016379 Forenbeitrag] bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.&lt;br /&gt;
&lt;br /&gt;
== Milight-Bridge ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von &#039;&#039;openmili&#039;&#039; eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel.&lt;br /&gt;
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway&amp;lt;ref&amp;gt;Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist.&lt;br /&gt;
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen am MiLight-Hub ===&lt;br /&gt;
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.&lt;br /&gt;
Die Einstellungen für &#039;&#039;MQTT topic pattern&#039;&#039; usw. können auf den default-Werten&amp;lt;ref&amp;gt;Diese sind: &amp;lt;br&amp;gt;&#039;&#039;milight/:device_id/:device_type/:group_id&#039;&#039; für &amp;quot;topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/updates/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;update topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/states/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;state topic pattern&amp;quot;. Der Autor hat derzeit folgende Infotypen zum Senden markiert: &amp;quot;status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color&amp;quot; (enthält eventuell zu viele Angaben. Bei einem Eventhandler muß man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).&amp;lt;/ref&amp;gt; belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (&#039;&#039;MQTT Client Status Topic&#039;&#039;), tragen Sie &#039;&#039;milight/LWT&#039;&#039; ein und aktivieren &#039;&#039;Detailed&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Devices ===&lt;br /&gt;
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]&lt;br /&gt;
==== Bridge ====&lt;br /&gt;
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:&lt;br /&gt;
 defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses Device wird nun das &#039;&#039;template&#039;&#039; &#039;&#039;&#039;esp_milight_hub_bridge&#039;&#039;&#039; angewandt.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Leuchtmittel ====&lt;br /&gt;
&lt;br /&gt;
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:&lt;br /&gt;
 defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Devices werden genauso erstellt. &lt;br /&gt;
&lt;br /&gt;
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template &#039;&#039;X_01a_esp_milight_hub_make_rgbw_group&#039;&#039; verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt &#039;&#039;&#039;eine Kopie&#039;&#039;&#039;, die dann modifiziert wird. Diese Kopie ist unter dem Namen &#039;&#039;milight_&amp;lt;RemoteID&amp;gt;_0&#039;&#039; im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepaßt werden. &lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele:&lt;br /&gt;
Beispiel für ein RGB-CCT-Device:&lt;br /&gt;
 defmod Licht_Wz_all MQTT2_DEVICE&lt;br /&gt;
 attr Licht_Wz_all IODev MQTT2_Broker&lt;br /&gt;
 attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/&lt;br /&gt;
 attr Licht_Wz_all group Licht&lt;br /&gt;
 attr Licht_Wz_all icon light_control&lt;br /&gt;
 attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 &lt;br /&gt;
 attr Licht_Wz_all room Wohnzimmer&lt;br /&gt;
 attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
 off milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
 level milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 next_mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_up milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 device_id milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 effect milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 commands milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr Licht_Wz_all sortby 1&lt;br /&gt;
 attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue&lt;br /&gt;
 attr Licht_Wz_all webCmdLabel command\ &lt;br /&gt;
 :brightness:saturation\&lt;br /&gt;
 :color_temp:hue&lt;br /&gt;
==== Ein Leuchtmittel, mehrere Fernbedienungen ====&lt;br /&gt;
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen &amp;quot;hört&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }&lt;br /&gt;
&lt;br /&gt;
==== Fernbedienung als Input-Device nutzen ====&lt;br /&gt;
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.&lt;br /&gt;
Um hier nur Differenz-Meldungen zu erhalten und doppelte Events zu verhindern, sollte hier die readingList so angepaßt werden, dass nur Messages aus dem &amp;quot;updates&amp;quot;-Zweig ausgewertet werden: &lt;br /&gt;
 defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0&lt;br /&gt;
 attr MiLight_RC1_0 readingList milight/updates/0xABCD/fut089/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/fut089/0:.* {}&lt;br /&gt;
&lt;br /&gt;
== eBus ==&lt;br /&gt;
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition am eBus ===&lt;br /&gt;
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.&lt;br /&gt;
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. &#039;&#039;ebusd/%circuit/%name&#039;&#039;.&lt;br /&gt;
 --accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name&lt;br /&gt;
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic &#039;&#039;ebusd&#039;&#039; verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit &#039;&#039;ebus...&#039;&#039; zu beginnen!}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition  in FHEM ===&lt;br /&gt;
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem &#039;&#039;&#039;&#039;&#039;vor&#039;&#039;&#039;&#039;&#039; den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der &#039;&#039;readingList&#039;&#039; enthalten, die vom ebus stammen. Da wir die &#039;&#039;readingList&#039;&#039; anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche &#039;&#039;readingList&#039;&#039;-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-&amp;quot;Sammeldevices&amp;quot; genutzt werden, und dessen &#039;&#039;CID&#039;&#039; auf &#039;&#039;ebusd&#039;&#039; geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der &#039;&#039;readingList&#039;&#039; des &amp;quot;Sammeldevices&amp;quot; gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. &lt;br /&gt;
&lt;br /&gt;
Sind die Vorbereitungen abgeschlossen, aktivieren wir &#039;&#039;autocreate&#039;&#039; wieder, allerdings wählen wir als autocreate-Methode &#039;&#039;complex&#039;&#039; aus, da der eBus-Dämon teilweise&amp;lt;ref&amp;gt;Dies betrifft vorrangig die Statusmeldungen&amp;lt;/ref&amp;gt; eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt&amp;lt;ref&amp;gt;Bei Verwendung des MQTT2_CLIENT wird dann die &#039;&#039;readingList&#039;&#039; am bereits definierten MQTT2_DEVICE aus der Kopie des &amp;quot;Sammeldevice&amp;quot; automatisch wieder erstellt bzw. gefüllt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;ebus-Bridge&amp;quot; ====&lt;br /&gt;
Auf das von &#039;&#039;autocreate&#039;&#039; erstellte MQTT2_DEVICE wird nunmehr das template &#039;&#039;eBus_daemon_splitter&#039;&#039; angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. &lt;br /&gt;
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen &#039;&#039;uptime&#039;&#039;, alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;attrTemplate&#039;&#039; läd eine weitere &#039;&#039;attrTemplate&#039;&#039;-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. &lt;br /&gt;
==== &amp;quot;ebusd_bai&amp;quot; und weitere Geräte ====&lt;br /&gt;
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}&lt;br /&gt;
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens &#039;&#039;MQTT2_ebus_bai&#039;&#039; angelegt worden sein.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Hinweise ==&lt;br /&gt;
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===&lt;br /&gt;
Nutzt man das rawEvents-Attribut am MQTT2-IO&amp;lt;ref&amp;gt;z.B. &amp;lt;code&amp;gt;attr MQTT2_FHEM_Server rawEvents .*&amp;lt;/code&amp;gt;, der regex-Filter kann wie üblich angepaßt werden&amp;lt;/ref&amp;gt;, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.&lt;br /&gt;
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit &amp;lt;code&amp;gt;attr mqtt2_server verbose 5&amp;lt;/code&amp;gt; auch alles ins FHEM-Log schreiben lassen.&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; genutzt werden. &lt;br /&gt;
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate: Es werden nicht alle templates angezeigt ===&lt;br /&gt;
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate und Sprachsteuerung ===&lt;br /&gt;
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; dem betreffenden Hauptartikel zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
=== bridgeRegexp ===&lt;br /&gt;
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch &#039;&#039;&#039;&#039;&#039;einem&#039;&#039;&#039;&#039;&#039; &#039;&#039;MQTT2_DEVICE&#039;&#039; zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. Das &#039;&#039;&#039;Attribut&#039;&#039;&#039; &#039;&#039;bridgeRegexp&#039;&#039; kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem &#039;&#039;&#039;anderen Device&#039;&#039;&#039; (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als &#039;&#039;newClientId&#039;&#039; hinterlegte Angabe verwendet. &lt;br /&gt;
Dementsprechend sind in den hier aufgeführten Beispielen &#039;&#039;bridgeRegexp&#039;&#039;-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren. Ein Sonderfall hierbei ist das template &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem &#039;&#039;mosquitto&#039;&#039;-Server und würden sonst alle einem einem MQTT2_DEVICE zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Ständig neue Devices? ===&lt;br /&gt;
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:&lt;br /&gt;
==== Vergabe einer ClientID ====&lt;br /&gt;
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). &lt;br /&gt;
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID&#039;s. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.&lt;br /&gt;
&lt;br /&gt;
==== Löschen der ClientID aus der readingList usw. ====&lt;br /&gt;
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den &#039;&#039;default&#039;&#039; &amp;quot;sonoff&amp;quot; zu ändern).&lt;br /&gt;
Beispielsweise wäre &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt; zu ändern in &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt;&lt;br /&gt;
Die über &#039;&#039;attrTemplate&#039;&#039; verfügbaren Konfigurationen verwenden in der Regel keine ClientID&#039;s bzw. entfernen diese.&lt;br /&gt;
&lt;br /&gt;
=== Wildcards in readingList und setList ===&lt;br /&gt;
Auch in readingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;readingList&#039;&#039; werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise durch einen &amp;quot;/&amp;quot;) kann man so schreiben: &amp;quot;[^/]+&amp;quot; (entspricht: &amp;quot;Mindestens ein Zeichen, das kein Schrägstrich ist&amp;quot;). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;setList&#039;&#039; gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht &amp;quot;+&amp;quot; für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es &amp;quot;Gruppen-Topics&amp;quot;, auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Themen ===&lt;br /&gt;
==== Verbinden mehrerer FHEM-Instanzen über MQTT ====&lt;br /&gt;
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeigen kann. So kann man z.B. Messdaten eines Systems über ein &#039;&#039;notify&#039;&#039; iVm. einer einfachen &#039;&#039;publish&#039;&#039;-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.&lt;br /&gt;
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten &#039;&#039;bridgeRegexp&#039;&#039; automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:&lt;br /&gt;
 attr MQTT2_myMqttServer bridgeRegexp \&lt;br /&gt;
   SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* &amp;quot;mgb2_$1&amp;quot;&lt;br /&gt;
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema &#039;&#039;SmartHome/MqttGenericBridge2/&amp;lt;Device-Name&amp;gt;/&amp;lt;Reading-Name&amp;gt;&#039;&#039; versendet.&lt;br /&gt;
==== Umstellung von MQTT_DEVICE (und Derivaten wie XiaomiMQTTDevice) zu MQTT2_DEVICE ====&lt;br /&gt;
Wer beabsichtigt, von der Implementierung MQTT+MQTT_DEVICE zu MQTT2-IO und MQTT2_DEVICE zu wechseln, sollte einige Punkte beachten. Viele diesbezügliche Fragen sind vor allem in  {{Link2Forum|Topic=103762|LinkText=diesem Foren-Thread}}&lt;br /&gt;
&lt;br /&gt;
näher erläutert.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}&lt;br /&gt;
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}&lt;br /&gt;
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;br /&gt;
[[Kategorie:ZigBee]]&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=33329</id>
		<title>MQTT2-Module - Praxisbeispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=33329"/>
		<updated>2020-06-02T13:02:16Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Wildcards in readingList und setList */Tippfehler korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung: MQTT bzw. MQTT2 in FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] oder benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht&amp;lt;ref&amp;gt;Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden&amp;lt;/ref&amp;gt;. MQTT2_DEVICE unterstützt u.a. auch die &#039;&#039;setExtensions&#039;&#039; direkt, also z.B. &#039;&#039;on-for-timer&amp;lt;ref&amp;gt;Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die &#039;&#039;split&#039;&#039;-Varianten der attrTemplate-Einrichtung zu verwenden.&amp;lt;/ref&amp;gt;&#039;&#039; sowie &#039;&#039;[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]&#039;&#039;&amp;lt;ref&amp;gt;Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muß dies dort per Attribut eingeschaltet werden&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Einstellungen und Hinweise ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für autocreate in Verbindung mit MQTT2_SERVER &#039;&#039;&#039;zwingend&#039;&#039;&#039; jeder über MQTT kommunizierende Client eine ClientID angeben muß. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch &amp;quot;Wegwerf&amp;quot;-ClientID&#039;s. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit &#039;&#039;&#039;MQTT2_SERVER als Server (&amp;quot;Broker&amp;quot;)&#039;&#039;&#039;, für diesen sollte dabei &#039;&#039;autocreate&#039;&#039; nicht deaktiviert sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden&amp;lt;ref&amp;gt;Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) ebenfalls aktiv ist.&amp;lt;/ref&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Beispiel&amp;lt;ref&amp;gt;MQTT2_SERVER verwendet als default-Einstellung für &#039;&#039;autocreate&#039;&#039; &#039;&#039;simple&#039;&#039;, ohne dass ein entsprechendes Attribut gesetzt werden müßte. Die Einstellung &#039;&#039;complex&#039;&#039; empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 define MQTT2_FHEM_Server MQTT2_SERVER 1883 global&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muß ggf. die &amp;quot;\&amp;quot; entfernen!}}&lt;br /&gt;
&lt;br /&gt;
=== MQTT-Einstellungen in den Geräten ===&lt;br /&gt;
Die Beispiele gehen davon aus, dass die einzubindenden Geräte &#039;&#039;&#039;&#039;&#039;mit den default-Einstellungen&#039;&#039;&#039;&#039;&#039; für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere &#039;&#039;&#039;keine Veränderungen der topic-Pfade&#039;&#039;&#039; vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen.  }}&lt;br /&gt;
&lt;br /&gt;
== zigbee2mqtt ==&lt;br /&gt;
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]&lt;br /&gt;
[https://github.com/Koenkk/zigbee2mqtt zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.&lt;br /&gt;
=== Installation von zigbee2mqtt ===&lt;br /&gt;
Die Installation des zigbee2mqtt-Diensts ist auf der Homepage des Projekts beschrieben. Ergänzend muß in der configuration.yaml eine &#039;&#039;client_id&#039;&#039; unter &#039;&#039;mqtt&#039;&#039; (z.B. zigbee_pi) vergeben werden&amp;lt;ref&amp;gt;Die Anführungszeichen sowie genau zwei Leerzeichen sind hier erforderlich!&amp;lt;/ref&amp;gt;.&lt;br /&gt;
 mqtt:&lt;br /&gt;
   client_id: &#039;zigbee_pi&#039;&lt;br /&gt;
Da der Dienst auch später in den Anlernmodus versetzt werden kann, kann man auch gleich &amp;lt;code&amp;gt;permit_join: false&amp;lt;/code&amp;gt; setzen, um das versehentliche Einbinden neuer oder fremder Geräte zu unterbinden.&lt;br /&gt;
{{Hinweis|Wird ein CC2531 auf demselben Linux-Computer verwendet, auf dem auch FHEM installiert ist, kann es vorkommen, dass FHEM diesen mit einem CUL verwechselt und durch &#039;&#039;initialUsbCheck&#039;&#039; in FHEM einbindet, wodurch er für den zigbee2mqtt-Dienst nicht mehr verfügbar ist. Dann sollte &#039;&#039;initialUsbCheck&#039;&#039; deaktiviert und das automatisch angelegte CUL-Device wieder gelöscht werden. Weiter sollte der CC2531 auch in FHEM &#039;&#039;&#039;und&#039;&#039;&#039; zigbee2mqtt &#039;&#039;[[Mehrere USB-Geräte einbinden|by-id]]&#039;&#039; eingebunden werden, um Probleme beim gleichzeitigen Einsatz anderer Geräte, die &#039;&#039;/dev/ttyACMx&#039;&#039; belegen können, zu vermeiden (betrifft z.B. CUL/MapleCUL ).}}&lt;br /&gt;
&lt;br /&gt;
=== Define eines MQTT2-Devices als &amp;quot;Bridge&amp;quot; === &lt;br /&gt;
Dann kann eine Art &amp;quot;Grund-Device&amp;quot; angelegt werden, das für die Ansteuerung des eigentlichen Server-Dienstes genutzt wird, der bereits unmittelbar nach der erfolgreichen Konfiguration von zigbee2mqtt zur Verfügung steht. In der Regel sollte dieses automatisch erstellt werden, wenn der zigbee2mqtt-Dienst (oder der betreffende Rechner) neu gestartet wird (oder FHEM oder dort ein Sensor einen Messwert sendet). Beispiel&amp;lt;ref&amp;gt;Hier waren bereits zwei Zigbee-Geräte angelernt&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 defmod MQTT2_zigbee_pi MQTT2_DEVICE zigbee_pi&lt;br /&gt;
 attr MQTT2_zigbee_pi IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_zigbee_pi readingList zigbee_pi:zigbee2mqtt/bridge/state:.* state\&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/0x90fd9ffffe65db16:.* { json2nameValue($EVENT, &#039;&#039;) }\&#039;&#039;&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/0x90fd9ffffe0bcd51:.* { json2nameValue($EVENT, &#039;&#039;) }\&#039;&#039;&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/bridge/log:.* { json2nameValue($EVENT, &#039;log_&#039;) }&lt;br /&gt;
 attr MQTT2_zigbee_pi room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Für die Funktion einer zigbee2mqtt-Bridge steht ein {{Link2CmdRef|Anker=set|Lang=en|Label=template}} bereit, das direkt die passenden Attribute vergibt, um dem zigbee2mqtt-Dienst passende Anweisungen geben zu können und weitere Geräte für die eigentlichen Aktoren und Sensoren anzulegen:&lt;br /&gt;
&lt;br /&gt;
 set MQTT2_zigbee_pi attrTemplate zigbee2mqtt_bridge&lt;br /&gt;
&lt;br /&gt;
Ist dieses angelegt, kann zigbee2mqtt mit &amp;lt;code&amp;gt;set MQTT2_zigbee_pi permit_join true&amp;lt;/code&amp;gt; in den Anlernmodus versetzt werden, anzulernende Geräte müssen anschließend jeweils nach Bedienungsanleitung in den Anlernmodus gebracht werden.&lt;br /&gt;
&lt;br /&gt;
=== Vereinzeln der eigentlichen Geräte ===&lt;br /&gt;
&lt;br /&gt;
Über das mit dem template vergebene bridgeRegexp-Attribut  &lt;br /&gt;
 attr MQTT2_zigbee_pi bridgeRegexp zigbee2mqtt/([A-Za-z0-9]*)[/]?.*:.* &amp;quot;zigbee_$1&amp;quot; &lt;br /&gt;
werden anschließend neue MQTT2_DEVICE-Geräte automatisch angelegt, sobald ein bisher unbekanntes Zigbee-Gerät einen neuen Status (z.B. einen Meßwert) meldet. Um zu erfragen, welche Geräte dem zigbee-Deinst bekannt sind, kann via &amp;lt;code&amp;gt;get MQTT2_zigbee_pi devicelist true&amp;lt;/code&amp;gt; eine Liste abgefragt werden, die weitere Informationen zu den bereits angelernten Geräten enthält.&lt;br /&gt;
Geräte, die nicht automatisch etwas senden, kann man mit Hilfe des MQTT2_SERVER-Geräts einmalig schalten, damit diese ihren Status bzw. das erfolgreiche Schalten zurückmelden, Beispiel&amp;lt;ref&amp;gt;Die mit 0x... beginnende Angabe entspricht dabei dem &#039;&#039;friendly_name&#039;&#039;.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;ON&amp;quot;,&amp;quot;brightness&amp;quot;:60}&lt;br /&gt;
&lt;br /&gt;
Für Gerätetypen, für die bereits templates vorhanden sind, ist es am einfachsten, diese einmalig auf die Geräte anzuwenden. Das Vorgehen entspricht dabei dem oben für die Bridge beschriebenen. Dafür wird immer vorausgesetzt, dass ein neues Device mit autocreate (ggf. über die bridgeRegexp) angelegt wurde&amp;lt;ref&amp;gt;Dieses befindet sich dann im Raum MQTT2_DEVICE. Um diesen sichtbar zu machen, muß ggf. die Browser-Seite neu geladen werden.&amp;lt;/ref&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
==== IKEA-Tradfri-Birne ====&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Wie wähle ich nun das richtige Template für mein Leuchtmittel aus?&lt;br /&gt;
-&amp;gt; Es wird nicht zwischen einer Birne/Bulb/Lampe und einem LED-Controller unterschieden sondern anhand der möglichen Lichtdarstellung des Gerätes:&lt;br /&gt;
&lt;br /&gt;
light_dimmer:&lt;br /&gt;
Das anzusteuernde Geräte besitzt ausschließlich eine feste Lichtfarbe welche gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_cct:&lt;br /&gt;
Das anzusteuernde Gerät besitzt eine warmweiße sowie kaltweiße Lichtfarbe welche verändert sowie gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_rgb_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und kann gedimmt werden.&lt;br /&gt;
&lt;br /&gt;
light_rgbw_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und besitzt eine warmweiße ODER kaltweiße Lichtfarbe welche eingestellt sowie gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_rgbcct_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und besitzt eine warmweiße UND kaltweiße Lichtfarbe welche verändert sowie gedimmt werden kann.&lt;br /&gt;
   &lt;br /&gt;
   xxx:&lt;br /&gt;
      hex:   Farbänderung mit hex&lt;br /&gt;
      rgb:   Farbänderung mit r g b&lt;br /&gt;
      xy:   Farbänderung mit x sowie y&lt;br /&gt;
      hue:   Farbänderung mit hue und saturation&lt;br /&gt;
&lt;br /&gt;
Warum diese Einteilung in &amp;quot;hex&amp;quot;, &amp;quot;rgb&amp;quot;, &amp;quot;xy&amp;quot; sowie &amp;quot;hue&amp;quot;?&lt;br /&gt;
-&amp;gt; Zigbee2MQTT unterstützt das Übermitteln aller dieser Werte, allerdings unterscheiden sich hier die Geräte. Manche &amp;quot;verstehen&amp;quot; nur z.B. Hex-Farbänderungen, andere halt nur eine Farbänderung mit rgb-Werten.&lt;br /&gt;
-&amp;gt; Aus diesem Grund muss an dieser Stelle probiert werden mit welchem der 4 Templates sich die Farbveränderung des Gerätes steuern lässt!&lt;br /&gt;
&lt;br /&gt;
HINWEIS: Templates für Farbänderungen mithilfe von XY- sowie HUE-Werten wurden bis heute nicht angelegt!&lt;br /&gt;
}}&lt;br /&gt;
Beispiel eines dimmbaren Tradfri-Leuchtmittels&lt;br /&gt;
 defmod IKEA_Bulb2 MQTT2_DEVICE&lt;br /&gt;
 attr IKEA_Bulb2 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr IKEA_Bulb2 icon light_control&lt;br /&gt;
 attr IKEA_Bulb2 devStateIcon {zigbee2mqtt_devStateIcon255($name)}&lt;br /&gt;
 attr IKEA_Bulb2 readingList zigbee_pi:zigbee2mqtt/0x90fd9ffffe0bcd51:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr IKEA_Bulb2 setList on:noArg zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
     off:noArg zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
     brightness:colorpicker,BRI,0,15,255 zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;on&amp;quot;,&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr IKEA_Bulb2 webCmd toggle:on:off:brightness&lt;br /&gt;
 attr IKEA_Bulb2 model L_02a_zigbee2mqtt_bulb&lt;br /&gt;
&lt;br /&gt;
Kann man auch die Farbtemperatur einstellen, wird die setList wie folgt erweitert oder das entsprechende template&amp;lt;ref&amp;gt;Durch die &#039;&#039;model&#039;&#039;-Angabe kann nachvollzogen werden, welches template angewendet wurde.&amp;lt;/ref&amp;gt; anwendet:&lt;br /&gt;
 ...&lt;br /&gt;
 color_temp:colorpicker,CT,250,1,454 zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Die templates sind dabei in der Regel so gestaltet, dass eventuell mehr Optionen in FHEMWEB erscheinen, als tatsächlich vorhanden oder erwünscht sind. &lt;br /&gt;
Da sich obige einfarbige dimmbare Lampe durch Klicken auf das devStateIcon schalten läßt, ist für die vollständige Ansteuerung bereits dieses webCmd hinreichend:&lt;br /&gt;
 attr IKEA_Bulb2 webCmd brightness&lt;br /&gt;
&lt;br /&gt;
==== Temp/Hum. Sensor ====&lt;br /&gt;
tbd&lt;br /&gt;
&lt;br /&gt;
==== Motion Sensor ====&lt;br /&gt;
Als MQTT-Server wird hier &#039;&#039;mosquitto&#039;&#039; verwendet, als IO-Device wird daher ein {{Link2CmdRef|Anker=MQTT2_CLIENT|Lang=en|Label=MQTT2_CLIENT}}-Gerät definiert: &lt;br /&gt;
&lt;br /&gt;
 defmod mqtt2_client MQTT2_CLIENT 192.168.2.4:1883&lt;br /&gt;
 attr mqtt2_client autocreate 1&lt;br /&gt;
 attr mqtt2_client rawEvents zigbee2mqtt/GB_Bewegungsmelder:.*&lt;br /&gt;
 attr mqtt2_client room test&lt;br /&gt;
 attr mqtt2_client subscriptions #&lt;br /&gt;
&lt;br /&gt;
Das eigentliche Device sieht dann so aus:&lt;br /&gt;
 defmod GB_Bewegungsmelder_MQTT2 MQTT2_DEVICE zigbee_158d0001f9d030&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 IODev mqtt2_client&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 devStateIcon motion:motion_detector@red off:motion_detector@green no_motion:motion_detector@green&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 icon motion_detector@blue&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 readingList mqtt2client:zigbee2mqtt/GB_Bewegungsmelder:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 room MQTT2_DEVICE&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 stateFormat {\&lt;br /&gt;
 if(ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;occupancy&amp;quot;,0) eq &amp;quot;true&amp;quot;) {\&lt;br /&gt;
 	sprintf(&amp;quot;motion&amp;quot;);;\&lt;br /&gt;
 	} else {\&lt;br /&gt;
 	sprintf(&amp;quot;no_motion&amp;quot;);;	\&lt;br /&gt;
 	}\&lt;br /&gt;
 }&lt;br /&gt;
==== Anlegen von Zigbee2MQTT-Gruppen in FHEM ====&lt;br /&gt;
{{Hinweis|Die nachfolgende Darstellung ist vorläufig!}}&lt;br /&gt;
{{Hinweis|Bevor man eine Gruppe mithilfe von Zigbee2MQTT anlegen kann, sollte man sicherstellen, dass man über die aktuelleste Version von Zigbee2MQTT verfügt (min. vom 15. Februar 2019). Außerdem sollte auch der Koordinator (zumeist CC2531) die aktuellste Firmware besitzen (min. vom 15. Februar 2019). Falls ein flashen des Koordinators mit der neusten Firmware erfolgen soll, ist darauf zu achten, dass nach einem flashen alle Geräte neu angelernt werden müssen! (Hinweise zum flashen ohne erneutem anlernen sind hier zu finden: https://www.zigbee2mqtt.io/information/flashing_without_re-pairing.html)}}&lt;br /&gt;
&lt;br /&gt;
=====Erstellen einer Zigbee2MQTT-Gruppe=====&lt;br /&gt;
Bevor das Ganze in FHEM funktioniert, muss eine Gruppe in der &amp;quot;configuration.yaml&amp;quot; angelegt werden, dieser Vorgang ist auf folgender Seite beschrieben: https://www.zigbee2mqtt.io/information/groups.html&lt;br /&gt;
Wenn die Geräte anschließend über den FHEM MQTT2-Server der Gruppe hinzugefügen werden sollen, kann dies mit folgendem Befehl erfolgen:&lt;br /&gt;
 set &amp;lt;MQTT2-Server&amp;gt; publish zigbee2mqtt/bridge/group/&amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;/add &amp;lt;Zigbee2MQTT Friendly-Gerätename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/bridge/group/Wohnzimmer/add Stehlampe&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl kann so oft verwendet werden, wie man Geräte zu einer Gruppe hinzufügen möchte.&lt;br /&gt;
&lt;br /&gt;
Zum Entfernen eines Gerätes aus einer Gruppe kann folgender Befehl verwendet werden:&lt;br /&gt;
 set &amp;lt;MQTT2-Server&amp;gt; publish zigbee2mqtt/bridge/group/&amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;/remove &amp;lt;Zigbee2MQTT Friendly-Gerätename&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/bridge/group/Wohnzimmer/remove Kuechenlampe&lt;br /&gt;
&lt;br /&gt;
=====Anlegen der Gruppe in FHEM=====&lt;br /&gt;
Da Gruppen in Zigbee2MQTT aktuell keine Rückmeldung über ihren Status geben, wird auch beim einmaligen Schalten kein Gerät automatisch in FHEM angelegt. Aus diesem Grund muss dies mit folgendem Befehl noch manuell erfolgen:&lt;br /&gt;
 defmod &amp;lt;FHEM NAME&amp;gt; MQTT2_DEVICE&lt;br /&gt;
Beispiel&lt;br /&gt;
 defmod lichtWohnzimmer MQTT2_DEVICE&lt;br /&gt;
Anschließend wird auch für dieses Gerät wieder ein passendes template ausgewählt, wie als wäre es ein normales Zigbee2MQTT-Gerät.&lt;br /&gt;
Im anschließenden Dialog-Fenster welches sich nach dem Setzen des templates öffnet, müssen die folgenden Werte durch passendes ersetzt werden:&lt;br /&gt;
 BASE_TOPIC -&amp;gt; zigbee2mqtt&lt;br /&gt;
 DEV_ID -&amp;gt; &amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach sollte sich die Gruppe wie ein normales Zigbee2MQTT Gerät steuern lassen.&lt;br /&gt;
&lt;br /&gt;
== Tasmota ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. &lt;br /&gt;
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter &#039;&#039;&amp;lt;nowiki&amp;gt;topic = %topic% (tasmota)&amp;lt;/nowiki&amp;gt;&#039;&#039; ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem  Eingabefeld für &#039;&#039;&amp;quot;client ...&amp;quot;&#039;&#039;, siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
=== MQTT2_DEVICE ===&lt;br /&gt;
Dieses sollte bei aktiviertem &#039;&#039;autocreate&#039;&#039; am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen ===&lt;br /&gt;
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden:  &lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD IODev m2server&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    DVES_9B01BD:cmnd/DVES_9B01BD/POWER:.* POWER\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr MQTT2_DVES_9B01BD room MQTT2_DEVICE&lt;br /&gt;
 attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\&lt;br /&gt;
    off cmnd/DVES_9B01BD/POWER off\&lt;br /&gt;
    reboot cmnd/DVES_9B01BD/Restart 1&lt;br /&gt;
 attr MQTT2_DVES_9B01BD webCmd on:off:reboot&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
&lt;br /&gt;
===== Allgemeines =====&lt;br /&gt;
Für gängige Tasmota-Geräte stehen &#039;&#039;templates&#039;&#039; bereit, mit denen sich diese schnell konfigurieren lassen. &lt;br /&gt;
Beachten Sie dazu den Abschnitt &#039;&#039;attrTemplate&#039;&#039; in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}&lt;br /&gt;
&lt;br /&gt;
===== Kein passendes attrTemplate vorhanden? =====&lt;br /&gt;
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das &amp;quot;&#039;&#039;tasmota_basic&#039;&#039;&amp;quot; anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults &amp;quot;ON&amp;quot; bzw. &amp;quot;OFF&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Allerdings stellt dieses das &#039;&#039;autocreate&#039;&#039; an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das &#039;&#039;autocreate&#039;&#039;-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im &#039;&#039;jsonMap&#039;&#039;-Attribut nur die Angabe &amp;quot;&#039;&#039;POWER1:state&#039;&#039;&amp;quot; zu belassen.&lt;br /&gt;
&lt;br /&gt;
=== on-for-timer ===&lt;br /&gt;
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen &#039;&#039;setter&#039;&#039; in der &#039;&#039;setList&#039;&#039; werden die &#039;&#039;&#039;SetExtensions&#039;&#039;&#039; verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:&lt;br /&gt;
&lt;br /&gt;
==== delay ==== &lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (Attributeingabe via FHEMWEB!):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1*10; &#039;cmnd/DVES_575127/Backlog POWER1 1; delay &#039;.$duration.&#039;; POWER1 0&#039;}&lt;br /&gt;
&lt;br /&gt;
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe https://github.com/arendst/Tasmota/wiki/Commands#delay), also eine Stunde.&lt;br /&gt;
&lt;br /&gt;
====pulseTime ====&lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (s.o.):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1 &amp;lt; 11.2 ? $EVTPART1*10 : $EVTPART1+100; &#039;CMNDTOPIC/Backlog pulseTime1 &#039;.$duration.&#039;; POWER1 1&#039;}&lt;br /&gt;
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit &#039;&#039;delay&#039;&#039;. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren &amp;quot;normalen&amp;quot; Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites &#039;&#039;save&#039;&#039; nur bis zum nächsten reboot des Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
== ESPurna ==&lt;br /&gt;
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool&#039;sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als &amp;quot;on&amp;quot; oder &amp;quot;off&amp;quot; oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.&lt;br /&gt;
&lt;br /&gt;
== Shelly ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.&lt;br /&gt;
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen weitere Geräte angelegt und konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly1 ===&lt;br /&gt;
&lt;br /&gt;
=== Shellybulb ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate  angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
 Internals:&lt;br /&gt;
   CFGFN     &lt;br /&gt;
   CID        shellybulb_3CC533&lt;br /&gt;
   DEF        shellybulb_3CC533&lt;br /&gt;
   DEVICETOPIC MQTT2_shellybulb_3CC533&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   NAME       MQTT2_shellybulb_3CC533&lt;br /&gt;
   NR         246&lt;br /&gt;
   STATE      ???&lt;br /&gt;
   TYPE       MQTT2_DEVICE&lt;br /&gt;
   READINGS:&lt;br /&gt;
     2018-12-12 19:28:08   status_blue     0&lt;br /&gt;
     2018-12-12 19:28:08   status_brightness 61&lt;br /&gt;
     2018-12-12 19:28:08   status_effect   0&lt;br /&gt;
     2018-12-12 19:28:08   status_gain     26&lt;br /&gt;
     2018-12-12 19:28:08   status_green    0&lt;br /&gt;
     2018-12-12 19:28:08   status_ison     true&lt;br /&gt;
     2018-12-12 19:28:08   status_mode     color&lt;br /&gt;
     2018-12-12 19:28:08   status_red      255&lt;br /&gt;
     2018-12-12 19:28:08   status_temp     3250&lt;br /&gt;
     2018-12-12 19:28:08   status_white    0&lt;br /&gt;
 Attributes:&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, &#039;status_&#039;) }&lt;br /&gt;
   room       MQTT2_DEVICE&lt;br /&gt;
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate &amp;quot;shellybulb&amp;quot; auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly Plug S ===&lt;br /&gt;
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb &amp;gt; 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:&lt;br /&gt;
  attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state =&amp;gt; $EVTPART0&amp;lt;100?&amp;quot;off&amp;quot;:&amp;quot;on&amp;quot; } }&lt;br /&gt;
Der Status des MQTT2 Devices zeigt dann bei &amp;lt;100W &amp;quot;off&amp;quot; und sonst &amp;quot;on&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
=== HTTP-Commands ===&lt;br /&gt;
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.&lt;br /&gt;
&lt;br /&gt;
== 8-Port-Ethernet Board ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse&lt;br /&gt;
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
In diesem [https://forum.fhem.de/index.php/topic,107536.msg1016379.html#msg1016379 Forenbeitrag] bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.&lt;br /&gt;
&lt;br /&gt;
== Milight-Bridge ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von &#039;&#039;openmili&#039;&#039; eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel.&lt;br /&gt;
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway&amp;lt;ref&amp;gt;Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist.&lt;br /&gt;
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen am MiLight-Hub ===&lt;br /&gt;
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.&lt;br /&gt;
Die Einstellungen für &#039;&#039;MQTT topic pattern&#039;&#039; usw. können auf den default-Werten&amp;lt;ref&amp;gt;Diese sind: &amp;lt;br&amp;gt;&#039;&#039;milight/:device_id/:device_type/:group_id&#039;&#039; für &amp;quot;topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/updates/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;update topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/states/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;state topic pattern&amp;quot;. Der Autor hat derzeit folgende Infotypen zum Senden markiert: &amp;quot;status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color&amp;quot; (enthält eventuell zu viele Angaben. Bei einem Eventhandler muß man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).&amp;lt;/ref&amp;gt; belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (&#039;&#039;MQTT Client Status Topic&#039;&#039;), tragen Sie &#039;&#039;milight/LWT&#039;&#039; ein und aktivieren &#039;&#039;Detailed&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Devices ===&lt;br /&gt;
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]&lt;br /&gt;
==== Bridge ====&lt;br /&gt;
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:&lt;br /&gt;
 defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses Device wird nun das &#039;&#039;template&#039;&#039; &#039;&#039;&#039;esp_milight_hub_bridge&#039;&#039;&#039; angewandt.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Leuchtmittel ====&lt;br /&gt;
&lt;br /&gt;
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:&lt;br /&gt;
 defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Devices werden genauso erstellt. &lt;br /&gt;
&lt;br /&gt;
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template &#039;&#039;X_01a_esp_milight_hub_make_rgbw_group&#039;&#039; verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt &#039;&#039;&#039;eine Kopie&#039;&#039;&#039;, die dann modifiziert wird. Diese Kopie ist unter dem Namen &#039;&#039;milight_&amp;lt;RemoteID&amp;gt;_0&#039;&#039; im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepaßt werden. &lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele:&lt;br /&gt;
Beispiel für ein RGB-CCT-Device:&lt;br /&gt;
 defmod Licht_Wz_all MQTT2_DEVICE&lt;br /&gt;
 attr Licht_Wz_all IODev MQTT2_Broker&lt;br /&gt;
 attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/&lt;br /&gt;
 attr Licht_Wz_all group Licht&lt;br /&gt;
 attr Licht_Wz_all icon light_control&lt;br /&gt;
 attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 &lt;br /&gt;
 attr Licht_Wz_all room Wohnzimmer&lt;br /&gt;
 attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
 off milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
 level milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 next_mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_up milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 device_id milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 effect milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 commands milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr Licht_Wz_all sortby 1&lt;br /&gt;
 attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue&lt;br /&gt;
 attr Licht_Wz_all webCmdLabel command\ &lt;br /&gt;
 :brightness:saturation\&lt;br /&gt;
 :color_temp:hue&lt;br /&gt;
==== Ein Leuchtmittel, mehrere Fernbedienungen ====&lt;br /&gt;
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen &amp;quot;hört&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }&lt;br /&gt;
&lt;br /&gt;
==== Fernbedienung als Input-Device nutzen ====&lt;br /&gt;
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.&lt;br /&gt;
Um hier nur Differenz-Meldungen zu erhalten und doppelte Events zu verhindern, sollte hier die readingList so angepaßt werden, dass nur Messages aus dem &amp;quot;updates&amp;quot;-Zweig ausgewertet werden: &lt;br /&gt;
 defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0&lt;br /&gt;
 attr MiLight_RC1_0 readingList milight/updates/0xABCD/fut089/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/fut089/0:.* {}&lt;br /&gt;
&lt;br /&gt;
== eBus ==&lt;br /&gt;
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition am eBus ===&lt;br /&gt;
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.&lt;br /&gt;
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. &#039;&#039;ebusd/%circuit/%name&#039;&#039;.&lt;br /&gt;
 --accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name&lt;br /&gt;
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic &#039;&#039;ebusd&#039;&#039; verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit &#039;&#039;ebus...&#039;&#039; zu beginnen!}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition  in FHEM ===&lt;br /&gt;
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem &#039;&#039;&#039;&#039;&#039;vor&#039;&#039;&#039;&#039;&#039; den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der &#039;&#039;readingList&#039;&#039; enthalten, die vom ebus stammen. Da wir die &#039;&#039;readingList&#039;&#039; anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche &#039;&#039;readingList&#039;&#039;-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-&amp;quot;Sammeldevices&amp;quot; genutzt werden, und dessen &#039;&#039;CID&#039;&#039; auf &#039;&#039;ebusd&#039;&#039; geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der &#039;&#039;readingList&#039;&#039; des &amp;quot;Sammeldevices&amp;quot; gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. &lt;br /&gt;
&lt;br /&gt;
Sind die Vorbereitungen abgeschlossen, aktivieren wir &#039;&#039;autocreate&#039;&#039; wieder, allerdings wählen wir als autocreate-Methode &#039;&#039;complex&#039;&#039; aus, da der eBus-Dämon teilweise&amp;lt;ref&amp;gt;Dies betrifft vorrangig die Statusmeldungen&amp;lt;/ref&amp;gt; eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt&amp;lt;ref&amp;gt;Bei Verwendung des MQTT2_CLIENT wird dann die &#039;&#039;readingList&#039;&#039; am bereits definierten MQTT2_DEVICE aus der Kopie des &amp;quot;Sammeldevice&amp;quot; automatisch wieder erstellt bzw. gefüllt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;ebus-Bridge&amp;quot; ====&lt;br /&gt;
Auf das von &#039;&#039;autocreate&#039;&#039; erstellte MQTT2_DEVICE wird nunmehr das template &#039;&#039;eBus_daemon_splitter&#039;&#039; angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. &lt;br /&gt;
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen &#039;&#039;uptime&#039;&#039;, alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;attrTemplate&#039;&#039; läd eine weitere &#039;&#039;attrTemplate&#039;&#039;-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. &lt;br /&gt;
==== &amp;quot;ebusd_bai&amp;quot; und weitere Geräte ====&lt;br /&gt;
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}&lt;br /&gt;
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens &#039;&#039;MQTT2_ebus_bai&#039;&#039; angelegt worden sein.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Hinweise ==&lt;br /&gt;
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===&lt;br /&gt;
Nutzt man das rawEvents-Attribut am MQTT2-IO&amp;lt;ref&amp;gt;z.B. &amp;lt;code&amp;gt;attr MQTT2_FHEM_Server rawEvents .*&amp;lt;/code&amp;gt;, der regex-Filter kann wie üblich angepaßt werden&amp;lt;/ref&amp;gt;, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.&lt;br /&gt;
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit &amp;lt;code&amp;gt;attr mqtt2_server verbose 5&amp;lt;/code&amp;gt; auch alles ins FHEM-Log schreiben lassen.&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; genutzt werden. &lt;br /&gt;
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate: Es werden nicht alle templates angezeigt ===&lt;br /&gt;
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate und Sprachsteuerung ===&lt;br /&gt;
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; dem betreffenden Hauptartikel zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
=== bridgeRegexp ===&lt;br /&gt;
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch &#039;&#039;&#039;&#039;&#039;einem&#039;&#039;&#039;&#039;&#039; &#039;&#039;MQTT2_DEVICE&#039;&#039; zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. Das &#039;&#039;&#039;Attribut&#039;&#039;&#039; &#039;&#039;bridgeRegexp&#039;&#039; kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem &#039;&#039;&#039;anderen Device&#039;&#039;&#039; (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als &#039;&#039;newClientId&#039;&#039; hinterlegte Angabe verwendet. &lt;br /&gt;
Dementsprechend sind in den hier aufgeführten Beispielen &#039;&#039;bridgeRegexp&#039;&#039;-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren. Ein Sonderfall hierbei ist das template &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem &#039;&#039;mosquitto&#039;&#039;-Server und würden sonst alle einem einem MQTT2_DEVICE zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Ständig neue Devices? ===&lt;br /&gt;
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:&lt;br /&gt;
==== Vergabe einer ClientID ====&lt;br /&gt;
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). &lt;br /&gt;
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID&#039;s. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.&lt;br /&gt;
&lt;br /&gt;
==== Löschen der ClientID aus der readingList usw. ====&lt;br /&gt;
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den &#039;&#039;default&#039;&#039; &amp;quot;sonoff&amp;quot; zu ändern).&lt;br /&gt;
Beispielsweise wäre &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt; zu ändern in &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt;&lt;br /&gt;
Die über &#039;&#039;attrTemplate&#039;&#039; verfügbaren Konfigurationen verwenden in der Regel keine ClientID&#039;s bzw. entfernen diese.&lt;br /&gt;
&lt;br /&gt;
=== Wildcards in readingList und setList ===&lt;br /&gt;
Auch in readingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;readingList&#039;&#039; werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise duch einen &amp;quot;/&amp;quot;) kann man so schreiben: &amp;quot;[^/]+&amp;quot; (entspricht: &amp;quot;Mindestens ein Zeichen, das kein Schrägstrich ist&amp;quot;). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;setList&#039;&#039; gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht &amp;quot;+&amp;quot; für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es &amp;quot;Gruppen-Topics&amp;quot;, auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Themen ===&lt;br /&gt;
==== Verbinden mehrerer FHEM-Instanzen über MQTT ====&lt;br /&gt;
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeigen kann. So kann man z.B. Messdaten eines Systems über ein &#039;&#039;notify&#039;&#039; iVm. einer einfachen &#039;&#039;publish&#039;&#039;-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.&lt;br /&gt;
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten &#039;&#039;bridgeRegexp&#039;&#039; automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:&lt;br /&gt;
 attr MQTT2_myMqttServer bridgeRegexp \&lt;br /&gt;
   SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* &amp;quot;mgb2_$1&amp;quot;&lt;br /&gt;
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema &#039;&#039;SmartHome/MqttGenericBridge2/&amp;lt;Device-Name&amp;gt;/&amp;lt;Reading-Name&amp;gt;&#039;&#039; versendet.&lt;br /&gt;
==== Umstellung von MQTT_DEVICE (und Derivaten wie XiaomiMQTTDevice) zu MQTT2_DEVICE ====&lt;br /&gt;
Wer beabsichtigt, von der Implementierung MQTT+MQTT_DEVICE zu MQTT2-IO und MQTT2_DEVICE zu wechseln, sollte einige Punkte beachten. Viele diesbezügliche Fragen sind vor allem in  {{Link2Forum|Topic=103762|LinkText=diesem Foren-Thread}}&lt;br /&gt;
&lt;br /&gt;
näher erläutert.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}&lt;br /&gt;
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}&lt;br /&gt;
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;br /&gt;
[[Kategorie:ZigBee]]&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_Connector_f%C3%BCr_Amazon_Alexa&amp;diff=33328</id>
		<title>FHEM Connector für Amazon Alexa</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_Connector_f%C3%BCr_Amazon_Alexa&amp;diff=33328"/>
		<updated>2020-06-01T18:55:47Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Weitergehende Informationen */Test, sry&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&#039;&#039;&#039;Alexa FHEMlazy&#039;&#039;&#039; war historisch ein Fork des Original [[Alexa-Fhem|alexa-fhem]], der im Januar 2019 mit dem Original zusammengeführt wurde und nun als &#039;&#039;&#039;FHEM Connector&#039;&#039;&#039; verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
Er ermöglicht innerhalb von Minuten die Verknüpfung von FHEM mit einem Amazon Echo Gerät. Auch Geräte anderer Hersteller mit verbauten Mikrofonen und Alexa-Sprachassistenten-Unterstützung sollten problemlos funktionieren. Für folgende Geräte ist dies bspw. der Fall (Falls Ihr andere/weitere Gerätemodelle bzw. Hersteller in Verwendung habt, bitte hier pflegen):&lt;br /&gt;
&lt;br /&gt;
* SONOS Beam und SONOS One   &lt;br /&gt;
&lt;br /&gt;
Gegenüber dem klassischen Ansatz ergeben sich Einschränkungen, so läuft die Software normalerweise unter dem gleichen Benutzer wie FHEM auf dem gleichen Server, und es wird z.Zt. nur der Smarthome-Skill unterstützt (die Variante, bei der die Möglichkeiten der Interaktion von Amazon festgelegt wurden).&lt;br /&gt;
Dafür ist weder ein Developer-Account bei Amazon, eigene Lambda- und Skillfunktionen, noch das Öffnen eines eingehenden Ports aus dem Internet nötig. &lt;br /&gt;
* Die Software integriert einen Installer, der die Erstkonfiguration und Anmeldung übernimmt&lt;br /&gt;
* Die Kommunikation zur Software auf dem heimischen Rechner und dann zu FHEM verläuft über SSH und einen vom FHEM-Verein gehosteten Server&lt;br /&gt;
* Funktioniert mit IPv4, IPv6, echtem Dual Stack und DS-Lite&lt;br /&gt;
* Als Skill bei Amazon wird der Skill &amp;quot;FHEM Connector&amp;quot; verwendet.&lt;br /&gt;
&lt;br /&gt;
Der Thread im Forum zur Software ist hier: {{Link2Forum|Topic=94817}}.&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einfache Anbindung von FHEM an Amazon Assistent Alexa&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=alexa&lt;br /&gt;
|ModTechName=39_alexa.pm / alexa-fhem&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModOwner=gvzdus, André/ justme1968 ({{Link2FU|430|Forum}} / [[Benutzer Diskussion:Justme|Wiki]])&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
&lt;br /&gt;
===Arbeitsweise und Datenfluss===&lt;br /&gt;
Vorläufig ist alexa-fhem im &amp;quot;FHEM Connector-Modus&amp;quot; ein reiner [https://developer.amazon.com/de/docs/smarthome/understand-the-smart-home-skill-api.html SmartHome-Skill].&lt;br /&gt;
SmartHome-Skills erhalten weder die Sprachdaten selber noch das, was Amazon in Textform verstanden hat, sondern vielmehr extrahiert Amazon aus dem verstandenen Text Anweisungen und Abfragen für Geräte, die dann an den Skill übermittelt werden. Charmant ist dabei, dass unmittelbar gefragt werden kann &amp;quot;Alexa, wie ist die Temperatur im Wohnzimmer?&amp;quot;, während andere Skills zunächst explizit angesprochen werden müssen (&amp;quot;Alexa, frage FHEM nach der Temperatur im Wohnzimmer&amp;quot;). Außerdem kann der Nutzer mehrere Smarthome-Skills installieren, und die Geräte werden zu einer Gesamtmenge zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Gehen wir den Datenfluss bei der konkreten Frage &amp;quot;Wie ist die Temperatur im Wohnzimmer?&amp;quot; durch:&lt;br /&gt;
* Alexa hat bei der Skillinstallation gelernt, dass &amp;quot;FHEM Connector&amp;quot; bei Dir einen Thermostaten im Raum Wohnzimmer kennt. Dadurch wird bei der Sprachanalyse von &amp;quot;Alexa Voice Service&amp;quot; in der Cloud erkannt, dass eine Abfrage an &amp;quot;FHEM Connector&amp;quot; erfolgversprechend ist.&lt;br /&gt;
* Zunächst wird die zentrale &amp;quot;Lambda-Funktion&amp;quot; von &amp;quot;FHEM Connector&amp;quot; aufgerufen. Die Funktion leitet aber im Kern nur den Request unverändert an den vom Verein bereitgestellten Server weiter. Im Request enthalten ist ein Token, das sogenannte &amp;quot;Bearer-Token&amp;quot;.&lt;br /&gt;
* Der &amp;quot;Vereinsserver&amp;quot; prüft anhand dieses Tokens, ob es überhaupt bekannt ist, und zu welchem Nutzer es gehört. Ist dieser Nutzer verbunden, wird der Request wiederum quasi unverändert an den Nutzer weitergeleitet.&lt;br /&gt;
* Diese Weiterleitung passiert über einen sogenannten SSH-Reverse-Tunnel, der von Deiner Seite und der Software auf dem FHEM-Tunnel automatisch aufgebaut wird.&lt;br /&gt;
* Auf Deiner Seite läuft die eigentliche Software, und zwar unter nodeJS. nodeJS ist ein Javascript ausführender Miniserver, der lokal auf einem Zufallsport auf Requests &amp;quot;lauscht&amp;quot;. In der Original-Version  [[Alexa-Fhem|Alexa FHEM]] kommen die Requests aus dem Internet (hoffentlich von der eigenen Lambda-Funktion), hier bei &amp;quot;FHEM Connector&amp;quot; kommen sie ausschließlich aus dem SSH-Tunnel von lokal.&lt;br /&gt;
* Die Software validiert nun diesen Request anhand des Bearer-Tokens. Konkret wird dabei das bei der Installation generierte Token, dass bei der Skill-Aktivierung an Amazon übertragen wurde, mit dem lokal gespeicherten Wert verglichen. Stimmt das Token, wird der Befehl verarbeitet, üblicherweise wird hierbei ein Aufruf an die Webschnittstelle von FHEM abgesetzt.&lt;br /&gt;
* FHEM führt den Befehl aus&lt;br /&gt;
&lt;br /&gt;
Hört sich langsam und kompliziert an? Kompliziert: Okay. Langsam eher nicht, in etlichen Fällen liegt die Gesamtantwortszeit unter 200 ms.&lt;br /&gt;
&lt;br /&gt;
Soweit ein erster Überblick über die Datenflüsse. Im Abschnitt Sicherheit ist das Konzept der Absicherung deutlich genauer und ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
Du wirst bei der Installation zuerst auf der Kommandozeile auf Deinem Raspberry (o.ä.) unterwegs sein, anschließend im Webfrontend von FHEM, und zum Schluss auf der Alexa-Konsole im Web.&lt;br /&gt;
&lt;br /&gt;
===node.js installieren===&lt;br /&gt;
&lt;br /&gt;
Ab Jessy liegt NodeJS bereits in einer ausreichend aktuellen Version vor (Stretch und Buster funktionieren ebenfalls). Mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install nodejs npm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kannst Du es installieren. Mit &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
node --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
erfährst Du die aktuelle Version - wenn hier etwas mit &amp;quot;8&amp;quot; oder höher vorneweg erscheint, ist alles gut.&lt;br /&gt;
Ansonsten suche Dir bitte eine Anleitung im Web, wie Du NodeJS auf Deinem System auf einen aktuellen Stand bringen kannst.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-FHEM installieren ===&lt;br /&gt;
&lt;br /&gt;
Nun installieren wir Alexa-fhem aus dem offiziellen Repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo npm install -g alexa-fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Vorgang benötigt etwas Zeit.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-FHEM aktivieren ===&lt;br /&gt;
&lt;br /&gt;
Wechsele jetzt in FHEM-Web!&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass das Alexa-Modul in der Version ab Januar 2019 vorliegt. Dafür bitte einmal FHEM aktualisieren:&lt;br /&gt;
Speichern der Config nicht vergessen, und&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
update&lt;br /&gt;
shutdown restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alles, was jetzt noch nötig ist, ist das Anlegen eines Alexa-Devices. Gib dafür in der FHEM-Web-Kommandozeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
define alexa alexa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
an. Nun läuft, während Du bereits das neu angelegte Alexa-Devices siehst, ein komplexer Prozess im Hintergrund:&lt;br /&gt;
&lt;br /&gt;
* Falls noch kein SSH-Key für den Benutzer, unter dem FHEM läuft, existiert, wird einer generiert&lt;br /&gt;
* Es wird ein Secret-Key im Prozess generiert, dass den Server nicht verlässt, und der Skillanmeldung dient.&lt;br /&gt;
* Du wirst auf dem Server &amp;quot;va-fhem.fhem.de&amp;quot; des FHEM-Vereins mit dem SSH-Key angemeldet, und der Hash-Wert Deines Secret-Key dort abgelegt.&lt;br /&gt;
&lt;br /&gt;
Und wenn Du diese Sätze gelesen hast, sollte inzwischen sich das Alexa-Device in FHEM-Web aktualisiert haben, und &lt;br /&gt;
ungefähr so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alexa-Device-2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Status für alexa-fhem und der Proxyverbindung ist wichtig, dass diese beiden Zeilen beim Reload aufgetaucht sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
alexaFHEM.bearerToken crypt:...&lt;br /&gt;
alexaFHEM.skillRegKey crypt:...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ja, und diesen Schlüssel benötigst Du wirklich! Also am besten schon einmal mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
get &amp;lt;alexa&amp;gt; proxyKey&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in Klartext anzeigen lassen und in ein Editor-Fenster dauerhaft wegsichern.&lt;br /&gt;
&lt;br /&gt;
Jetzt solltest Du Dein Alexa-Device nicht mehr löschen, denn das im Reading angezeigte &amp;quot;bearerToken&amp;quot; zu löschen bedeutet, dass die Software die Zugriffe von nicht mehr überprüfen kann und keine Kommandos mehr funktionieren. In diesem Fall hilft nur die Neuinstallation des Skills.&lt;br /&gt;
&lt;br /&gt;
==== Fehler bei der Aktivierung ====&lt;br /&gt;
&lt;br /&gt;
Während kompliziertere Fehlerfälle im Abschnitt &amp;quot;Mögliche Probleme und Lösungen&amp;quot; behandelt werden, hier häufige Fälle, warum die kryptischen Zeilen nicht auftauchen:&lt;br /&gt;
&lt;br /&gt;
* Zuerst bitte einfach einmal die Seite neu laden.&lt;br /&gt;
&lt;br /&gt;
===== 401: Authorization Required =====&lt;br /&gt;
&lt;br /&gt;
Wenn Du FHEM-Web mit einem User/Passwort-Schutz versehen hast, wirst du folgende Fehlermeldung sehen: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
alexaFHEM stopped; failed to connect to fhem: 401: Authorization Required&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Regel musst du die Angaben User/Passwort noch einmal explizit setzen. Im Attribute-Abschnitt &amp;quot;alexaFHEM-auth&amp;quot; auswählen, User/Passwort mit &amp;quot;:&amp;quot; getrennt angeben und &amp;quot;attr&amp;quot; anklicken. alexa-fhem wird automatisch neu gestartet. Hier das Ganze in der Text-Variante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
attr alexa alexaFHEM-auth user:pass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Permission denied =====&lt;br /&gt;
&lt;br /&gt;
Wenn du folgende Fehlermeldungen im Alexa Logfile siehst, wurde das Verzeichnis &amp;quot;/opt/fhem/.ssh/&amp;quot; von dir bei der Arbeit mit &amp;quot;root&amp;quot; oder &amp;quot;sudo&amp;quot; mit den falschen Berechtigungen versehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
[2019-7-25 11:59:12] sshautoconf: aborted with ssh-keygen returned error - key_save_private: Permission denied&lt;br /&gt;
[2019-7-25 11:59:12] *** SSH: proxy configuration failed: ssh-keygen returned error - key_save_private: Permission denied&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prüfen kannst du die Berechtigungen mit folgendem Befehl auf der Shell-Konsole: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
ls -l /opt/fhem/.ssh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Du solltest dann folgende Ausgabe erhalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
insgesamt 12&lt;br /&gt;
-rw------- 1 fhem dialout 1675 Jul 12 13:10 id_rsa&lt;br /&gt;
-rw-r--r-- 1 fhem dialout  391 Jul 12 13:10 id_rsa.pub&lt;br /&gt;
-rw-r--r-- 1 fhem dialout  884 Jul 12 13:10 known_hosts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Steht in der Ausgabe nicht &amp;quot;fhem dialout&amp;quot; (dein fhem User), sondern bspw. &amp;quot;root root&amp;quot;, dann bspw. mit folgendem Befehl an deinen fhem User anpassen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
chown fhem:dialout /opt/fhem/.ssh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem ersten Befehl &amp;quot;ls -l ...&amp;quot; kannst du dann nochmal prüfen, ob die Berechtigungen korrekt übernommen wurden. &lt;br /&gt;
&lt;br /&gt;
===== weitere Prüfungen =====&lt;br /&gt;
&lt;br /&gt;
Hast Du noch die Shell-Konsole offen? Dann prüfe bitte noch einmal auf der Konsole, ob nun zwei Prozesse laufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
ps -ef | egrep &#039;(alexa|ssh)&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sollte Dir idealerweise so etwas anzeigen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
fhem     31322     1 99 13:56 ?        00:00:03 alexa                              &lt;br /&gt;
fhem     31332 31322  8 13:56 ?        00:00:00 /usr/bin/ssh -R 1234:127.0.0.1:&amp;lt;zufälliger port&amp;gt; -oServerAliveInterval=90 -p 58824 fhem-va.fhem.de&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;alexa&amp;quot; ist dabei der Node-JS-Prozess, der ssh-Prozess ist die aufgebaute Verbindung zum Vereinsserver.&lt;br /&gt;
&lt;br /&gt;
Wenn Du diese Prozesse &#039;&#039;&#039;nicht&#039;&#039;&#039; siehst oder das Alexa-Device keinen Registrierungskey anzeigt, dann ist leider der Start nicht glatt verlaufen.&lt;br /&gt;
&lt;br /&gt;
Im Logfile (über den link &amp;lt;code&amp;gt;Logfile&amp;lt;/code&amp;gt; in der Detail-Ansicht über &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;, oder über den Namen bei &#039;&#039;currentlogfile&#039;&#039; in den Internals) findest Du idealerweise selber Hinweise, wo es hakt, oder kannst im Forum nachfragen.&lt;br /&gt;
&lt;br /&gt;
=== Geräte im FHEM-Webfrontend zuweisen ===&lt;br /&gt;
Um das Aha-Erlebnis zu vergrößern, ist jetzt ein guter Zeitpunkt, 1 oder besser mind. 2 Geräte für den Alexa-Dienst zuzuweisen. Von Haus aus wird keines Deiner FHEM-Geräte automatisch Alexa zugewiesen!&lt;br /&gt;
&lt;br /&gt;
Wähle die Geräte aus, rufe sie auf und setze das Attribut &amp;quot;alexaName&amp;quot;. Hierbei in Kürze nur der Hinweis:&lt;br /&gt;
* Keine Angst vor Leerzeichen und Umlauten, funktioniert.&lt;br /&gt;
* Große Angst vor Rechtschreibfehlern (Terrasse, Rollladen) oder komplizierten Wörtern &amp;quot;handgebastelte Martinslaterne im Kinderzimmer Iphigenie-Chantal&amp;quot;.&lt;br /&gt;
* Mehrere Namen für dasselbe Gerät/Device in fhem werden unterstützt. Mehrere Namen werden durch Strichpunkt getrennt&amp;lt;ref&amp;gt;Feature nicht dokumentiert {{Link2Forum|Topic=74041|LinkText=Forumsthread}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Das Attribut &amp;quot;alexaRoom&amp;quot; ist NUR FÜR DEN CUSTOM SKILL relevant. Ausnahme: structure und LightScene Devices, siehe: [[FHEM_Connector_f%C3%BCr_Amazon_Alexa#Was_geht_alles_.3F]].&lt;br /&gt;
&lt;br /&gt;
Lade die Geräte neu in die Software, indem Du &amp;lt;code&amp;gt;set &amp;lt;alexa&amp;gt; restart&amp;lt;/code&amp;gt; ausführst!&lt;br /&gt;
[[Datei:HowToSet alexaName.png|alternativtext=How to set alexaName|ohne|mini|Wie setzt man das Attribut alexaName]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen (weil oft gestellte Fragen im Forum) bzgl. Erkennung von Geräten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Wichtig ist, dass die Filtereinstellung in der alexa-fhem.cfg (zu finden unter &amp;quot;Edit Files&amp;quot;) passt.&lt;br /&gt;
Das, was dort eingetragen ist (Standard: alexaName=..* / also es ist ein alexaName vergeben) auch an den entsprechenden Devices in fhem vorhanden ist.&lt;br /&gt;
Stimmt das nicht überein, kann alexa-fhem keine Devices von fhem abfragen/finden.&lt;br /&gt;
Ob der Filter entsprechend funktioniert kann man wie folgt testen: &#039;&#039;list Filtereinstellung&#039;&#039; beispiel mit Standardfilter: &#039;&#039;list alexaName=..*&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Hat alexa-fhem per Filter Devices aus fhem &amp;quot;gefunden&amp;quot;, geht es weiter mit der &amp;quot;Erkennung&amp;quot;. Also um welches Device (Typ und &amp;quot;Fähigkeiten&amp;quot;) handelt es sich. Dazu gilt folgendes:&lt;br /&gt;
** sind entsprechende Readings beim Device vorhanden (z.B. temperature, state mit on/off, ...) erkennt das alexa-fhem automatisch. Die Liste der automatisch erkannten Readings wächst ständig. Daher erst mal schauen ob das Device bereits entsprechend erkannt (typisiert) wurde. Das kann durch prüfen des alexa-fhem-Logs geschehen (NICHT fhem-log!).&lt;br /&gt;
** sind entsprechende &amp;quot;set-Befehle&amp;quot; erkennbar (oft auch durch Readings). Also ist beispielsweise (wie beim Dummy nötig) ein &#039;&#039;setList&#039;&#039; mit entsprechenden Einträgen vorhanden oder entsprechende Readings, z.B. desired-temp zum Stellen der Temperatur etc.&lt;br /&gt;
** wird das Device nicht richtig oder &amp;quot;unvollständig&amp;quot; erkannt helfen folgende Attribute:&lt;br /&gt;
*** genericDeviceType: hiermit kann alexa-fhem in die gewünschte Richtung &amp;quot;geschubbst&amp;quot; werden. Anmerkung: man kann nicht alles erzwingen, Readings bzw. set-Befehle müssen passen (oder per homebridgeMapping passend gemacht werden). Wenn ein genericDeviceType nicht per &amp;quot;Drop-Down&amp;quot; erscheint, dann kann er auch (wenn bekannt) einfach per WEB-cmd eingegeben werden: &#039;&#039;attr Devicename genericDeviceType media&#039;&#039;&lt;br /&gt;
*** homebridgeMapping: hierdurch kann alexa-fhem bei der Erkennung von Zuständen und möglichen Einstellungen (also WAS kann das Device) unterstützt werden. Mittels homebridgeMapping können vorhandene Readings (Zustände) auf für alexa-fhem bekannte Zustände gemappt werden. Ebenso können damit Standard-fhem-Kommandos von alexa-fhem auf Device-spezifische gemappt werden. Beispiel: on/off auf Ein/Aus (falls das Device statt on/off eben ein Ein/Aus erwartet). Zum Beispiel: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;thermostat&amp;gt; homebridgeMapping TargetTemperature=target::target,minValue=18,maxValue=25,minStep=0.5 CurrentTemperature=myTemp:temperature&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; [https://github.com/justme-1968/homebridge-fhem/blob/master/README.md weitere Beispiele]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&#039;&#039;&#039;Mehrere Namen für dasselbe Gerät/Device in fhem sind möglich.&#039;&#039;&#039;&amp;lt;/br&amp;gt;&lt;br /&gt;
Die Namen werden durch Strichpunkt getrennt.&amp;lt;/br&amp;gt;&lt;br /&gt;
Beispiel:&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;attr dmLampe alexaName Lichtkuppel;Lichtkugel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung bzgl. genericDeviceType und homebridgeMapping:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* diese Attribute werden von verschiedenen &amp;quot;Sprachsteuerungsmodulen&amp;quot; in fhem verwendet (homebridge [dort wurde es &amp;quot;erfunden&amp;quot;], alexa-fhem, gassistant, ...). Daher ist nicht jedes Mapping für alle &amp;quot;Dienste&amp;quot; verwendbar. Ausprobieren schadet aber nicht.&lt;br /&gt;
* ebenso kann man mit diesen Attributen (homebridgeMapping wird gerne so &amp;quot;missbraucht&amp;quot;) nichts erzwingen, was seitens Amazon/Alexa nicht unterstützt bzw. verstanden wird! D.h. zunächst ist zu prüfen, ob ein bestimmter (gewünschter) Sprachbefehl seitens Amazon/Alexa unterstützt wird! Aktuelles Beispiel (Stand Jan 2020): &amp;quot;Alexa, fahre den Rollo hoch/runter&amp;quot;. Da ist Amazon/Alexa gerade dabei etwas zu tun. Bislang wird das nicht unterstützt, also ist das auch mit einem entsprechenden homebridgeMapping nicht zu erzwingen! Was unterstützt wird kann man bei Amazon nachlesen: [https://developer.amazon.com/es-ES/docs/alexa/device-apis/list-of-interfaces.html]&lt;br /&gt;
&lt;br /&gt;
== Finale: Skill verknüpfen ==&lt;br /&gt;
Suche im WebFrontend oder der Alexa-App den Skill &amp;quot;FHEM Connector&amp;quot;. Für nicht-Mac/iOS Anwerder empfiehlt das WebFrontend (https://alexa.amazon.de) statt die App, damit Du den Anmeldeschlüssel auch bequem kopieren kannst.&lt;br /&gt;
&lt;br /&gt;
Wenn du noch nicht bei Amazon angemeldet bist, erwartet Amazon zunächst, dass Du Dich normal bei Amazon anmeldest.&lt;br /&gt;
&lt;br /&gt;
Sobald Du &amp;quot;FHEM Connector&amp;quot; aktivierst, öffnet sich ein Browser-Tab mit folgender Maske:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:FHEMlazy_login.png|240px]]&lt;br /&gt;
&lt;br /&gt;
Hier kopierst Du Deinen Anmeldeschlüssel (im Klartext!) hinein und klickst auf Check. Als glücklicher Mensch ist auf der folgenden Statusseite alles grün:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:FHEMlazy_check.png|240px]]&lt;br /&gt;
&lt;br /&gt;
Im Einzelnen wird hier geprüft, ob Du per SSH verbunden bist (und auch Deine IP zur Sicherheit angezeigt), ob der Reverse-Tunnel steht, ob nodeJS erreichbar ist und wie viele Geräte Alexa gleich finden sollte (in meinem Fall 22).&lt;br /&gt;
&lt;br /&gt;
Sollte etwas nicht grün sein und Du eine Idee zum Fixen haben, kannst Du mit &amp;quot;Retry&amp;quot; neue Versuche auslösen.&lt;br /&gt;
&lt;br /&gt;
Ist alles okay, klicke rechts den Button &amp;quot;Activate Skill&amp;quot;. Du springst damit wieder zurück zu Amazon, die Dir hoffentlich zur erfolgreichen Verknüpfung gratulieren.&lt;br /&gt;
&lt;br /&gt;
Amazon möchte nun unmittelbar die Gerätesuche starten, und unter SmartHome-Geräte sollten diese nun auftauchen.&lt;br /&gt;
&lt;br /&gt;
== Was geht alles ? ==&lt;br /&gt;
&lt;br /&gt;
* Geräte, die sich ein- und ausschalten lassen:&lt;br /&gt;
** Automatisch: Müssen &amp;lt;code&amp;gt;set on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set off&amp;lt;/code&amp;gt; Kommandos haben&lt;br /&gt;
** dummys müssen &amp;lt;code&amp;gt;setList&amp;lt;/code&amp;gt; mit on und off haben&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; switch bzw. light kann bestimmt werden ob es in alexa als Schalter oder Licht behandelt wird.&lt;br /&gt;
** Wenn die Set-Kommandos im FHEM Device anders benannt sind: homebridgeMapping On:cmdOn=&amp;lt;ein&amp;gt;,cmdOff=&amp;lt;aus&amp;gt; setzen&lt;br /&gt;
** Kommandos:&lt;br /&gt;
***Alexa, schalte &amp;lt;name&amp;gt; ein/aus&lt;br /&gt;
***Alexa, Licht an/aus&lt;br /&gt;
***Alexa, schalte &amp;lt;gruppe&amp;gt; ein/aus&lt;br /&gt;
* Geräte, die eine Temperatur messen&lt;br /&gt;
** Automatisch: Es muss ein Reading &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; thermometer&lt;br /&gt;
** Sonst: homebridgeMapping CurrentTemperature:reading=&amp;lt;reading&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Helligkeit sich ändern lässt&lt;br /&gt;
** Automatisch: wenn &amp;lt;code&amp;gt;dim&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Kommandos erkannt werden&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; light&lt;br /&gt;
** Über homebridgeMapping: Wenn &amp;lt;code&amp;gt;helligkeit&amp;lt;/code&amp;gt; das Reading für die aktuelle Helligkeit enthält und die Helligkeit mit &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; prozent xxx&amp;lt;/code&amp;gt; gesetzt wird, sieht das homebridgeMapping wie folgt aus: homebridgeMapping Brightness=helligkeit::prozent,minValue=0,maxValue=&amp;lt;maximalwert&amp;gt;&lt;br /&gt;
** Kommandos:&lt;br /&gt;
*** Alexa, mache &amp;lt;name&amp;gt; heller/dunkler&lt;br /&gt;
*** Alexa, Licht heller/dunkler&lt;br /&gt;
* Geräte, deren Farbe sich ändern lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Farbtemperatur sich ändern lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, bei denen sich eine Lautstärke einstellen lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, bei denen sich ein prozentualer Wert einstellen lässt&lt;br /&gt;
** Automatisch: wenn &amp;lt;code&amp;gt;dim&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Kommandos erkannt werden&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* elektrische Türschlösser&lt;br /&gt;
** &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;: lock&lt;br /&gt;
** homebridgeMapping mit LockCurrentState und LockTargetState&lt;br /&gt;
&lt;br /&gt;
* Thermostate&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; thermostate&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* structure Devices aus FHEM (ab alexa-fhem version 0.5.7)&lt;br /&gt;
** können mit &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene als Szene eingebunden werden&lt;br /&gt;
** über &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; kann der name um einen Ort ergänzt werden&lt;br /&gt;
** Szenen aus einer structure lassen sich ein- und ausschalten&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
&lt;br /&gt;
* LightScene Devices aus FHEM (ab alexa-fhem version 0.5.8)&lt;br /&gt;
** können mit &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene als Szenen eingebunden werden&lt;br /&gt;
** über &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; kann der name um einen Ort ergänzt werden&lt;br /&gt;
** Szenen aus einer LightScene lassen sich nur einschalten&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Kanal sich umschalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping ChannelController:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-channelcontroller.html#changechannel&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Playback status sich schalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping PlaybackController:playback,values=Play;Pause;Stop;Previous;Next&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-playbackcontroller.html#discovery&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Eingang sich umschalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping InputController:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;,values=HDMI+1;HDMI+2;XBOX&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-property-schemas.html#input&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Kontaktsensoren (ab alexa-fhem version 0.5.15)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; contact&lt;br /&gt;
** homebridgeMapping ContactSensorState:reading=&amp;lt;reading&amp;gt; oder CurrentDoorState:reading=&amp;lt;reading&amp;gt;&lt;br /&gt;
** Die Anzeige in der Alexa-App funktioniert sofort, die Abfrage per Sprache erst ab Version 0.5.27.&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Lautstärke sich ändern lässt (ab alexa-fhem version 0.5.24)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; speaker&lt;br /&gt;
** Automatisch: es muss ein Reading &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;mute&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** homebridgeMapping Volume:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt; Mute:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, die sich ein- (und optional) ausschalten lassen als Szene (ab alexa-fhem version 0.5.26)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene&lt;br /&gt;
** Automatisch: Müssen &amp;lt;code&amp;gt;set on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set off&amp;lt;/code&amp;gt; Kommandos haben&lt;br /&gt;
** homebridgeMapping On:reading=&amp;lt;reading&amp;gt;,cmdOn=&amp;lt;cmd&amp;gt;[,cmdOff=&amp;lt;cmd&amp;gt;]&lt;br /&gt;
** Hinweis: Fehlende Kommandos lassen sich mit cmdalias erzeugen&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
* Rollläden. Lange ein Problemthema, das nur mit &amp;quot;Schalte auf 0%, schalte auf 100% lief&amp;quot;. Wichtig: &amp;quot;alexa-fhem&amp;quot; ab Version 0.5.39 einsetzen. GenericDevice-Type auf &amp;quot;blind&amp;quot; setzen. Nach Restart von alexa-fhem und neuer Gerätesuche sollte folgendes funktionieren:&lt;br /&gt;
** &amp;quot;..., öffne &amp;lt;Name&amp;gt; ganz&amp;quot;&lt;br /&gt;
** &amp;quot;..., schließe &amp;lt;Name&amp;gt; komplett&amp;quot;&lt;br /&gt;
** &amp;quot;hoch&amp;quot; und &amp;quot;runter&amp;quot; (ohne &amp;quot;ganz&amp;quot; oder &amp;quot;komplett&amp;quot;) schalten jeweils nur einen bestimmten Prozentsatz hoch oder runter. Dieser kann mit &amp;lt;code&amp;gt;attr &amp;lt;name&amp;gt; homebridgeMapping TargetPosition:minStep=&amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt;geändert werden. Aber Achtung: In diesem Intervall kann dann auch nur noch ein absoluter Prozentwert per Sprache oder Slider eingestellt werden! Bei z.B. 25% würden 13% zu 25% aufgerundet, 12% zu 0% abgerundet werden.&lt;br /&gt;
* Kontaktsensoren (ab alexa-fhem version 0.5.47)&lt;br /&gt;
** Automatisch wenn ein Reading &amp;lt;code&amp;gt;motion&amp;lt;/code&amp;gt; vorhanden ist oder es sich um einen Zigbee bewgungsmelder an einer HUE oder deCONZ Bridge handelt&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; MotionSensor&lt;br /&gt;
** homebridgeMapping MotionDetected:reading=&amp;lt;reading&amp;gt;,values=&amp;lt;wert für bewgung&amp;gt;:1;&amp;lt;wert für keine bewegung&amp;gt;:0&lt;br /&gt;
&lt;br /&gt;
* Alarmmelder (noch nicht in Deutschland):&lt;br /&gt;
** genericDeviceType Security&lt;br /&gt;
** homebridgeMapping Alarm=&amp;lt;reading&amp;gt;[,type=[fireAlarm|waterAlarm|burglaryAlarm|carbonMonoxideAlarm]]&lt;br /&gt;
** wenn der type nicht angegeben wird ist fireAlarm der default&lt;br /&gt;
** automatisch werden 0, ok und alles was mit no anfängt als OK erkannt. alles andere gilt als ALARM.&lt;br /&gt;
&lt;br /&gt;
Es werden noch einige andere häufig verwendete Geräte (Homematic, hue,...) automatisch erkannt.&lt;br /&gt;
&lt;br /&gt;
to be continued ...&lt;br /&gt;
&lt;br /&gt;
In der [https://developer.amazon.com/docs/device-apis/list-of-interfaces.html List of Capability Interfaces] bei Amazon kann man sehen, welche Möglichkeiten das Smart Home Skill API aktuell in einzelnen Ländern bietet. Leider ohne die jeweiligen landessprachlichen Kommandos.&lt;br /&gt;
&lt;br /&gt;
=== Aktiv Routinen starten ===&lt;br /&gt;
Routinen (eine Funktionalität, die rein - genauso wie &amp;quot;Räume&amp;quot; - bei Amazon liegt und nicht von FHEM Connector beeinflusst wird) waren lange die ewige Antwort auf die Frage: &amp;quot;Meine Frau möchte aber &#039;&#039;&#039;Öffne Rollläden&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039; sagen&amp;quot;: In der Alexa-App gibt es im Menü den Punkt &amp;quot;Routinen&amp;quot;, und hier lässt sich eine gewisse Anzahl von Aktionen (unter optionalen Bedingungen) an ein Sprachkommando knüpfen.&lt;br /&gt;
&lt;br /&gt;
Neu: Routinen können inzwischen auch von Skills getriggert werden, und seit Version 0.5.47 (Februar 2020) auch von FHEM Connector. Das braucht niemand, um die Rollläden hochzufahren, denn das kann FHEM ja selber, aber um z.B. eine Ansage auf einem Alexa-Gerät zu triggern. Dafür gibt es auch das FHEM-Modul &amp;quot;echodevice&amp;quot;, aber es erfordert ein paar Klimmzüge. Mit dem aktiven Triggern von Routinen kann FHEM auslösen, dass Alexa ungefragt (!) Dinge wie &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Temperatur in der Tiefkühltruhe hat -16 Grad überschritten&amp;quot;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
in den Raum sagt. Also eine Alternative bzw. Ergänzung zu Alarmen / Erinnerungen per Telegram o.ä.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorgeschichte&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Die Smarthome-Skill-API von Amazon sah schon lange das &amp;quot;proactiveReporting&amp;quot; vor: Also z.B. die gemessene Temperatur nicht erst auf Anfrage hin zu übermitteln, sondern laufend aktiv zu pushen. Aber warum Daten an Amazon senden, wenn es dafür keinen Mehrwert gibt? Beim Öffnen z.B. des Thermostaten in der Alexa-App kommen ohnehin laufend Statusabfragen. Warum also einen Datenpool bei Amazon über die Haustemperatur aufbauen und Änderungen pushen, wenn es keinen Mehrwert dafür gibt? &lt;br /&gt;
&lt;br /&gt;
Inzwischen lassen sich (reale oder vermeintliche) Änderungen von &#039;&#039;Bewegungssensoren&#039;&#039; und &#039;&#039;Fensterkontakten&#039;&#039; als Startbedingung an Alexa-Routinen koppeln. Man kann in der Alexa-App (ggf. fiktive) Öffnen eines Fensterkontaktes an das Aufsagen eines freien Textes durch die Hausbutlerin knüpfen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Umsetzung&#039;&#039;&#039;:&lt;br /&gt;
* Jedes Alexa-Device, dessen Status aktiv zu Amazon gepusht werden soll, im Attribut &amp;quot;alexaProactiveEvents&amp;quot; mit einer &amp;quot;1&amp;quot; versehen. Per Default wird &#039;&#039;kein&#039;&#039; Gerät laufend aktiv zu Amazon gepusht!&lt;br /&gt;
* das geänderte Device einmal zu Amazon pushen &amp;quot;set &amp;lt;alexa&amp;gt; add &amp;lt;device&amp;gt;&amp;quot; (oder &#039;Alexa, suche neue Geräte&#039; murmeln)&lt;br /&gt;
* Das Gerät sollte jetzt beim Anlegen einer neuen Routine (&amp;quot;Neue Routine&amp;quot;, &amp;quot;Wenn Folgendes passiert&amp;quot;, &amp;quot;Smart Home&amp;quot;) als möglicher Triggerpunkt erscheinen.&lt;br /&gt;
&lt;br /&gt;
==== Dummygeräte: ====&lt;br /&gt;
Ein Dummydevice sollte einen Kontaktschalter oder Bewegungssensor simulieren, um dann in FHEM eine beliebige Bedingung als Trigger zu definieren, und eine freie Ansage in Alexa als Routine zu definieren. Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
define voicetrigger1 dummy&lt;br /&gt;
attr voicetrigger1 alexaName Trigger 1&lt;br /&gt;
attr voicetrigger1 alexaProactiveEvents 1&lt;br /&gt;
attr voicetrigger1 genericDeviceType contact&lt;br /&gt;
attr voicetrigger1 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;;open:CONTACT_NOT_DETECTED&lt;br /&gt;
attr voicetrigger1 readingList 0:closed 1:open&lt;br /&gt;
attr voicetrigger1 setList closed open&lt;br /&gt;
&lt;br /&gt;
set alexa add voicetrigger1&lt;br /&gt;
set alexa restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fehlersuche:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Push setzt ein intaktes Push-Token voraus. Sollte im Alexa-Logfile Folgendes erscheinen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;failed to refresh token: invalid_grant: &#039;The request has an invalid grant parameter : refresh_token&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
so ist das Push-Token nicht aktuell. Weil die Auswirkung lange nur war, dass Geräteänderungen nicht aktiv an Amazon gemeldet wurden, gibt es noch keine umfassende Analyse des Problems. Es lässt sich lösen, indem eine oder beide folgenden Aktionen ausgeführt werden:&lt;br /&gt;
* Löschen des &amp;quot;.eventToken&amp;quot; im Alexa-Device über &amp;quot;deletereading&amp;quot;&lt;br /&gt;
* &amp;quot;FHEM-Connector&amp;quot;-Skill auf &amp;quot;alexa.amazon.de&amp;quot; einmal deaktivieren und dann neu verbinden&lt;br /&gt;
&lt;br /&gt;
== Mögliche Probleme und Lösungen ==&lt;br /&gt;
&lt;br /&gt;
Es kann vorkommen, dass Geräte zwar korrekt erkannt werden, aber das durch Alexa erkannte Kommando nicht richtig umgesetzt wird (Beispiel - mittlerweile behoben: {{Link2Forum|Topic=96766}}). Neben dem FHEM-Log gibt es noch das Logfile, welches von alexa-fhem angelegt wird. &lt;br /&gt;
&lt;br /&gt;
=== Fehlersuche über die FHEM-Oberfläche ===&lt;br /&gt;
&lt;br /&gt;
* alexa-fhem Logfile anschauen (Detail-Ansicht des &amp;lt;alexa&amp;gt;-Device aufrufen, klick auf &#039;&#039;&#039;Logfile&#039;&#039;&#039; oben)&lt;br /&gt;
* alexa-fhem im Debug-Modus aufrufen:&lt;br /&gt;
** -D zum alexaFHEM-params attribut hinzufügen&lt;br /&gt;
** Alexa-Befehl auslösen&lt;br /&gt;
** -D aus dem alexaFHEM-params attribut entfernen&lt;br /&gt;
* Die notwendigen Informationen finden sich in dem alexa-Logfile (siehe oben)&lt;br /&gt;
&lt;br /&gt;
=== Fehlersuche über Kommandozeile (lies: Shell) + FHEM-Oberfläche ===&lt;br /&gt;
&lt;br /&gt;
:* set &amp;lt;alexa&amp;gt; stop (FHEM-Oberfläche)&lt;br /&gt;
:* Auf der Kommandozeile &amp;lt;code&amp;gt;alexa-fhem -D -c /opt/fhem/alexa-fhem.cfg &amp;gt; debug.log&amp;lt;/code&amp;gt; starten (dadurch wird die Datei debug.log erzeugt im aktuellen Verzeichnis)&lt;br /&gt;
:* Alexa-Befehl auslösen&lt;br /&gt;
:* alexa-fhem auf der Kommandozeile wieder stoppen (CTRL-C)&lt;br /&gt;
:* set &amp;lt;alexa&amp;gt; start (FHEM-Oberfläche)&lt;br /&gt;
&lt;br /&gt;
Die Datei debug.log sollte Hinweise enthalten, wie das Problem zu lösen ist oder Dich zumindest in die richtige Richtung schieben.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel aus dem Forum fand sich in dem Logfile der Hinweis darauf, dass das Device mit falschen min/max-Werten unterwegs war.&lt;br /&gt;
&lt;br /&gt;
=== Registrierungskey vergessen, Registrierung zurücksetzen ===&lt;br /&gt;
&lt;br /&gt;
Auf der Kommandoshell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de status&lt;br /&gt;
Registered.&lt;br /&gt;
Registered on 2019-01-13T15:38:13Z.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
heisst, das der Vereinsserver eigentlich alles hat, was er will. Es wird kein neuer Schlüssel generiert.&lt;br /&gt;
Wenn Du die Situation zurücksetzen möchtest, wäre die hässliche Methode, Deinen SSH-Key zu löschen. Eleganter ist, die Registrierung auf Vereinsseite zu löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de unregister&lt;br /&gt;
Your registration has been removed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
löscht Deinen Schlüssel mitsamt allen dort gespeicherten Daten auf Vereinsseite. Bei Restart von alexa-fhem in FHEM-WEB wird jetzt ein neuer Registrierungskey angefordert.&lt;br /&gt;
&lt;br /&gt;
== Sicherheitskonzept und Secrets ==&lt;br /&gt;
&lt;br /&gt;
Um diesen Abschnitt zu verstehen, solltest Du den Abschnitt &amp;quot;Arbeitsweise&amp;quot; im Kopf haben. Einerseits ist Dir vermutlich einleuchtend, dass ein Server, der per SSH rückwärts nur ausgewählte Kommandos in den Tunnel, den Du aufgebaut hast, leitet, &amp;quot;irgendwie sicherer&amp;quot; ist. Andererseits möchte man nicht blind vertrauen.&lt;br /&gt;
&lt;br /&gt;
=== SSH ===&lt;br /&gt;
==== SSH - macht das nichts Gefährliches? ====&lt;br /&gt;
SSH ist ein Veteran des Internet und entstand, um sich sicher (verschlüsselt) und schnell auf Servern einzuloggen. Schon früh wurde dabei der sogenannte &amp;quot;Reverse-Tunnel&amp;quot; implementiert: Also der vom Client (Deinem Rechner) geäußerte Wunsch: &amp;quot;Bitte leite mir Requests, die bei Dir, Server, auf Port xy eingehen, an meinen lokalen Port yz weiter.&amp;quot;. Dieses Verfahren implementiert der Reverseproxy, wobei tatsächlich auf dem Server für Dich kein echter Port geöffnet wird.&lt;br /&gt;
&lt;br /&gt;
Wie Dir ggf. sicher der Unix-Guru Deines Vertrauens bestätigen wird: Die Kombination&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
ssh -R 1234:localhost:&amp;lt;zufälliger port&amp;gt; zielserver &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
erlaubt keine Ausführung von Shell-Kommandos auf Deinem Server, sondern einzig, dass vom SSH-Programm Verbindungen zu einem lokalen Port auf Deinem Server auf dem alexa-fhem lauscht aufgebaut werden. Du kannst also z.B. mit einem&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo /usr/sbin/tcpdump -X -s 0 -i lo port &amp;lt;zufälliger port&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
vollständig überwachen (oder ggf. permanent aufzeichen), was auf Deinem Server von außen gesteuert passiert.&lt;br /&gt;
&lt;br /&gt;
==== Wie wird bei SSH verschlüsselt? ====&lt;br /&gt;
Im Prinzip wie im Web auf SSL-Seiten, teils mit den gleichen Verschlüsselungsverfahren. Allerdings arbeitet SSH eher wie das im Web recht seltene Verfahren: Bei jeder Verbindung übermitteln sowohl Server wie auch Client den öffentlichen Teil ihres Schlüssels. Anders als im Web wird der Schlüssel aber nicht von einer öffentlichen Zertifizierungsstelle wie &amp;quot;LetsEncrypt&amp;quot; unterschrieben. Stattdessen entscheiden Server wie Client beim ersten Verbindungsaufbau typischerweise per manueller Frage: &amp;quot;Willst Du jetzt und künftig diesem Schlüssel vertrauen?&amp;quot; Bei der Installation wird diese Frage für Deine Seite bejaht, und fortan wird der öffentliche Schlüssel des FHEM-Servers auf Deinem Rechner gespeichert. Ab da bist Du z.B. davor sicher, dass jemand den DNS-Eintrag verbiegt oder sich in den Datenfluss Deines Providers einhängt: Ein geänderter Serverschlüssel würde bemerkt werden.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Soweit klar? Aus Deinem öffentlichen Schlüssel wiederum leitet der Server her: &amp;quot;Das ist definitiv wieder derjenige, der sich damals &amp;quot;registriert&amp;quot; hat&amp;quot;. Und an dieser Stelle kann ich auch den &amp;lt;b&amp;gt;ersten Teil des 3-teiligen Registrierungskeys&amp;lt;/b&amp;gt; erläutern: Die typischerweise 6-stellige Hex-Zahl am Anfang ist der Java-Hashcode Deines öffentlichen Schlüssel. Sie ist damit sozusagen Deine aus Deinem öffentlichen Schlüssel abgeleitete Benutzer-ID.&lt;br /&gt;
&lt;br /&gt;
=== Die Rolle der Secrets ===&lt;br /&gt;
Wenn jetzt klar ist, dass die Verbindung zum Vereinsserver sicher und vertauschungsfrei funktioniert, bleiben noch 2 Probleme zu lösen:&lt;br /&gt;
1) Im Web bei der Skill-Aktivierung musst Du beweisen, dass Du der Mensch am Browser bist, dem der SSH-Tunnel von IP xy mit dem öffentlichen Schlüssel X gehört. Bei der automatischen Registrierung werden lokal auf Deinem Rechner zwei 64-Bit-Secrets generiert:&lt;br /&gt;
* Das &amp;lt;b&amp;gt;Anmelde&amp;lt;/b&amp;gt;-Secret&lt;br /&gt;
* Das &amp;lt;b&amp;gt;Bearer&amp;lt;/b&amp;gt;-Token&lt;br /&gt;
Beim Anmelden des SSH-Keys auf dem öffentlichen Server wird nun der &amp;lt;b&amp;gt;Hashwert&amp;lt;/b&amp;gt; des ersten Secrets übertragen und dort in Verbindung mit Deinem öffentlichen Schlüssel gespeichert. Ein Hashwert bedeutet, dass (sofern das Verfahren, hier SHA256, funktioniert), niemand aus dem Hash das Secret zurückrechnen kann. Ein Datenbankklau auf dem Server gefährdet also nicht die Sicherheit Deines Passwortes.&lt;br /&gt;
&lt;br /&gt;
Wenn Du nun beim Skill-Aktivieren den Registrierungskey eingibst, dann &amp;quot;sieht&amp;quot; der Server zum ersten Mal Dein ausgewürfeltes Secret, vergleicht es mit dem Hashwert und wird es anschließend wieder umgehend vergessen. Anhand des Hashwertes kann der Server aber entscheiden, dass Du der legitime Nutzer zum öffentlichen Schlüssel XY bist.&lt;br /&gt;
&lt;br /&gt;
2) Das zweite Problem ist: Wie soll Amazon &amp;quot;beweisen&amp;quot;, dass sie der legitime Aufrufer sind? Amazon erhält binnen wenigen Sekunden nach dem Klick auf &amp;quot;Activate Skill&amp;quot; den &amp;lt;b&amp;gt;dritten Teil&amp;lt;/b&amp;gt; des Registrierungskeys als sogenanntes Bearer-Token. Zwar läuft er durch den Registrierungsserver, er wird dort, auf dem Registrierungs/Vereinsserver aber nicht gespeichert. Das Bearer-Token wird von Amazon bei allen Requests zu Deinem Server mitgesendet. Da es am Anfang zusätzlich Deine &amp;quot;User-ID&amp;quot; enthält, weiß der Vereinsserver, zu welchem SSH-Tunnel der Request zu senden ist. Aber lokal auf Deinem Rechner wird ausgewertet, ob das Token &amp;quot;stimmt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== alexa-fhem Updaten bzw. &amp;quot;Upgraden&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Updaten einer &amp;quot;Connector&amp;quot; Installation:&#039;&#039;&#039;&lt;br /&gt;
* alexa-fhem über FHEM anhalten (Name des Alexa-Device: alexa):&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;set alexa stop&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Auf der Konsole wie anfangs bei der Installation:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo npm update -g alexa-fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Manchmal hat npm Probleme mit einem Update. Dann einfach die aktuelle Version noch mal drüber Installieren: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo npm install -g alexa-fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*alexa-fhem über FHEM wieder starten:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;set alexa start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Upgraden von einer &amp;quot;Nicht-Connector&amp;quot; Installation (z.B. manuelle Installation per pm-Download):&#039;&#039;&#039;&lt;br /&gt;
* Daten der aktuellen Installation sichern (v.a. config.json / man weiß ja nie)&lt;br /&gt;
* Autostart der aktuellen alexa-fhem Installation deaktivieren:&lt;br /&gt;
** Bei initd: Service deaktivieren mittels: &amp;lt;code&amp;gt;sudo update-rc.d -f alexa remove&amp;lt;/code&amp;gt; Vorher mittels stoppen: &amp;lt;code&amp;gt;sudo service alexa stop&amp;lt;/code&amp;gt; Startscript unter /etc/init.d/ löschen.&lt;br /&gt;
** Bei systemd: Service deaktivieren mittels: &amp;lt;code&amp;gt;sudo systemctl disable alexa&amp;lt;/code&amp;gt; Vorher mittels stoppen: &amp;lt;code&amp;gt;sudo systemctl alexa stop&amp;lt;/code&amp;gt; Startscript unter /etc/systemd/system/ löschen.&lt;br /&gt;
* ALLE vorhandenen alexa-fhem Daten LÖSCHEN! Bleiben Dinge zurück und wird dann laut Connector installiert kann es zu Problemen kommen!&lt;br /&gt;
* (reboot)&lt;br /&gt;
* Installation von alexa-fhem laut Anleitung (Beginn dieses Wiki)&lt;br /&gt;
* Falls eigene Dinge von früher genutzt werden wollen/sollen (z.B. Custom Skill), dann die entsprechenden Einträge aus der gesicherten config.json in die neu angelegte alexa-fhem.cfg (zu finden unter &amp;quot;Edit files&amp;quot;) übernehmen.&lt;br /&gt;
* Werden keine eigenen Dinge verwendet, dann kann der Port (Standard: 3000) geschlossen werden und auch die Daten unter Amazon-Developer können gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
== Bug- und Wunschliste ==&lt;br /&gt;
* Ist beim Start keine Internetverbindung vorhanden, erfolgt kein Retry -- alexa-fhem muss restartet werden (ssh_autoconfig wertet keine temporären Fehler aus)&lt;br /&gt;
&lt;br /&gt;
==Weitergehende Informationen==&lt;br /&gt;
*[[Alexa und Mappings]]&lt;br /&gt;
*[[Alexa Tipps und Kniffe]]&lt;br /&gt;
*[[FHEM Connector for Amazon Alexa]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;br /&gt;
&lt;br /&gt;
==Hinweise==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_Connector_f%C3%BCr_Amazon_Alexa&amp;diff=33327</id>
		<title>FHEM Connector für Amazon Alexa</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_Connector_f%C3%BCr_Amazon_Alexa&amp;diff=33327"/>
		<updated>2020-06-01T18:53:15Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Weitergehende Informationen */&amp;lt;references /&amp;gt; ergänzt ?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&#039;&#039;&#039;Alexa FHEMlazy&#039;&#039;&#039; war historisch ein Fork des Original [[Alexa-Fhem|alexa-fhem]], der im Januar 2019 mit dem Original zusammengeführt wurde und nun als &#039;&#039;&#039;FHEM Connector&#039;&#039;&#039; verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
Er ermöglicht innerhalb von Minuten die Verknüpfung von FHEM mit einem Amazon Echo Gerät. Auch Geräte anderer Hersteller mit verbauten Mikrofonen und Alexa-Sprachassistenten-Unterstützung sollten problemlos funktionieren. Für folgende Geräte ist dies bspw. der Fall (Falls Ihr andere/weitere Gerätemodelle bzw. Hersteller in Verwendung habt, bitte hier pflegen):&lt;br /&gt;
&lt;br /&gt;
* SONOS Beam und SONOS One   &lt;br /&gt;
&lt;br /&gt;
Gegenüber dem klassischen Ansatz ergeben sich Einschränkungen, so läuft die Software normalerweise unter dem gleichen Benutzer wie FHEM auf dem gleichen Server, und es wird z.Zt. nur der Smarthome-Skill unterstützt (die Variante, bei der die Möglichkeiten der Interaktion von Amazon festgelegt wurden).&lt;br /&gt;
Dafür ist weder ein Developer-Account bei Amazon, eigene Lambda- und Skillfunktionen, noch das Öffnen eines eingehenden Ports aus dem Internet nötig. &lt;br /&gt;
* Die Software integriert einen Installer, der die Erstkonfiguration und Anmeldung übernimmt&lt;br /&gt;
* Die Kommunikation zur Software auf dem heimischen Rechner und dann zu FHEM verläuft über SSH und einen vom FHEM-Verein gehosteten Server&lt;br /&gt;
* Funktioniert mit IPv4, IPv6, echtem Dual Stack und DS-Lite&lt;br /&gt;
* Als Skill bei Amazon wird der Skill &amp;quot;FHEM Connector&amp;quot; verwendet.&lt;br /&gt;
&lt;br /&gt;
Der Thread im Forum zur Software ist hier: {{Link2Forum|Topic=94817}}.&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einfache Anbindung von FHEM an Amazon Assistent Alexa&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=alexa&lt;br /&gt;
|ModTechName=39_alexa.pm / alexa-fhem&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModOwner=gvzdus, André/ justme1968 ({{Link2FU|430|Forum}} / [[Benutzer Diskussion:Justme|Wiki]])&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
&lt;br /&gt;
===Arbeitsweise und Datenfluss===&lt;br /&gt;
Vorläufig ist alexa-fhem im &amp;quot;FHEM Connector-Modus&amp;quot; ein reiner [https://developer.amazon.com/de/docs/smarthome/understand-the-smart-home-skill-api.html SmartHome-Skill].&lt;br /&gt;
SmartHome-Skills erhalten weder die Sprachdaten selber noch das, was Amazon in Textform verstanden hat, sondern vielmehr extrahiert Amazon aus dem verstandenen Text Anweisungen und Abfragen für Geräte, die dann an den Skill übermittelt werden. Charmant ist dabei, dass unmittelbar gefragt werden kann &amp;quot;Alexa, wie ist die Temperatur im Wohnzimmer?&amp;quot;, während andere Skills zunächst explizit angesprochen werden müssen (&amp;quot;Alexa, frage FHEM nach der Temperatur im Wohnzimmer&amp;quot;). Außerdem kann der Nutzer mehrere Smarthome-Skills installieren, und die Geräte werden zu einer Gesamtmenge zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Gehen wir den Datenfluss bei der konkreten Frage &amp;quot;Wie ist die Temperatur im Wohnzimmer?&amp;quot; durch:&lt;br /&gt;
* Alexa hat bei der Skillinstallation gelernt, dass &amp;quot;FHEM Connector&amp;quot; bei Dir einen Thermostaten im Raum Wohnzimmer kennt. Dadurch wird bei der Sprachanalyse von &amp;quot;Alexa Voice Service&amp;quot; in der Cloud erkannt, dass eine Abfrage an &amp;quot;FHEM Connector&amp;quot; erfolgversprechend ist.&lt;br /&gt;
* Zunächst wird die zentrale &amp;quot;Lambda-Funktion&amp;quot; von &amp;quot;FHEM Connector&amp;quot; aufgerufen. Die Funktion leitet aber im Kern nur den Request unverändert an den vom Verein bereitgestellten Server weiter. Im Request enthalten ist ein Token, das sogenannte &amp;quot;Bearer-Token&amp;quot;.&lt;br /&gt;
* Der &amp;quot;Vereinsserver&amp;quot; prüft anhand dieses Tokens, ob es überhaupt bekannt ist, und zu welchem Nutzer es gehört. Ist dieser Nutzer verbunden, wird der Request wiederum quasi unverändert an den Nutzer weitergeleitet.&lt;br /&gt;
* Diese Weiterleitung passiert über einen sogenannten SSH-Reverse-Tunnel, der von Deiner Seite und der Software auf dem FHEM-Tunnel automatisch aufgebaut wird.&lt;br /&gt;
* Auf Deiner Seite läuft die eigentliche Software, und zwar unter nodeJS. nodeJS ist ein Javascript ausführender Miniserver, der lokal auf einem Zufallsport auf Requests &amp;quot;lauscht&amp;quot;. In der Original-Version  [[Alexa-Fhem|Alexa FHEM]] kommen die Requests aus dem Internet (hoffentlich von der eigenen Lambda-Funktion), hier bei &amp;quot;FHEM Connector&amp;quot; kommen sie ausschließlich aus dem SSH-Tunnel von lokal.&lt;br /&gt;
* Die Software validiert nun diesen Request anhand des Bearer-Tokens. Konkret wird dabei das bei der Installation generierte Token, dass bei der Skill-Aktivierung an Amazon übertragen wurde, mit dem lokal gespeicherten Wert verglichen. Stimmt das Token, wird der Befehl verarbeitet, üblicherweise wird hierbei ein Aufruf an die Webschnittstelle von FHEM abgesetzt.&lt;br /&gt;
* FHEM führt den Befehl aus&lt;br /&gt;
&lt;br /&gt;
Hört sich langsam und kompliziert an? Kompliziert: Okay. Langsam eher nicht, in etlichen Fällen liegt die Gesamtantwortszeit unter 200 ms.&lt;br /&gt;
&lt;br /&gt;
Soweit ein erster Überblick über die Datenflüsse. Im Abschnitt Sicherheit ist das Konzept der Absicherung deutlich genauer und ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
Du wirst bei der Installation zuerst auf der Kommandozeile auf Deinem Raspberry (o.ä.) unterwegs sein, anschließend im Webfrontend von FHEM, und zum Schluss auf der Alexa-Konsole im Web.&lt;br /&gt;
&lt;br /&gt;
===node.js installieren===&lt;br /&gt;
&lt;br /&gt;
Ab Jessy liegt NodeJS bereits in einer ausreichend aktuellen Version vor (Stretch und Buster funktionieren ebenfalls). Mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install nodejs npm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kannst Du es installieren. Mit &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
node --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
erfährst Du die aktuelle Version - wenn hier etwas mit &amp;quot;8&amp;quot; oder höher vorneweg erscheint, ist alles gut.&lt;br /&gt;
Ansonsten suche Dir bitte eine Anleitung im Web, wie Du NodeJS auf Deinem System auf einen aktuellen Stand bringen kannst.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-FHEM installieren ===&lt;br /&gt;
&lt;br /&gt;
Nun installieren wir Alexa-fhem aus dem offiziellen Repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo npm install -g alexa-fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Vorgang benötigt etwas Zeit.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-FHEM aktivieren ===&lt;br /&gt;
&lt;br /&gt;
Wechsele jetzt in FHEM-Web!&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass das Alexa-Modul in der Version ab Januar 2019 vorliegt. Dafür bitte einmal FHEM aktualisieren:&lt;br /&gt;
Speichern der Config nicht vergessen, und&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
update&lt;br /&gt;
shutdown restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alles, was jetzt noch nötig ist, ist das Anlegen eines Alexa-Devices. Gib dafür in der FHEM-Web-Kommandozeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
define alexa alexa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
an. Nun läuft, während Du bereits das neu angelegte Alexa-Devices siehst, ein komplexer Prozess im Hintergrund:&lt;br /&gt;
&lt;br /&gt;
* Falls noch kein SSH-Key für den Benutzer, unter dem FHEM läuft, existiert, wird einer generiert&lt;br /&gt;
* Es wird ein Secret-Key im Prozess generiert, dass den Server nicht verlässt, und der Skillanmeldung dient.&lt;br /&gt;
* Du wirst auf dem Server &amp;quot;va-fhem.fhem.de&amp;quot; des FHEM-Vereins mit dem SSH-Key angemeldet, und der Hash-Wert Deines Secret-Key dort abgelegt.&lt;br /&gt;
&lt;br /&gt;
Und wenn Du diese Sätze gelesen hast, sollte inzwischen sich das Alexa-Device in FHEM-Web aktualisiert haben, und &lt;br /&gt;
ungefähr so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alexa-Device-2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Status für alexa-fhem und der Proxyverbindung ist wichtig, dass diese beiden Zeilen beim Reload aufgetaucht sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
alexaFHEM.bearerToken crypt:...&lt;br /&gt;
alexaFHEM.skillRegKey crypt:...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ja, und diesen Schlüssel benötigst Du wirklich! Also am besten schon einmal mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
get &amp;lt;alexa&amp;gt; proxyKey&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in Klartext anzeigen lassen und in ein Editor-Fenster dauerhaft wegsichern.&lt;br /&gt;
&lt;br /&gt;
Jetzt solltest Du Dein Alexa-Device nicht mehr löschen, denn das im Reading angezeigte &amp;quot;bearerToken&amp;quot; zu löschen bedeutet, dass die Software die Zugriffe von nicht mehr überprüfen kann und keine Kommandos mehr funktionieren. In diesem Fall hilft nur die Neuinstallation des Skills.&lt;br /&gt;
&lt;br /&gt;
==== Fehler bei der Aktivierung ====&lt;br /&gt;
&lt;br /&gt;
Während kompliziertere Fehlerfälle im Abschnitt &amp;quot;Mögliche Probleme und Lösungen&amp;quot; behandelt werden, hier häufige Fälle, warum die kryptischen Zeilen nicht auftauchen:&lt;br /&gt;
&lt;br /&gt;
* Zuerst bitte einfach einmal die Seite neu laden.&lt;br /&gt;
&lt;br /&gt;
===== 401: Authorization Required =====&lt;br /&gt;
&lt;br /&gt;
Wenn Du FHEM-Web mit einem User/Passwort-Schutz versehen hast, wirst du folgende Fehlermeldung sehen: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
alexaFHEM stopped; failed to connect to fhem: 401: Authorization Required&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Regel musst du die Angaben User/Passwort noch einmal explizit setzen. Im Attribute-Abschnitt &amp;quot;alexaFHEM-auth&amp;quot; auswählen, User/Passwort mit &amp;quot;:&amp;quot; getrennt angeben und &amp;quot;attr&amp;quot; anklicken. alexa-fhem wird automatisch neu gestartet. Hier das Ganze in der Text-Variante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
attr alexa alexaFHEM-auth user:pass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Permission denied =====&lt;br /&gt;
&lt;br /&gt;
Wenn du folgende Fehlermeldungen im Alexa Logfile siehst, wurde das Verzeichnis &amp;quot;/opt/fhem/.ssh/&amp;quot; von dir bei der Arbeit mit &amp;quot;root&amp;quot; oder &amp;quot;sudo&amp;quot; mit den falschen Berechtigungen versehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
[2019-7-25 11:59:12] sshautoconf: aborted with ssh-keygen returned error - key_save_private: Permission denied&lt;br /&gt;
[2019-7-25 11:59:12] *** SSH: proxy configuration failed: ssh-keygen returned error - key_save_private: Permission denied&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prüfen kannst du die Berechtigungen mit folgendem Befehl auf der Shell-Konsole: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
ls -l /opt/fhem/.ssh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Du solltest dann folgende Ausgabe erhalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
insgesamt 12&lt;br /&gt;
-rw------- 1 fhem dialout 1675 Jul 12 13:10 id_rsa&lt;br /&gt;
-rw-r--r-- 1 fhem dialout  391 Jul 12 13:10 id_rsa.pub&lt;br /&gt;
-rw-r--r-- 1 fhem dialout  884 Jul 12 13:10 known_hosts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Steht in der Ausgabe nicht &amp;quot;fhem dialout&amp;quot; (dein fhem User), sondern bspw. &amp;quot;root root&amp;quot;, dann bspw. mit folgendem Befehl an deinen fhem User anpassen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
chown fhem:dialout /opt/fhem/.ssh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem ersten Befehl &amp;quot;ls -l ...&amp;quot; kannst du dann nochmal prüfen, ob die Berechtigungen korrekt übernommen wurden. &lt;br /&gt;
&lt;br /&gt;
===== weitere Prüfungen =====&lt;br /&gt;
&lt;br /&gt;
Hast Du noch die Shell-Konsole offen? Dann prüfe bitte noch einmal auf der Konsole, ob nun zwei Prozesse laufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
ps -ef | egrep &#039;(alexa|ssh)&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sollte Dir idealerweise so etwas anzeigen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
fhem     31322     1 99 13:56 ?        00:00:03 alexa                              &lt;br /&gt;
fhem     31332 31322  8 13:56 ?        00:00:00 /usr/bin/ssh -R 1234:127.0.0.1:&amp;lt;zufälliger port&amp;gt; -oServerAliveInterval=90 -p 58824 fhem-va.fhem.de&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;alexa&amp;quot; ist dabei der Node-JS-Prozess, der ssh-Prozess ist die aufgebaute Verbindung zum Vereinsserver.&lt;br /&gt;
&lt;br /&gt;
Wenn Du diese Prozesse &#039;&#039;&#039;nicht&#039;&#039;&#039; siehst oder das Alexa-Device keinen Registrierungskey anzeigt, dann ist leider der Start nicht glatt verlaufen.&lt;br /&gt;
&lt;br /&gt;
Im Logfile (über den link &amp;lt;code&amp;gt;Logfile&amp;lt;/code&amp;gt; in der Detail-Ansicht über &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;, oder über den Namen bei &#039;&#039;currentlogfile&#039;&#039; in den Internals) findest Du idealerweise selber Hinweise, wo es hakt, oder kannst im Forum nachfragen.&lt;br /&gt;
&lt;br /&gt;
=== Geräte im FHEM-Webfrontend zuweisen ===&lt;br /&gt;
Um das Aha-Erlebnis zu vergrößern, ist jetzt ein guter Zeitpunkt, 1 oder besser mind. 2 Geräte für den Alexa-Dienst zuzuweisen. Von Haus aus wird keines Deiner FHEM-Geräte automatisch Alexa zugewiesen!&lt;br /&gt;
&lt;br /&gt;
Wähle die Geräte aus, rufe sie auf und setze das Attribut &amp;quot;alexaName&amp;quot;. Hierbei in Kürze nur der Hinweis:&lt;br /&gt;
* Keine Angst vor Leerzeichen und Umlauten, funktioniert.&lt;br /&gt;
* Große Angst vor Rechtschreibfehlern (Terrasse, Rollladen) oder komplizierten Wörtern &amp;quot;handgebastelte Martinslaterne im Kinderzimmer Iphigenie-Chantal&amp;quot;.&lt;br /&gt;
* Mehrere Namen für dasselbe Gerät/Device in fhem werden unterstützt. Mehrere Namen werden durch Strichpunkt getrennt&amp;lt;ref&amp;gt;Feature nicht dokumentiert {{Link2Forum|Topic=74041|LinkText=Forumsthread}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Das Attribut &amp;quot;alexaRoom&amp;quot; ist NUR FÜR DEN CUSTOM SKILL relevant. Ausnahme: structure und LightScene Devices, siehe: [[FHEM_Connector_f%C3%BCr_Amazon_Alexa#Was_geht_alles_.3F]].&lt;br /&gt;
&lt;br /&gt;
Lade die Geräte neu in die Software, indem Du &amp;lt;code&amp;gt;set &amp;lt;alexa&amp;gt; restart&amp;lt;/code&amp;gt; ausführst!&lt;br /&gt;
[[Datei:HowToSet alexaName.png|alternativtext=How to set alexaName|ohne|mini|Wie setzt man das Attribut alexaName]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen (weil oft gestellte Fragen im Forum) bzgl. Erkennung von Geräten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Wichtig ist, dass die Filtereinstellung in der alexa-fhem.cfg (zu finden unter &amp;quot;Edit Files&amp;quot;) passt.&lt;br /&gt;
Das, was dort eingetragen ist (Standard: alexaName=..* / also es ist ein alexaName vergeben) auch an den entsprechenden Devices in fhem vorhanden ist.&lt;br /&gt;
Stimmt das nicht überein, kann alexa-fhem keine Devices von fhem abfragen/finden.&lt;br /&gt;
Ob der Filter entsprechend funktioniert kann man wie folgt testen: &#039;&#039;list Filtereinstellung&#039;&#039; beispiel mit Standardfilter: &#039;&#039;list alexaName=..*&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Hat alexa-fhem per Filter Devices aus fhem &amp;quot;gefunden&amp;quot;, geht es weiter mit der &amp;quot;Erkennung&amp;quot;. Also um welches Device (Typ und &amp;quot;Fähigkeiten&amp;quot;) handelt es sich. Dazu gilt folgendes:&lt;br /&gt;
** sind entsprechende Readings beim Device vorhanden (z.B. temperature, state mit on/off, ...) erkennt das alexa-fhem automatisch. Die Liste der automatisch erkannten Readings wächst ständig. Daher erst mal schauen ob das Device bereits entsprechend erkannt (typisiert) wurde. Das kann durch prüfen des alexa-fhem-Logs geschehen (NICHT fhem-log!).&lt;br /&gt;
** sind entsprechende &amp;quot;set-Befehle&amp;quot; erkennbar (oft auch durch Readings). Also ist beispielsweise (wie beim Dummy nötig) ein &#039;&#039;setList&#039;&#039; mit entsprechenden Einträgen vorhanden oder entsprechende Readings, z.B. desired-temp zum Stellen der Temperatur etc.&lt;br /&gt;
** wird das Device nicht richtig oder &amp;quot;unvollständig&amp;quot; erkannt helfen folgende Attribute:&lt;br /&gt;
*** genericDeviceType: hiermit kann alexa-fhem in die gewünschte Richtung &amp;quot;geschubbst&amp;quot; werden. Anmerkung: man kann nicht alles erzwingen, Readings bzw. set-Befehle müssen passen (oder per homebridgeMapping passend gemacht werden). Wenn ein genericDeviceType nicht per &amp;quot;Drop-Down&amp;quot; erscheint, dann kann er auch (wenn bekannt) einfach per WEB-cmd eingegeben werden: &#039;&#039;attr Devicename genericDeviceType media&#039;&#039;&lt;br /&gt;
*** homebridgeMapping: hierdurch kann alexa-fhem bei der Erkennung von Zuständen und möglichen Einstellungen (also WAS kann das Device) unterstützt werden. Mittels homebridgeMapping können vorhandene Readings (Zustände) auf für alexa-fhem bekannte Zustände gemappt werden. Ebenso können damit Standard-fhem-Kommandos von alexa-fhem auf Device-spezifische gemappt werden. Beispiel: on/off auf Ein/Aus (falls das Device statt on/off eben ein Ein/Aus erwartet). Zum Beispiel: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;thermostat&amp;gt; homebridgeMapping TargetTemperature=target::target,minValue=18,maxValue=25,minStep=0.5 CurrentTemperature=myTemp:temperature&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; [https://github.com/justme-1968/homebridge-fhem/blob/master/README.md weitere Beispiele]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&#039;&#039;&#039;Mehrere Namen für dasselbe Gerät/Device in fhem sind möglich.&#039;&#039;&#039;&amp;lt;/br&amp;gt;&lt;br /&gt;
Die Namen werden durch Strichpunkt getrennt.&amp;lt;/br&amp;gt;&lt;br /&gt;
Beispiel:&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;attr dmLampe alexaName Lichtkuppel;Lichtkugel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung bzgl. genericDeviceType und homebridgeMapping:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* diese Attribute werden von verschiedenen &amp;quot;Sprachsteuerungsmodulen&amp;quot; in fhem verwendet (homebridge [dort wurde es &amp;quot;erfunden&amp;quot;], alexa-fhem, gassistant, ...). Daher ist nicht jedes Mapping für alle &amp;quot;Dienste&amp;quot; verwendbar. Ausprobieren schadet aber nicht.&lt;br /&gt;
* ebenso kann man mit diesen Attributen (homebridgeMapping wird gerne so &amp;quot;missbraucht&amp;quot;) nichts erzwingen, was seitens Amazon/Alexa nicht unterstützt bzw. verstanden wird! D.h. zunächst ist zu prüfen, ob ein bestimmter (gewünschter) Sprachbefehl seitens Amazon/Alexa unterstützt wird! Aktuelles Beispiel (Stand Jan 2020): &amp;quot;Alexa, fahre den Rollo hoch/runter&amp;quot;. Da ist Amazon/Alexa gerade dabei etwas zu tun. Bislang wird das nicht unterstützt, also ist das auch mit einem entsprechenden homebridgeMapping nicht zu erzwingen! Was unterstützt wird kann man bei Amazon nachlesen: [https://developer.amazon.com/es-ES/docs/alexa/device-apis/list-of-interfaces.html]&lt;br /&gt;
&lt;br /&gt;
== Finale: Skill verknüpfen ==&lt;br /&gt;
Suche im WebFrontend oder der Alexa-App den Skill &amp;quot;FHEM Connector&amp;quot;. Für nicht-Mac/iOS Anwerder empfiehlt das WebFrontend (https://alexa.amazon.de) statt die App, damit Du den Anmeldeschlüssel auch bequem kopieren kannst.&lt;br /&gt;
&lt;br /&gt;
Wenn du noch nicht bei Amazon angemeldet bist, erwartet Amazon zunächst, dass Du Dich normal bei Amazon anmeldest.&lt;br /&gt;
&lt;br /&gt;
Sobald Du &amp;quot;FHEM Connector&amp;quot; aktivierst, öffnet sich ein Browser-Tab mit folgender Maske:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:FHEMlazy_login.png|240px]]&lt;br /&gt;
&lt;br /&gt;
Hier kopierst Du Deinen Anmeldeschlüssel (im Klartext!) hinein und klickst auf Check. Als glücklicher Mensch ist auf der folgenden Statusseite alles grün:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:FHEMlazy_check.png|240px]]&lt;br /&gt;
&lt;br /&gt;
Im Einzelnen wird hier geprüft, ob Du per SSH verbunden bist (und auch Deine IP zur Sicherheit angezeigt), ob der Reverse-Tunnel steht, ob nodeJS erreichbar ist und wie viele Geräte Alexa gleich finden sollte (in meinem Fall 22).&lt;br /&gt;
&lt;br /&gt;
Sollte etwas nicht grün sein und Du eine Idee zum Fixen haben, kannst Du mit &amp;quot;Retry&amp;quot; neue Versuche auslösen.&lt;br /&gt;
&lt;br /&gt;
Ist alles okay, klicke rechts den Button &amp;quot;Activate Skill&amp;quot;. Du springst damit wieder zurück zu Amazon, die Dir hoffentlich zur erfolgreichen Verknüpfung gratulieren.&lt;br /&gt;
&lt;br /&gt;
Amazon möchte nun unmittelbar die Gerätesuche starten, und unter SmartHome-Geräte sollten diese nun auftauchen.&lt;br /&gt;
&lt;br /&gt;
== Was geht alles ? ==&lt;br /&gt;
&lt;br /&gt;
* Geräte, die sich ein- und ausschalten lassen:&lt;br /&gt;
** Automatisch: Müssen &amp;lt;code&amp;gt;set on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set off&amp;lt;/code&amp;gt; Kommandos haben&lt;br /&gt;
** dummys müssen &amp;lt;code&amp;gt;setList&amp;lt;/code&amp;gt; mit on und off haben&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; switch bzw. light kann bestimmt werden ob es in alexa als Schalter oder Licht behandelt wird.&lt;br /&gt;
** Wenn die Set-Kommandos im FHEM Device anders benannt sind: homebridgeMapping On:cmdOn=&amp;lt;ein&amp;gt;,cmdOff=&amp;lt;aus&amp;gt; setzen&lt;br /&gt;
** Kommandos:&lt;br /&gt;
***Alexa, schalte &amp;lt;name&amp;gt; ein/aus&lt;br /&gt;
***Alexa, Licht an/aus&lt;br /&gt;
***Alexa, schalte &amp;lt;gruppe&amp;gt; ein/aus&lt;br /&gt;
* Geräte, die eine Temperatur messen&lt;br /&gt;
** Automatisch: Es muss ein Reading &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; thermometer&lt;br /&gt;
** Sonst: homebridgeMapping CurrentTemperature:reading=&amp;lt;reading&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Helligkeit sich ändern lässt&lt;br /&gt;
** Automatisch: wenn &amp;lt;code&amp;gt;dim&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Kommandos erkannt werden&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; light&lt;br /&gt;
** Über homebridgeMapping: Wenn &amp;lt;code&amp;gt;helligkeit&amp;lt;/code&amp;gt; das Reading für die aktuelle Helligkeit enthält und die Helligkeit mit &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; prozent xxx&amp;lt;/code&amp;gt; gesetzt wird, sieht das homebridgeMapping wie folgt aus: homebridgeMapping Brightness=helligkeit::prozent,minValue=0,maxValue=&amp;lt;maximalwert&amp;gt;&lt;br /&gt;
** Kommandos:&lt;br /&gt;
*** Alexa, mache &amp;lt;name&amp;gt; heller/dunkler&lt;br /&gt;
*** Alexa, Licht heller/dunkler&lt;br /&gt;
* Geräte, deren Farbe sich ändern lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Farbtemperatur sich ändern lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, bei denen sich eine Lautstärke einstellen lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, bei denen sich ein prozentualer Wert einstellen lässt&lt;br /&gt;
** Automatisch: wenn &amp;lt;code&amp;gt;dim&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Kommandos erkannt werden&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* elektrische Türschlösser&lt;br /&gt;
** &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;: lock&lt;br /&gt;
** homebridgeMapping mit LockCurrentState und LockTargetState&lt;br /&gt;
&lt;br /&gt;
* Thermostate&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; thermostate&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* structure Devices aus FHEM (ab alexa-fhem version 0.5.7)&lt;br /&gt;
** können mit &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene als Szene eingebunden werden&lt;br /&gt;
** über &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; kann der name um einen Ort ergänzt werden&lt;br /&gt;
** Szenen aus einer structure lassen sich ein- und ausschalten&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
&lt;br /&gt;
* LightScene Devices aus FHEM (ab alexa-fhem version 0.5.8)&lt;br /&gt;
** können mit &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene als Szenen eingebunden werden&lt;br /&gt;
** über &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; kann der name um einen Ort ergänzt werden&lt;br /&gt;
** Szenen aus einer LightScene lassen sich nur einschalten&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Kanal sich umschalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping ChannelController:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-channelcontroller.html#changechannel&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Playback status sich schalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping PlaybackController:playback,values=Play;Pause;Stop;Previous;Next&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-playbackcontroller.html#discovery&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Eingang sich umschalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping InputController:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;,values=HDMI+1;HDMI+2;XBOX&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-property-schemas.html#input&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Kontaktsensoren (ab alexa-fhem version 0.5.15)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; contact&lt;br /&gt;
** homebridgeMapping ContactSensorState:reading=&amp;lt;reading&amp;gt; oder CurrentDoorState:reading=&amp;lt;reading&amp;gt;&lt;br /&gt;
** Die Anzeige in der Alexa-App funktioniert sofort, die Abfrage per Sprache erst ab Version 0.5.27.&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Lautstärke sich ändern lässt (ab alexa-fhem version 0.5.24)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; speaker&lt;br /&gt;
** Automatisch: es muss ein Reading &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;mute&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** homebridgeMapping Volume:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt; Mute:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, die sich ein- (und optional) ausschalten lassen als Szene (ab alexa-fhem version 0.5.26)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene&lt;br /&gt;
** Automatisch: Müssen &amp;lt;code&amp;gt;set on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set off&amp;lt;/code&amp;gt; Kommandos haben&lt;br /&gt;
** homebridgeMapping On:reading=&amp;lt;reading&amp;gt;,cmdOn=&amp;lt;cmd&amp;gt;[,cmdOff=&amp;lt;cmd&amp;gt;]&lt;br /&gt;
** Hinweis: Fehlende Kommandos lassen sich mit cmdalias erzeugen&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
* Rollläden. Lange ein Problemthema, das nur mit &amp;quot;Schalte auf 0%, schalte auf 100% lief&amp;quot;. Wichtig: &amp;quot;alexa-fhem&amp;quot; ab Version 0.5.39 einsetzen. GenericDevice-Type auf &amp;quot;blind&amp;quot; setzen. Nach Restart von alexa-fhem und neuer Gerätesuche sollte folgendes funktionieren:&lt;br /&gt;
** &amp;quot;..., öffne &amp;lt;Name&amp;gt; ganz&amp;quot;&lt;br /&gt;
** &amp;quot;..., schließe &amp;lt;Name&amp;gt; komplett&amp;quot;&lt;br /&gt;
** &amp;quot;hoch&amp;quot; und &amp;quot;runter&amp;quot; (ohne &amp;quot;ganz&amp;quot; oder &amp;quot;komplett&amp;quot;) schalten jeweils nur einen bestimmten Prozentsatz hoch oder runter. Dieser kann mit &amp;lt;code&amp;gt;attr &amp;lt;name&amp;gt; homebridgeMapping TargetPosition:minStep=&amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt;geändert werden. Aber Achtung: In diesem Intervall kann dann auch nur noch ein absoluter Prozentwert per Sprache oder Slider eingestellt werden! Bei z.B. 25% würden 13% zu 25% aufgerundet, 12% zu 0% abgerundet werden.&lt;br /&gt;
* Kontaktsensoren (ab alexa-fhem version 0.5.47)&lt;br /&gt;
** Automatisch wenn ein Reading &amp;lt;code&amp;gt;motion&amp;lt;/code&amp;gt; vorhanden ist oder es sich um einen Zigbee bewgungsmelder an einer HUE oder deCONZ Bridge handelt&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; MotionSensor&lt;br /&gt;
** homebridgeMapping MotionDetected:reading=&amp;lt;reading&amp;gt;,values=&amp;lt;wert für bewgung&amp;gt;:1;&amp;lt;wert für keine bewegung&amp;gt;:0&lt;br /&gt;
&lt;br /&gt;
* Alarmmelder (noch nicht in Deutschland):&lt;br /&gt;
** genericDeviceType Security&lt;br /&gt;
** homebridgeMapping Alarm=&amp;lt;reading&amp;gt;[,type=[fireAlarm|waterAlarm|burglaryAlarm|carbonMonoxideAlarm]]&lt;br /&gt;
** wenn der type nicht angegeben wird ist fireAlarm der default&lt;br /&gt;
** automatisch werden 0, ok und alles was mit no anfängt als OK erkannt. alles andere gilt als ALARM.&lt;br /&gt;
&lt;br /&gt;
Es werden noch einige andere häufig verwendete Geräte (Homematic, hue,...) automatisch erkannt.&lt;br /&gt;
&lt;br /&gt;
to be continued ...&lt;br /&gt;
&lt;br /&gt;
In der [https://developer.amazon.com/docs/device-apis/list-of-interfaces.html List of Capability Interfaces] bei Amazon kann man sehen, welche Möglichkeiten das Smart Home Skill API aktuell in einzelnen Ländern bietet. Leider ohne die jeweiligen landessprachlichen Kommandos.&lt;br /&gt;
&lt;br /&gt;
=== Aktiv Routinen starten ===&lt;br /&gt;
Routinen (eine Funktionalität, die rein - genauso wie &amp;quot;Räume&amp;quot; - bei Amazon liegt und nicht von FHEM Connector beeinflusst wird) waren lange die ewige Antwort auf die Frage: &amp;quot;Meine Frau möchte aber &#039;&#039;&#039;Öffne Rollläden&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039; sagen&amp;quot;: In der Alexa-App gibt es im Menü den Punkt &amp;quot;Routinen&amp;quot;, und hier lässt sich eine gewisse Anzahl von Aktionen (unter optionalen Bedingungen) an ein Sprachkommando knüpfen.&lt;br /&gt;
&lt;br /&gt;
Neu: Routinen können inzwischen auch von Skills getriggert werden, und seit Version 0.5.47 (Februar 2020) auch von FHEM Connector. Das braucht niemand, um die Rollläden hochzufahren, denn das kann FHEM ja selber, aber um z.B. eine Ansage auf einem Alexa-Gerät zu triggern. Dafür gibt es auch das FHEM-Modul &amp;quot;echodevice&amp;quot;, aber es erfordert ein paar Klimmzüge. Mit dem aktiven Triggern von Routinen kann FHEM auslösen, dass Alexa ungefragt (!) Dinge wie &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Temperatur in der Tiefkühltruhe hat -16 Grad überschritten&amp;quot;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
in den Raum sagt. Also eine Alternative bzw. Ergänzung zu Alarmen / Erinnerungen per Telegram o.ä.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorgeschichte&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Die Smarthome-Skill-API von Amazon sah schon lange das &amp;quot;proactiveReporting&amp;quot; vor: Also z.B. die gemessene Temperatur nicht erst auf Anfrage hin zu übermitteln, sondern laufend aktiv zu pushen. Aber warum Daten an Amazon senden, wenn es dafür keinen Mehrwert gibt? Beim Öffnen z.B. des Thermostaten in der Alexa-App kommen ohnehin laufend Statusabfragen. Warum also einen Datenpool bei Amazon über die Haustemperatur aufbauen und Änderungen pushen, wenn es keinen Mehrwert dafür gibt? &lt;br /&gt;
&lt;br /&gt;
Inzwischen lassen sich (reale oder vermeintliche) Änderungen von &#039;&#039;Bewegungssensoren&#039;&#039; und &#039;&#039;Fensterkontakten&#039;&#039; als Startbedingung an Alexa-Routinen koppeln. Man kann in der Alexa-App (ggf. fiktive) Öffnen eines Fensterkontaktes an das Aufsagen eines freien Textes durch die Hausbutlerin knüpfen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Umsetzung&#039;&#039;&#039;:&lt;br /&gt;
* Jedes Alexa-Device, dessen Status aktiv zu Amazon gepusht werden soll, im Attribut &amp;quot;alexaProactiveEvents&amp;quot; mit einer &amp;quot;1&amp;quot; versehen. Per Default wird &#039;&#039;kein&#039;&#039; Gerät laufend aktiv zu Amazon gepusht!&lt;br /&gt;
* das geänderte Device einmal zu Amazon pushen &amp;quot;set &amp;lt;alexa&amp;gt; add &amp;lt;device&amp;gt;&amp;quot; (oder &#039;Alexa, suche neue Geräte&#039; murmeln)&lt;br /&gt;
* Das Gerät sollte jetzt beim Anlegen einer neuen Routine (&amp;quot;Neue Routine&amp;quot;, &amp;quot;Wenn Folgendes passiert&amp;quot;, &amp;quot;Smart Home&amp;quot;) als möglicher Triggerpunkt erscheinen.&lt;br /&gt;
&lt;br /&gt;
==== Dummygeräte: ====&lt;br /&gt;
Ein Dummydevice sollte einen Kontaktschalter oder Bewegungssensor simulieren, um dann in FHEM eine beliebige Bedingung als Trigger zu definieren, und eine freie Ansage in Alexa als Routine zu definieren. Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
define voicetrigger1 dummy&lt;br /&gt;
attr voicetrigger1 alexaName Trigger 1&lt;br /&gt;
attr voicetrigger1 alexaProactiveEvents 1&lt;br /&gt;
attr voicetrigger1 genericDeviceType contact&lt;br /&gt;
attr voicetrigger1 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;;open:CONTACT_NOT_DETECTED&lt;br /&gt;
attr voicetrigger1 readingList 0:closed 1:open&lt;br /&gt;
attr voicetrigger1 setList closed open&lt;br /&gt;
&lt;br /&gt;
set alexa add voicetrigger1&lt;br /&gt;
set alexa restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fehlersuche:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Push setzt ein intaktes Push-Token voraus. Sollte im Alexa-Logfile Folgendes erscheinen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;failed to refresh token: invalid_grant: &#039;The request has an invalid grant parameter : refresh_token&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
so ist das Push-Token nicht aktuell. Weil die Auswirkung lange nur war, dass Geräteänderungen nicht aktiv an Amazon gemeldet wurden, gibt es noch keine umfassende Analyse des Problems. Es lässt sich lösen, indem eine oder beide folgenden Aktionen ausgeführt werden:&lt;br /&gt;
* Löschen des &amp;quot;.eventToken&amp;quot; im Alexa-Device über &amp;quot;deletereading&amp;quot;&lt;br /&gt;
* &amp;quot;FHEM-Connector&amp;quot;-Skill auf &amp;quot;alexa.amazon.de&amp;quot; einmal deaktivieren und dann neu verbinden&lt;br /&gt;
&lt;br /&gt;
== Mögliche Probleme und Lösungen ==&lt;br /&gt;
&lt;br /&gt;
Es kann vorkommen, dass Geräte zwar korrekt erkannt werden, aber das durch Alexa erkannte Kommando nicht richtig umgesetzt wird (Beispiel - mittlerweile behoben: {{Link2Forum|Topic=96766}}). Neben dem FHEM-Log gibt es noch das Logfile, welches von alexa-fhem angelegt wird. &lt;br /&gt;
&lt;br /&gt;
=== Fehlersuche über die FHEM-Oberfläche ===&lt;br /&gt;
&lt;br /&gt;
* alexa-fhem Logfile anschauen (Detail-Ansicht des &amp;lt;alexa&amp;gt;-Device aufrufen, klick auf &#039;&#039;&#039;Logfile&#039;&#039;&#039; oben)&lt;br /&gt;
* alexa-fhem im Debug-Modus aufrufen:&lt;br /&gt;
** -D zum alexaFHEM-params attribut hinzufügen&lt;br /&gt;
** Alexa-Befehl auslösen&lt;br /&gt;
** -D aus dem alexaFHEM-params attribut entfernen&lt;br /&gt;
* Die notwendigen Informationen finden sich in dem alexa-Logfile (siehe oben)&lt;br /&gt;
&lt;br /&gt;
=== Fehlersuche über Kommandozeile (lies: Shell) + FHEM-Oberfläche ===&lt;br /&gt;
&lt;br /&gt;
:* set &amp;lt;alexa&amp;gt; stop (FHEM-Oberfläche)&lt;br /&gt;
:* Auf der Kommandozeile &amp;lt;code&amp;gt;alexa-fhem -D -c /opt/fhem/alexa-fhem.cfg &amp;gt; debug.log&amp;lt;/code&amp;gt; starten (dadurch wird die Datei debug.log erzeugt im aktuellen Verzeichnis)&lt;br /&gt;
:* Alexa-Befehl auslösen&lt;br /&gt;
:* alexa-fhem auf der Kommandozeile wieder stoppen (CTRL-C)&lt;br /&gt;
:* set &amp;lt;alexa&amp;gt; start (FHEM-Oberfläche)&lt;br /&gt;
&lt;br /&gt;
Die Datei debug.log sollte Hinweise enthalten, wie das Problem zu lösen ist oder Dich zumindest in die richtige Richtung schieben.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel aus dem Forum fand sich in dem Logfile der Hinweis darauf, dass das Device mit falschen min/max-Werten unterwegs war.&lt;br /&gt;
&lt;br /&gt;
=== Registrierungskey vergessen, Registrierung zurücksetzen ===&lt;br /&gt;
&lt;br /&gt;
Auf der Kommandoshell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de status&lt;br /&gt;
Registered.&lt;br /&gt;
Registered on 2019-01-13T15:38:13Z.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
heisst, das der Vereinsserver eigentlich alles hat, was er will. Es wird kein neuer Schlüssel generiert.&lt;br /&gt;
Wenn Du die Situation zurücksetzen möchtest, wäre die hässliche Methode, Deinen SSH-Key zu löschen. Eleganter ist, die Registrierung auf Vereinsseite zu löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de unregister&lt;br /&gt;
Your registration has been removed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
löscht Deinen Schlüssel mitsamt allen dort gespeicherten Daten auf Vereinsseite. Bei Restart von alexa-fhem in FHEM-WEB wird jetzt ein neuer Registrierungskey angefordert.&lt;br /&gt;
&lt;br /&gt;
== Sicherheitskonzept und Secrets ==&lt;br /&gt;
&lt;br /&gt;
Um diesen Abschnitt zu verstehen, solltest Du den Abschnitt &amp;quot;Arbeitsweise&amp;quot; im Kopf haben. Einerseits ist Dir vermutlich einleuchtend, dass ein Server, der per SSH rückwärts nur ausgewählte Kommandos in den Tunnel, den Du aufgebaut hast, leitet, &amp;quot;irgendwie sicherer&amp;quot; ist. Andererseits möchte man nicht blind vertrauen.&lt;br /&gt;
&lt;br /&gt;
=== SSH ===&lt;br /&gt;
==== SSH - macht das nichts Gefährliches? ====&lt;br /&gt;
SSH ist ein Veteran des Internet und entstand, um sich sicher (verschlüsselt) und schnell auf Servern einzuloggen. Schon früh wurde dabei der sogenannte &amp;quot;Reverse-Tunnel&amp;quot; implementiert: Also der vom Client (Deinem Rechner) geäußerte Wunsch: &amp;quot;Bitte leite mir Requests, die bei Dir, Server, auf Port xy eingehen, an meinen lokalen Port yz weiter.&amp;quot;. Dieses Verfahren implementiert der Reverseproxy, wobei tatsächlich auf dem Server für Dich kein echter Port geöffnet wird.&lt;br /&gt;
&lt;br /&gt;
Wie Dir ggf. sicher der Unix-Guru Deines Vertrauens bestätigen wird: Die Kombination&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
ssh -R 1234:localhost:&amp;lt;zufälliger port&amp;gt; zielserver &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
erlaubt keine Ausführung von Shell-Kommandos auf Deinem Server, sondern einzig, dass vom SSH-Programm Verbindungen zu einem lokalen Port auf Deinem Server auf dem alexa-fhem lauscht aufgebaut werden. Du kannst also z.B. mit einem&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo /usr/sbin/tcpdump -X -s 0 -i lo port &amp;lt;zufälliger port&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
vollständig überwachen (oder ggf. permanent aufzeichen), was auf Deinem Server von außen gesteuert passiert.&lt;br /&gt;
&lt;br /&gt;
==== Wie wird bei SSH verschlüsselt? ====&lt;br /&gt;
Im Prinzip wie im Web auf SSL-Seiten, teils mit den gleichen Verschlüsselungsverfahren. Allerdings arbeitet SSH eher wie das im Web recht seltene Verfahren: Bei jeder Verbindung übermitteln sowohl Server wie auch Client den öffentlichen Teil ihres Schlüssels. Anders als im Web wird der Schlüssel aber nicht von einer öffentlichen Zertifizierungsstelle wie &amp;quot;LetsEncrypt&amp;quot; unterschrieben. Stattdessen entscheiden Server wie Client beim ersten Verbindungsaufbau typischerweise per manueller Frage: &amp;quot;Willst Du jetzt und künftig diesem Schlüssel vertrauen?&amp;quot; Bei der Installation wird diese Frage für Deine Seite bejaht, und fortan wird der öffentliche Schlüssel des FHEM-Servers auf Deinem Rechner gespeichert. Ab da bist Du z.B. davor sicher, dass jemand den DNS-Eintrag verbiegt oder sich in den Datenfluss Deines Providers einhängt: Ein geänderter Serverschlüssel würde bemerkt werden.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Soweit klar? Aus Deinem öffentlichen Schlüssel wiederum leitet der Server her: &amp;quot;Das ist definitiv wieder derjenige, der sich damals &amp;quot;registriert&amp;quot; hat&amp;quot;. Und an dieser Stelle kann ich auch den &amp;lt;b&amp;gt;ersten Teil des 3-teiligen Registrierungskeys&amp;lt;/b&amp;gt; erläutern: Die typischerweise 6-stellige Hex-Zahl am Anfang ist der Java-Hashcode Deines öffentlichen Schlüssel. Sie ist damit sozusagen Deine aus Deinem öffentlichen Schlüssel abgeleitete Benutzer-ID.&lt;br /&gt;
&lt;br /&gt;
=== Die Rolle der Secrets ===&lt;br /&gt;
Wenn jetzt klar ist, dass die Verbindung zum Vereinsserver sicher und vertauschungsfrei funktioniert, bleiben noch 2 Probleme zu lösen:&lt;br /&gt;
1) Im Web bei der Skill-Aktivierung musst Du beweisen, dass Du der Mensch am Browser bist, dem der SSH-Tunnel von IP xy mit dem öffentlichen Schlüssel X gehört. Bei der automatischen Registrierung werden lokal auf Deinem Rechner zwei 64-Bit-Secrets generiert:&lt;br /&gt;
* Das &amp;lt;b&amp;gt;Anmelde&amp;lt;/b&amp;gt;-Secret&lt;br /&gt;
* Das &amp;lt;b&amp;gt;Bearer&amp;lt;/b&amp;gt;-Token&lt;br /&gt;
Beim Anmelden des SSH-Keys auf dem öffentlichen Server wird nun der &amp;lt;b&amp;gt;Hashwert&amp;lt;/b&amp;gt; des ersten Secrets übertragen und dort in Verbindung mit Deinem öffentlichen Schlüssel gespeichert. Ein Hashwert bedeutet, dass (sofern das Verfahren, hier SHA256, funktioniert), niemand aus dem Hash das Secret zurückrechnen kann. Ein Datenbankklau auf dem Server gefährdet also nicht die Sicherheit Deines Passwortes.&lt;br /&gt;
&lt;br /&gt;
Wenn Du nun beim Skill-Aktivieren den Registrierungskey eingibst, dann &amp;quot;sieht&amp;quot; der Server zum ersten Mal Dein ausgewürfeltes Secret, vergleicht es mit dem Hashwert und wird es anschließend wieder umgehend vergessen. Anhand des Hashwertes kann der Server aber entscheiden, dass Du der legitime Nutzer zum öffentlichen Schlüssel XY bist.&lt;br /&gt;
&lt;br /&gt;
2) Das zweite Problem ist: Wie soll Amazon &amp;quot;beweisen&amp;quot;, dass sie der legitime Aufrufer sind? Amazon erhält binnen wenigen Sekunden nach dem Klick auf &amp;quot;Activate Skill&amp;quot; den &amp;lt;b&amp;gt;dritten Teil&amp;lt;/b&amp;gt; des Registrierungskeys als sogenanntes Bearer-Token. Zwar läuft er durch den Registrierungsserver, er wird dort, auf dem Registrierungs/Vereinsserver aber nicht gespeichert. Das Bearer-Token wird von Amazon bei allen Requests zu Deinem Server mitgesendet. Da es am Anfang zusätzlich Deine &amp;quot;User-ID&amp;quot; enthält, weiß der Vereinsserver, zu welchem SSH-Tunnel der Request zu senden ist. Aber lokal auf Deinem Rechner wird ausgewertet, ob das Token &amp;quot;stimmt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== alexa-fhem Updaten bzw. &amp;quot;Upgraden&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Updaten einer &amp;quot;Connector&amp;quot; Installation:&#039;&#039;&#039;&lt;br /&gt;
* alexa-fhem über FHEM anhalten (Name des Alexa-Device: alexa):&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;set alexa stop&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Auf der Konsole wie anfangs bei der Installation:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo npm update -g alexa-fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Manchmal hat npm Probleme mit einem Update. Dann einfach die aktuelle Version noch mal drüber Installieren: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo npm install -g alexa-fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*alexa-fhem über FHEM wieder starten:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;set alexa start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Upgraden von einer &amp;quot;Nicht-Connector&amp;quot; Installation (z.B. manuelle Installation per pm-Download):&#039;&#039;&#039;&lt;br /&gt;
* Daten der aktuellen Installation sichern (v.a. config.json / man weiß ja nie)&lt;br /&gt;
* Autostart der aktuellen alexa-fhem Installation deaktivieren:&lt;br /&gt;
** Bei initd: Service deaktivieren mittels: &amp;lt;code&amp;gt;sudo update-rc.d -f alexa remove&amp;lt;/code&amp;gt; Vorher mittels stoppen: &amp;lt;code&amp;gt;sudo service alexa stop&amp;lt;/code&amp;gt; Startscript unter /etc/init.d/ löschen.&lt;br /&gt;
** Bei systemd: Service deaktivieren mittels: &amp;lt;code&amp;gt;sudo systemctl disable alexa&amp;lt;/code&amp;gt; Vorher mittels stoppen: &amp;lt;code&amp;gt;sudo systemctl alexa stop&amp;lt;/code&amp;gt; Startscript unter /etc/systemd/system/ löschen.&lt;br /&gt;
* ALLE vorhandenen alexa-fhem Daten LÖSCHEN! Bleiben Dinge zurück und wird dann laut Connector installiert kann es zu Problemen kommen!&lt;br /&gt;
* (reboot)&lt;br /&gt;
* Installation von alexa-fhem laut Anleitung (Beginn dieses Wiki)&lt;br /&gt;
* Falls eigene Dinge von früher genutzt werden wollen/sollen (z.B. Custom Skill), dann die entsprechenden Einträge aus der gesicherten config.json in die neu angelegte alexa-fhem.cfg (zu finden unter &amp;quot;Edit files&amp;quot;) übernehmen.&lt;br /&gt;
* Werden keine eigenen Dinge verwendet, dann kann der Port (Standard: 3000) geschlossen werden und auch die Daten unter Amazon-Developer können gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
== Bug- und Wunschliste ==&lt;br /&gt;
* Ist beim Start keine Internetverbindung vorhanden, erfolgt kein Retry -- alexa-fhem muss restartet werden (ssh_autoconfig wertet keine temporären Fehler aus)&lt;br /&gt;
&lt;br /&gt;
==Weitergehende Informationen==&lt;br /&gt;
*[[Alexa und Mappings]]&lt;br /&gt;
*[[Alexa Tipps und Kniffe]]&lt;br /&gt;
*[[FHEM Connector for Amazon Alexa]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_Connector_f%C3%BCr_Amazon_Alexa&amp;diff=33326</id>
		<title>FHEM Connector für Amazon Alexa</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_Connector_f%C3%BCr_Amazon_Alexa&amp;diff=33326"/>
		<updated>2020-06-01T18:33:50Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Geräte im FHEM-Webfrontend zuweisen */Test&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&#039;&#039;&#039;Alexa FHEMlazy&#039;&#039;&#039; war historisch ein Fork des Original [[Alexa-Fhem|alexa-fhem]], der im Januar 2019 mit dem Original zusammengeführt wurde und nun als &#039;&#039;&#039;FHEM Connector&#039;&#039;&#039; verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
Er ermöglicht innerhalb von Minuten die Verknüpfung von FHEM mit einem Amazon Echo Gerät. Auch Geräte anderer Hersteller mit verbauten Mikrofonen und Alexa-Sprachassistenten-Unterstützung sollten problemlos funktionieren. Für folgende Geräte ist dies bspw. der Fall (Falls Ihr andere/weitere Gerätemodelle bzw. Hersteller in Verwendung habt, bitte hier pflegen):&lt;br /&gt;
&lt;br /&gt;
* SONOS Beam und SONOS One   &lt;br /&gt;
&lt;br /&gt;
Gegenüber dem klassischen Ansatz ergeben sich Einschränkungen, so läuft die Software normalerweise unter dem gleichen Benutzer wie FHEM auf dem gleichen Server, und es wird z.Zt. nur der Smarthome-Skill unterstützt (die Variante, bei der die Möglichkeiten der Interaktion von Amazon festgelegt wurden).&lt;br /&gt;
Dafür ist weder ein Developer-Account bei Amazon, eigene Lambda- und Skillfunktionen, noch das Öffnen eines eingehenden Ports aus dem Internet nötig. &lt;br /&gt;
* Die Software integriert einen Installer, der die Erstkonfiguration und Anmeldung übernimmt&lt;br /&gt;
* Die Kommunikation zur Software auf dem heimischen Rechner und dann zu FHEM verläuft über SSH und einen vom FHEM-Verein gehosteten Server&lt;br /&gt;
* Funktioniert mit IPv4, IPv6, echtem Dual Stack und DS-Lite&lt;br /&gt;
* Als Skill bei Amazon wird der Skill &amp;quot;FHEM Connector&amp;quot; verwendet.&lt;br /&gt;
&lt;br /&gt;
Der Thread im Forum zur Software ist hier: {{Link2Forum|Topic=94817}}.&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einfache Anbindung von FHEM an Amazon Assistent Alexa&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=alexa&lt;br /&gt;
|ModTechName=39_alexa.pm / alexa-fhem&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModOwner=gvzdus, André/ justme1968 ({{Link2FU|430|Forum}} / [[Benutzer Diskussion:Justme|Wiki]])&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
&lt;br /&gt;
===Arbeitsweise und Datenfluss===&lt;br /&gt;
Vorläufig ist alexa-fhem im &amp;quot;FHEM Connector-Modus&amp;quot; ein reiner [https://developer.amazon.com/de/docs/smarthome/understand-the-smart-home-skill-api.html SmartHome-Skill].&lt;br /&gt;
SmartHome-Skills erhalten weder die Sprachdaten selber noch das, was Amazon in Textform verstanden hat, sondern vielmehr extrahiert Amazon aus dem verstandenen Text Anweisungen und Abfragen für Geräte, die dann an den Skill übermittelt werden. Charmant ist dabei, dass unmittelbar gefragt werden kann &amp;quot;Alexa, wie ist die Temperatur im Wohnzimmer?&amp;quot;, während andere Skills zunächst explizit angesprochen werden müssen (&amp;quot;Alexa, frage FHEM nach der Temperatur im Wohnzimmer&amp;quot;). Außerdem kann der Nutzer mehrere Smarthome-Skills installieren, und die Geräte werden zu einer Gesamtmenge zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Gehen wir den Datenfluss bei der konkreten Frage &amp;quot;Wie ist die Temperatur im Wohnzimmer?&amp;quot; durch:&lt;br /&gt;
* Alexa hat bei der Skillinstallation gelernt, dass &amp;quot;FHEM Connector&amp;quot; bei Dir einen Thermostaten im Raum Wohnzimmer kennt. Dadurch wird bei der Sprachanalyse von &amp;quot;Alexa Voice Service&amp;quot; in der Cloud erkannt, dass eine Abfrage an &amp;quot;FHEM Connector&amp;quot; erfolgversprechend ist.&lt;br /&gt;
* Zunächst wird die zentrale &amp;quot;Lambda-Funktion&amp;quot; von &amp;quot;FHEM Connector&amp;quot; aufgerufen. Die Funktion leitet aber im Kern nur den Request unverändert an den vom Verein bereitgestellten Server weiter. Im Request enthalten ist ein Token, das sogenannte &amp;quot;Bearer-Token&amp;quot;.&lt;br /&gt;
* Der &amp;quot;Vereinsserver&amp;quot; prüft anhand dieses Tokens, ob es überhaupt bekannt ist, und zu welchem Nutzer es gehört. Ist dieser Nutzer verbunden, wird der Request wiederum quasi unverändert an den Nutzer weitergeleitet.&lt;br /&gt;
* Diese Weiterleitung passiert über einen sogenannten SSH-Reverse-Tunnel, der von Deiner Seite und der Software auf dem FHEM-Tunnel automatisch aufgebaut wird.&lt;br /&gt;
* Auf Deiner Seite läuft die eigentliche Software, und zwar unter nodeJS. nodeJS ist ein Javascript ausführender Miniserver, der lokal auf einem Zufallsport auf Requests &amp;quot;lauscht&amp;quot;. In der Original-Version  [[Alexa-Fhem|Alexa FHEM]] kommen die Requests aus dem Internet (hoffentlich von der eigenen Lambda-Funktion), hier bei &amp;quot;FHEM Connector&amp;quot; kommen sie ausschließlich aus dem SSH-Tunnel von lokal.&lt;br /&gt;
* Die Software validiert nun diesen Request anhand des Bearer-Tokens. Konkret wird dabei das bei der Installation generierte Token, dass bei der Skill-Aktivierung an Amazon übertragen wurde, mit dem lokal gespeicherten Wert verglichen. Stimmt das Token, wird der Befehl verarbeitet, üblicherweise wird hierbei ein Aufruf an die Webschnittstelle von FHEM abgesetzt.&lt;br /&gt;
* FHEM führt den Befehl aus&lt;br /&gt;
&lt;br /&gt;
Hört sich langsam und kompliziert an? Kompliziert: Okay. Langsam eher nicht, in etlichen Fällen liegt die Gesamtantwortszeit unter 200 ms.&lt;br /&gt;
&lt;br /&gt;
Soweit ein erster Überblick über die Datenflüsse. Im Abschnitt Sicherheit ist das Konzept der Absicherung deutlich genauer und ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
Du wirst bei der Installation zuerst auf der Kommandozeile auf Deinem Raspberry (o.ä.) unterwegs sein, anschließend im Webfrontend von FHEM, und zum Schluss auf der Alexa-Konsole im Web.&lt;br /&gt;
&lt;br /&gt;
===node.js installieren===&lt;br /&gt;
&lt;br /&gt;
Ab Jessy liegt NodeJS bereits in einer ausreichend aktuellen Version vor (Stretch und Buster funktionieren ebenfalls). Mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install nodejs npm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kannst Du es installieren. Mit &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
node --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
erfährst Du die aktuelle Version - wenn hier etwas mit &amp;quot;8&amp;quot; oder höher vorneweg erscheint, ist alles gut.&lt;br /&gt;
Ansonsten suche Dir bitte eine Anleitung im Web, wie Du NodeJS auf Deinem System auf einen aktuellen Stand bringen kannst.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-FHEM installieren ===&lt;br /&gt;
&lt;br /&gt;
Nun installieren wir Alexa-fhem aus dem offiziellen Repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo npm install -g alexa-fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Vorgang benötigt etwas Zeit.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-FHEM aktivieren ===&lt;br /&gt;
&lt;br /&gt;
Wechsele jetzt in FHEM-Web!&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass das Alexa-Modul in der Version ab Januar 2019 vorliegt. Dafür bitte einmal FHEM aktualisieren:&lt;br /&gt;
Speichern der Config nicht vergessen, und&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
update&lt;br /&gt;
shutdown restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alles, was jetzt noch nötig ist, ist das Anlegen eines Alexa-Devices. Gib dafür in der FHEM-Web-Kommandozeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
define alexa alexa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
an. Nun läuft, während Du bereits das neu angelegte Alexa-Devices siehst, ein komplexer Prozess im Hintergrund:&lt;br /&gt;
&lt;br /&gt;
* Falls noch kein SSH-Key für den Benutzer, unter dem FHEM läuft, existiert, wird einer generiert&lt;br /&gt;
* Es wird ein Secret-Key im Prozess generiert, dass den Server nicht verlässt, und der Skillanmeldung dient.&lt;br /&gt;
* Du wirst auf dem Server &amp;quot;va-fhem.fhem.de&amp;quot; des FHEM-Vereins mit dem SSH-Key angemeldet, und der Hash-Wert Deines Secret-Key dort abgelegt.&lt;br /&gt;
&lt;br /&gt;
Und wenn Du diese Sätze gelesen hast, sollte inzwischen sich das Alexa-Device in FHEM-Web aktualisiert haben, und &lt;br /&gt;
ungefähr so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alexa-Device-2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Status für alexa-fhem und der Proxyverbindung ist wichtig, dass diese beiden Zeilen beim Reload aufgetaucht sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
alexaFHEM.bearerToken crypt:...&lt;br /&gt;
alexaFHEM.skillRegKey crypt:...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ja, und diesen Schlüssel benötigst Du wirklich! Also am besten schon einmal mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
get &amp;lt;alexa&amp;gt; proxyKey&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in Klartext anzeigen lassen und in ein Editor-Fenster dauerhaft wegsichern.&lt;br /&gt;
&lt;br /&gt;
Jetzt solltest Du Dein Alexa-Device nicht mehr löschen, denn das im Reading angezeigte &amp;quot;bearerToken&amp;quot; zu löschen bedeutet, dass die Software die Zugriffe von nicht mehr überprüfen kann und keine Kommandos mehr funktionieren. In diesem Fall hilft nur die Neuinstallation des Skills.&lt;br /&gt;
&lt;br /&gt;
==== Fehler bei der Aktivierung ====&lt;br /&gt;
&lt;br /&gt;
Während kompliziertere Fehlerfälle im Abschnitt &amp;quot;Mögliche Probleme und Lösungen&amp;quot; behandelt werden, hier häufige Fälle, warum die kryptischen Zeilen nicht auftauchen:&lt;br /&gt;
&lt;br /&gt;
* Zuerst bitte einfach einmal die Seite neu laden.&lt;br /&gt;
&lt;br /&gt;
===== 401: Authorization Required =====&lt;br /&gt;
&lt;br /&gt;
Wenn Du FHEM-Web mit einem User/Passwort-Schutz versehen hast, wirst du folgende Fehlermeldung sehen: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
alexaFHEM stopped; failed to connect to fhem: 401: Authorization Required&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Regel musst du die Angaben User/Passwort noch einmal explizit setzen. Im Attribute-Abschnitt &amp;quot;alexaFHEM-auth&amp;quot; auswählen, User/Passwort mit &amp;quot;:&amp;quot; getrennt angeben und &amp;quot;attr&amp;quot; anklicken. alexa-fhem wird automatisch neu gestartet. Hier das Ganze in der Text-Variante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
attr alexa alexaFHEM-auth user:pass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Permission denied =====&lt;br /&gt;
&lt;br /&gt;
Wenn du folgende Fehlermeldungen im Alexa Logfile siehst, wurde das Verzeichnis &amp;quot;/opt/fhem/.ssh/&amp;quot; von dir bei der Arbeit mit &amp;quot;root&amp;quot; oder &amp;quot;sudo&amp;quot; mit den falschen Berechtigungen versehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
[2019-7-25 11:59:12] sshautoconf: aborted with ssh-keygen returned error - key_save_private: Permission denied&lt;br /&gt;
[2019-7-25 11:59:12] *** SSH: proxy configuration failed: ssh-keygen returned error - key_save_private: Permission denied&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prüfen kannst du die Berechtigungen mit folgendem Befehl auf der Shell-Konsole: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
ls -l /opt/fhem/.ssh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Du solltest dann folgende Ausgabe erhalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
insgesamt 12&lt;br /&gt;
-rw------- 1 fhem dialout 1675 Jul 12 13:10 id_rsa&lt;br /&gt;
-rw-r--r-- 1 fhem dialout  391 Jul 12 13:10 id_rsa.pub&lt;br /&gt;
-rw-r--r-- 1 fhem dialout  884 Jul 12 13:10 known_hosts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Steht in der Ausgabe nicht &amp;quot;fhem dialout&amp;quot; (dein fhem User), sondern bspw. &amp;quot;root root&amp;quot;, dann bspw. mit folgendem Befehl an deinen fhem User anpassen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
chown fhem:dialout /opt/fhem/.ssh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem ersten Befehl &amp;quot;ls -l ...&amp;quot; kannst du dann nochmal prüfen, ob die Berechtigungen korrekt übernommen wurden. &lt;br /&gt;
&lt;br /&gt;
===== weitere Prüfungen =====&lt;br /&gt;
&lt;br /&gt;
Hast Du noch die Shell-Konsole offen? Dann prüfe bitte noch einmal auf der Konsole, ob nun zwei Prozesse laufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
ps -ef | egrep &#039;(alexa|ssh)&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sollte Dir idealerweise so etwas anzeigen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
fhem     31322     1 99 13:56 ?        00:00:03 alexa                              &lt;br /&gt;
fhem     31332 31322  8 13:56 ?        00:00:00 /usr/bin/ssh -R 1234:127.0.0.1:&amp;lt;zufälliger port&amp;gt; -oServerAliveInterval=90 -p 58824 fhem-va.fhem.de&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;alexa&amp;quot; ist dabei der Node-JS-Prozess, der ssh-Prozess ist die aufgebaute Verbindung zum Vereinsserver.&lt;br /&gt;
&lt;br /&gt;
Wenn Du diese Prozesse &#039;&#039;&#039;nicht&#039;&#039;&#039; siehst oder das Alexa-Device keinen Registrierungskey anzeigt, dann ist leider der Start nicht glatt verlaufen.&lt;br /&gt;
&lt;br /&gt;
Im Logfile (über den link &amp;lt;code&amp;gt;Logfile&amp;lt;/code&amp;gt; in der Detail-Ansicht über &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;, oder über den Namen bei &#039;&#039;currentlogfile&#039;&#039; in den Internals) findest Du idealerweise selber Hinweise, wo es hakt, oder kannst im Forum nachfragen.&lt;br /&gt;
&lt;br /&gt;
=== Geräte im FHEM-Webfrontend zuweisen ===&lt;br /&gt;
Um das Aha-Erlebnis zu vergrößern, ist jetzt ein guter Zeitpunkt, 1 oder besser mind. 2 Geräte für den Alexa-Dienst zuzuweisen. Von Haus aus wird keines Deiner FHEM-Geräte automatisch Alexa zugewiesen!&lt;br /&gt;
&lt;br /&gt;
Wähle die Geräte aus, rufe sie auf und setze das Attribut &amp;quot;alexaName&amp;quot;. Hierbei in Kürze nur der Hinweis:&lt;br /&gt;
* Keine Angst vor Leerzeichen und Umlauten, funktioniert.&lt;br /&gt;
* Große Angst vor Rechtschreibfehlern (Terrasse, Rollladen) oder komplizierten Wörtern &amp;quot;handgebastelte Martinslaterne im Kinderzimmer Iphigenie-Chantal&amp;quot;.&lt;br /&gt;
* Mehrere Namen für dasselbe Gerät/Device in fhem werden unterstützt. Mehrere Namen werden durch Strichpunkt getrennt&amp;lt;ref&amp;gt;Feature nicht dokumentiert {{Link2Forum|Topic=74041|LinkText=Forumsthread}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Das Attribut &amp;quot;alexaRoom&amp;quot; ist NUR FÜR DEN CUSTOM SKILL relevant. Ausnahme: structure und LightScene Devices, siehe: [[FHEM_Connector_f%C3%BCr_Amazon_Alexa#Was_geht_alles_.3F]].&lt;br /&gt;
&lt;br /&gt;
Lade die Geräte neu in die Software, indem Du &amp;lt;code&amp;gt;set &amp;lt;alexa&amp;gt; restart&amp;lt;/code&amp;gt; ausführst!&lt;br /&gt;
[[Datei:HowToSet alexaName.png|alternativtext=How to set alexaName|ohne|mini|Wie setzt man das Attribut alexaName]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen (weil oft gestellte Fragen im Forum) bzgl. Erkennung von Geräten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Wichtig ist, dass die Filtereinstellung in der alexa-fhem.cfg (zu finden unter &amp;quot;Edit Files&amp;quot;) passt.&lt;br /&gt;
Das, was dort eingetragen ist (Standard: alexaName=..* / also es ist ein alexaName vergeben) auch an den entsprechenden Devices in fhem vorhanden ist.&lt;br /&gt;
Stimmt das nicht überein, kann alexa-fhem keine Devices von fhem abfragen/finden.&lt;br /&gt;
Ob der Filter entsprechend funktioniert kann man wie folgt testen: &#039;&#039;list Filtereinstellung&#039;&#039; beispiel mit Standardfilter: &#039;&#039;list alexaName=..*&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Hat alexa-fhem per Filter Devices aus fhem &amp;quot;gefunden&amp;quot;, geht es weiter mit der &amp;quot;Erkennung&amp;quot;. Also um welches Device (Typ und &amp;quot;Fähigkeiten&amp;quot;) handelt es sich. Dazu gilt folgendes:&lt;br /&gt;
** sind entsprechende Readings beim Device vorhanden (z.B. temperature, state mit on/off, ...) erkennt das alexa-fhem automatisch. Die Liste der automatisch erkannten Readings wächst ständig. Daher erst mal schauen ob das Device bereits entsprechend erkannt (typisiert) wurde. Das kann durch prüfen des alexa-fhem-Logs geschehen (NICHT fhem-log!).&lt;br /&gt;
** sind entsprechende &amp;quot;set-Befehle&amp;quot; erkennbar (oft auch durch Readings). Also ist beispielsweise (wie beim Dummy nötig) ein &#039;&#039;setList&#039;&#039; mit entsprechenden Einträgen vorhanden oder entsprechende Readings, z.B. desired-temp zum Stellen der Temperatur etc.&lt;br /&gt;
** wird das Device nicht richtig oder &amp;quot;unvollständig&amp;quot; erkannt helfen folgende Attribute:&lt;br /&gt;
*** genericDeviceType: hiermit kann alexa-fhem in die gewünschte Richtung &amp;quot;geschubbst&amp;quot; werden. Anmerkung: man kann nicht alles erzwingen, Readings bzw. set-Befehle müssen passen (oder per homebridgeMapping passend gemacht werden). Wenn ein genericDeviceType nicht per &amp;quot;Drop-Down&amp;quot; erscheint, dann kann er auch (wenn bekannt) einfach per WEB-cmd eingegeben werden: &#039;&#039;attr Devicename genericDeviceType media&#039;&#039;&lt;br /&gt;
*** homebridgeMapping: hierdurch kann alexa-fhem bei der Erkennung von Zuständen und möglichen Einstellungen (also WAS kann das Device) unterstützt werden. Mittels homebridgeMapping können vorhandene Readings (Zustände) auf für alexa-fhem bekannte Zustände gemappt werden. Ebenso können damit Standard-fhem-Kommandos von alexa-fhem auf Device-spezifische gemappt werden. Beispiel: on/off auf Ein/Aus (falls das Device statt on/off eben ein Ein/Aus erwartet). Zum Beispiel: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;thermostat&amp;gt; homebridgeMapping TargetTemperature=target::target,minValue=18,maxValue=25,minStep=0.5 CurrentTemperature=myTemp:temperature&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; [https://github.com/justme-1968/homebridge-fhem/blob/master/README.md weitere Beispiele]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&#039;&#039;&#039;Mehrere Namen für dasselbe Gerät/Device in fhem sind möglich.&#039;&#039;&#039;&amp;lt;/br&amp;gt;&lt;br /&gt;
Die Namen werden durch Strichpunkt getrennt.&amp;lt;/br&amp;gt;&lt;br /&gt;
Beispiel:&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;attr dmLampe alexaName Lichtkuppel;Lichtkugel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung bzgl. genericDeviceType und homebridgeMapping:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* diese Attribute werden von verschiedenen &amp;quot;Sprachsteuerungsmodulen&amp;quot; in fhem verwendet (homebridge [dort wurde es &amp;quot;erfunden&amp;quot;], alexa-fhem, gassistant, ...). Daher ist nicht jedes Mapping für alle &amp;quot;Dienste&amp;quot; verwendbar. Ausprobieren schadet aber nicht.&lt;br /&gt;
* ebenso kann man mit diesen Attributen (homebridgeMapping wird gerne so &amp;quot;missbraucht&amp;quot;) nichts erzwingen, was seitens Amazon/Alexa nicht unterstützt bzw. verstanden wird! D.h. zunächst ist zu prüfen, ob ein bestimmter (gewünschter) Sprachbefehl seitens Amazon/Alexa unterstützt wird! Aktuelles Beispiel (Stand Jan 2020): &amp;quot;Alexa, fahre den Rollo hoch/runter&amp;quot;. Da ist Amazon/Alexa gerade dabei etwas zu tun. Bislang wird das nicht unterstützt, also ist das auch mit einem entsprechenden homebridgeMapping nicht zu erzwingen! Was unterstützt wird kann man bei Amazon nachlesen: [https://developer.amazon.com/es-ES/docs/alexa/device-apis/list-of-interfaces.html]&lt;br /&gt;
&lt;br /&gt;
== Finale: Skill verknüpfen ==&lt;br /&gt;
Suche im WebFrontend oder der Alexa-App den Skill &amp;quot;FHEM Connector&amp;quot;. Für nicht-Mac/iOS Anwerder empfiehlt das WebFrontend (https://alexa.amazon.de) statt die App, damit Du den Anmeldeschlüssel auch bequem kopieren kannst.&lt;br /&gt;
&lt;br /&gt;
Wenn du noch nicht bei Amazon angemeldet bist, erwartet Amazon zunächst, dass Du Dich normal bei Amazon anmeldest.&lt;br /&gt;
&lt;br /&gt;
Sobald Du &amp;quot;FHEM Connector&amp;quot; aktivierst, öffnet sich ein Browser-Tab mit folgender Maske:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:FHEMlazy_login.png|240px]]&lt;br /&gt;
&lt;br /&gt;
Hier kopierst Du Deinen Anmeldeschlüssel (im Klartext!) hinein und klickst auf Check. Als glücklicher Mensch ist auf der folgenden Statusseite alles grün:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:FHEMlazy_check.png|240px]]&lt;br /&gt;
&lt;br /&gt;
Im Einzelnen wird hier geprüft, ob Du per SSH verbunden bist (und auch Deine IP zur Sicherheit angezeigt), ob der Reverse-Tunnel steht, ob nodeJS erreichbar ist und wie viele Geräte Alexa gleich finden sollte (in meinem Fall 22).&lt;br /&gt;
&lt;br /&gt;
Sollte etwas nicht grün sein und Du eine Idee zum Fixen haben, kannst Du mit &amp;quot;Retry&amp;quot; neue Versuche auslösen.&lt;br /&gt;
&lt;br /&gt;
Ist alles okay, klicke rechts den Button &amp;quot;Activate Skill&amp;quot;. Du springst damit wieder zurück zu Amazon, die Dir hoffentlich zur erfolgreichen Verknüpfung gratulieren.&lt;br /&gt;
&lt;br /&gt;
Amazon möchte nun unmittelbar die Gerätesuche starten, und unter SmartHome-Geräte sollten diese nun auftauchen.&lt;br /&gt;
&lt;br /&gt;
== Was geht alles ? ==&lt;br /&gt;
&lt;br /&gt;
* Geräte, die sich ein- und ausschalten lassen:&lt;br /&gt;
** Automatisch: Müssen &amp;lt;code&amp;gt;set on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set off&amp;lt;/code&amp;gt; Kommandos haben&lt;br /&gt;
** dummys müssen &amp;lt;code&amp;gt;setList&amp;lt;/code&amp;gt; mit on und off haben&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; switch bzw. light kann bestimmt werden ob es in alexa als Schalter oder Licht behandelt wird.&lt;br /&gt;
** Wenn die Set-Kommandos im FHEM Device anders benannt sind: homebridgeMapping On:cmdOn=&amp;lt;ein&amp;gt;,cmdOff=&amp;lt;aus&amp;gt; setzen&lt;br /&gt;
** Kommandos:&lt;br /&gt;
***Alexa, schalte &amp;lt;name&amp;gt; ein/aus&lt;br /&gt;
***Alexa, Licht an/aus&lt;br /&gt;
***Alexa, schalte &amp;lt;gruppe&amp;gt; ein/aus&lt;br /&gt;
* Geräte, die eine Temperatur messen&lt;br /&gt;
** Automatisch: Es muss ein Reading &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; thermometer&lt;br /&gt;
** Sonst: homebridgeMapping CurrentTemperature:reading=&amp;lt;reading&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Helligkeit sich ändern lässt&lt;br /&gt;
** Automatisch: wenn &amp;lt;code&amp;gt;dim&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Kommandos erkannt werden&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; light&lt;br /&gt;
** Über homebridgeMapping: Wenn &amp;lt;code&amp;gt;helligkeit&amp;lt;/code&amp;gt; das Reading für die aktuelle Helligkeit enthält und die Helligkeit mit &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; prozent xxx&amp;lt;/code&amp;gt; gesetzt wird, sieht das homebridgeMapping wie folgt aus: homebridgeMapping Brightness=helligkeit::prozent,minValue=0,maxValue=&amp;lt;maximalwert&amp;gt;&lt;br /&gt;
** Kommandos:&lt;br /&gt;
*** Alexa, mache &amp;lt;name&amp;gt; heller/dunkler&lt;br /&gt;
*** Alexa, Licht heller/dunkler&lt;br /&gt;
* Geräte, deren Farbe sich ändern lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Farbtemperatur sich ändern lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, bei denen sich eine Lautstärke einstellen lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, bei denen sich ein prozentualer Wert einstellen lässt&lt;br /&gt;
** Automatisch: wenn &amp;lt;code&amp;gt;dim&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Kommandos erkannt werden&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* elektrische Türschlösser&lt;br /&gt;
** &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;: lock&lt;br /&gt;
** homebridgeMapping mit LockCurrentState und LockTargetState&lt;br /&gt;
&lt;br /&gt;
* Thermostate&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; thermostate&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* structure Devices aus FHEM (ab alexa-fhem version 0.5.7)&lt;br /&gt;
** können mit &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene als Szene eingebunden werden&lt;br /&gt;
** über &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; kann der name um einen Ort ergänzt werden&lt;br /&gt;
** Szenen aus einer structure lassen sich ein- und ausschalten&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
&lt;br /&gt;
* LightScene Devices aus FHEM (ab alexa-fhem version 0.5.8)&lt;br /&gt;
** können mit &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene als Szenen eingebunden werden&lt;br /&gt;
** über &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; kann der name um einen Ort ergänzt werden&lt;br /&gt;
** Szenen aus einer LightScene lassen sich nur einschalten&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Kanal sich umschalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping ChannelController:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-channelcontroller.html#changechannel&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Playback status sich schalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping PlaybackController:playback,values=Play;Pause;Stop;Previous;Next&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-playbackcontroller.html#discovery&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Eingang sich umschalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping InputController:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;,values=HDMI+1;HDMI+2;XBOX&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-property-schemas.html#input&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Kontaktsensoren (ab alexa-fhem version 0.5.15)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; contact&lt;br /&gt;
** homebridgeMapping ContactSensorState:reading=&amp;lt;reading&amp;gt; oder CurrentDoorState:reading=&amp;lt;reading&amp;gt;&lt;br /&gt;
** Die Anzeige in der Alexa-App funktioniert sofort, die Abfrage per Sprache erst ab Version 0.5.27.&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Lautstärke sich ändern lässt (ab alexa-fhem version 0.5.24)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; speaker&lt;br /&gt;
** Automatisch: es muss ein Reading &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;mute&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** homebridgeMapping Volume:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt; Mute:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, die sich ein- (und optional) ausschalten lassen als Szene (ab alexa-fhem version 0.5.26)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene&lt;br /&gt;
** Automatisch: Müssen &amp;lt;code&amp;gt;set on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set off&amp;lt;/code&amp;gt; Kommandos haben&lt;br /&gt;
** homebridgeMapping On:reading=&amp;lt;reading&amp;gt;,cmdOn=&amp;lt;cmd&amp;gt;[,cmdOff=&amp;lt;cmd&amp;gt;]&lt;br /&gt;
** Hinweis: Fehlende Kommandos lassen sich mit cmdalias erzeugen&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
* Rollläden. Lange ein Problemthema, das nur mit &amp;quot;Schalte auf 0%, schalte auf 100% lief&amp;quot;. Wichtig: &amp;quot;alexa-fhem&amp;quot; ab Version 0.5.39 einsetzen. GenericDevice-Type auf &amp;quot;blind&amp;quot; setzen. Nach Restart von alexa-fhem und neuer Gerätesuche sollte folgendes funktionieren:&lt;br /&gt;
** &amp;quot;..., öffne &amp;lt;Name&amp;gt; ganz&amp;quot;&lt;br /&gt;
** &amp;quot;..., schließe &amp;lt;Name&amp;gt; komplett&amp;quot;&lt;br /&gt;
** &amp;quot;hoch&amp;quot; und &amp;quot;runter&amp;quot; (ohne &amp;quot;ganz&amp;quot; oder &amp;quot;komplett&amp;quot;) schalten jeweils nur einen bestimmten Prozentsatz hoch oder runter. Dieser kann mit &amp;lt;code&amp;gt;attr &amp;lt;name&amp;gt; homebridgeMapping TargetPosition:minStep=&amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt;geändert werden. Aber Achtung: In diesem Intervall kann dann auch nur noch ein absoluter Prozentwert per Sprache oder Slider eingestellt werden! Bei z.B. 25% würden 13% zu 25% aufgerundet, 12% zu 0% abgerundet werden.&lt;br /&gt;
* Kontaktsensoren (ab alexa-fhem version 0.5.47)&lt;br /&gt;
** Automatisch wenn ein Reading &amp;lt;code&amp;gt;motion&amp;lt;/code&amp;gt; vorhanden ist oder es sich um einen Zigbee bewgungsmelder an einer HUE oder deCONZ Bridge handelt&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; MotionSensor&lt;br /&gt;
** homebridgeMapping MotionDetected:reading=&amp;lt;reading&amp;gt;,values=&amp;lt;wert für bewgung&amp;gt;:1;&amp;lt;wert für keine bewegung&amp;gt;:0&lt;br /&gt;
&lt;br /&gt;
* Alarmmelder (noch nicht in Deutschland):&lt;br /&gt;
** genericDeviceType Security&lt;br /&gt;
** homebridgeMapping Alarm=&amp;lt;reading&amp;gt;[,type=[fireAlarm|waterAlarm|burglaryAlarm|carbonMonoxideAlarm]]&lt;br /&gt;
** wenn der type nicht angegeben wird ist fireAlarm der default&lt;br /&gt;
** automatisch werden 0, ok und alles was mit no anfängt als OK erkannt. alles andere gilt als ALARM.&lt;br /&gt;
&lt;br /&gt;
Es werden noch einige andere häufig verwendete Geräte (Homematic, hue,...) automatisch erkannt.&lt;br /&gt;
&lt;br /&gt;
to be continued ...&lt;br /&gt;
&lt;br /&gt;
In der [https://developer.amazon.com/docs/device-apis/list-of-interfaces.html List of Capability Interfaces] bei Amazon kann man sehen, welche Möglichkeiten das Smart Home Skill API aktuell in einzelnen Ländern bietet. Leider ohne die jeweiligen landessprachlichen Kommandos.&lt;br /&gt;
&lt;br /&gt;
=== Aktiv Routinen starten ===&lt;br /&gt;
Routinen (eine Funktionalität, die rein - genauso wie &amp;quot;Räume&amp;quot; - bei Amazon liegt und nicht von FHEM Connector beeinflusst wird) waren lange die ewige Antwort auf die Frage: &amp;quot;Meine Frau möchte aber &#039;&#039;&#039;Öffne Rollläden&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039; sagen&amp;quot;: In der Alexa-App gibt es im Menü den Punkt &amp;quot;Routinen&amp;quot;, und hier lässt sich eine gewisse Anzahl von Aktionen (unter optionalen Bedingungen) an ein Sprachkommando knüpfen.&lt;br /&gt;
&lt;br /&gt;
Neu: Routinen können inzwischen auch von Skills getriggert werden, und seit Version 0.5.47 (Februar 2020) auch von FHEM Connector. Das braucht niemand, um die Rollläden hochzufahren, denn das kann FHEM ja selber, aber um z.B. eine Ansage auf einem Alexa-Gerät zu triggern. Dafür gibt es auch das FHEM-Modul &amp;quot;echodevice&amp;quot;, aber es erfordert ein paar Klimmzüge. Mit dem aktiven Triggern von Routinen kann FHEM auslösen, dass Alexa ungefragt (!) Dinge wie &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Temperatur in der Tiefkühltruhe hat -16 Grad überschritten&amp;quot;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
in den Raum sagt. Also eine Alternative bzw. Ergänzung zu Alarmen / Erinnerungen per Telegram o.ä.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorgeschichte&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Die Smarthome-Skill-API von Amazon sah schon lange das &amp;quot;proactiveReporting&amp;quot; vor: Also z.B. die gemessene Temperatur nicht erst auf Anfrage hin zu übermitteln, sondern laufend aktiv zu pushen. Aber warum Daten an Amazon senden, wenn es dafür keinen Mehrwert gibt? Beim Öffnen z.B. des Thermostaten in der Alexa-App kommen ohnehin laufend Statusabfragen. Warum also einen Datenpool bei Amazon über die Haustemperatur aufbauen und Änderungen pushen, wenn es keinen Mehrwert dafür gibt? &lt;br /&gt;
&lt;br /&gt;
Inzwischen lassen sich (reale oder vermeintliche) Änderungen von &#039;&#039;Bewegungssensoren&#039;&#039; und &#039;&#039;Fensterkontakten&#039;&#039; als Startbedingung an Alexa-Routinen koppeln. Man kann in der Alexa-App (ggf. fiktive) Öffnen eines Fensterkontaktes an das Aufsagen eines freien Textes durch die Hausbutlerin knüpfen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Umsetzung&#039;&#039;&#039;:&lt;br /&gt;
* Jedes Alexa-Device, dessen Status aktiv zu Amazon gepusht werden soll, im Attribut &amp;quot;alexaProactiveEvents&amp;quot; mit einer &amp;quot;1&amp;quot; versehen. Per Default wird &#039;&#039;kein&#039;&#039; Gerät laufend aktiv zu Amazon gepusht!&lt;br /&gt;
* das geänderte Device einmal zu Amazon pushen &amp;quot;set &amp;lt;alexa&amp;gt; add &amp;lt;device&amp;gt;&amp;quot; (oder &#039;Alexa, suche neue Geräte&#039; murmeln)&lt;br /&gt;
* Das Gerät sollte jetzt beim Anlegen einer neuen Routine (&amp;quot;Neue Routine&amp;quot;, &amp;quot;Wenn Folgendes passiert&amp;quot;, &amp;quot;Smart Home&amp;quot;) als möglicher Triggerpunkt erscheinen.&lt;br /&gt;
&lt;br /&gt;
==== Dummygeräte: ====&lt;br /&gt;
Ein Dummydevice sollte einen Kontaktschalter oder Bewegungssensor simulieren, um dann in FHEM eine beliebige Bedingung als Trigger zu definieren, und eine freie Ansage in Alexa als Routine zu definieren. Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
define voicetrigger1 dummy&lt;br /&gt;
attr voicetrigger1 alexaName Trigger 1&lt;br /&gt;
attr voicetrigger1 alexaProactiveEvents 1&lt;br /&gt;
attr voicetrigger1 genericDeviceType contact&lt;br /&gt;
attr voicetrigger1 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;;open:CONTACT_NOT_DETECTED&lt;br /&gt;
attr voicetrigger1 readingList 0:closed 1:open&lt;br /&gt;
attr voicetrigger1 setList closed open&lt;br /&gt;
&lt;br /&gt;
set alexa add voicetrigger1&lt;br /&gt;
set alexa restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fehlersuche:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Push setzt ein intaktes Push-Token voraus. Sollte im Alexa-Logfile Folgendes erscheinen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;failed to refresh token: invalid_grant: &#039;The request has an invalid grant parameter : refresh_token&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
so ist das Push-Token nicht aktuell. Weil die Auswirkung lange nur war, dass Geräteänderungen nicht aktiv an Amazon gemeldet wurden, gibt es noch keine umfassende Analyse des Problems. Es lässt sich lösen, indem eine oder beide folgenden Aktionen ausgeführt werden:&lt;br /&gt;
* Löschen des &amp;quot;.eventToken&amp;quot; im Alexa-Device über &amp;quot;deletereading&amp;quot;&lt;br /&gt;
* &amp;quot;FHEM-Connector&amp;quot;-Skill auf &amp;quot;alexa.amazon.de&amp;quot; einmal deaktivieren und dann neu verbinden&lt;br /&gt;
&lt;br /&gt;
== Mögliche Probleme und Lösungen ==&lt;br /&gt;
&lt;br /&gt;
Es kann vorkommen, dass Geräte zwar korrekt erkannt werden, aber das durch Alexa erkannte Kommando nicht richtig umgesetzt wird (Beispiel - mittlerweile behoben: {{Link2Forum|Topic=96766}}). Neben dem FHEM-Log gibt es noch das Logfile, welches von alexa-fhem angelegt wird. &lt;br /&gt;
&lt;br /&gt;
=== Fehlersuche über die FHEM-Oberfläche ===&lt;br /&gt;
&lt;br /&gt;
* alexa-fhem Logfile anschauen (Detail-Ansicht des &amp;lt;alexa&amp;gt;-Device aufrufen, klick auf &#039;&#039;&#039;Logfile&#039;&#039;&#039; oben)&lt;br /&gt;
* alexa-fhem im Debug-Modus aufrufen:&lt;br /&gt;
** -D zum alexaFHEM-params attribut hinzufügen&lt;br /&gt;
** Alexa-Befehl auslösen&lt;br /&gt;
** -D aus dem alexaFHEM-params attribut entfernen&lt;br /&gt;
* Die notwendigen Informationen finden sich in dem alexa-Logfile (siehe oben)&lt;br /&gt;
&lt;br /&gt;
=== Fehlersuche über Kommandozeile (lies: Shell) + FHEM-Oberfläche ===&lt;br /&gt;
&lt;br /&gt;
:* set &amp;lt;alexa&amp;gt; stop (FHEM-Oberfläche)&lt;br /&gt;
:* Auf der Kommandozeile &amp;lt;code&amp;gt;alexa-fhem -D -c /opt/fhem/alexa-fhem.cfg &amp;gt; debug.log&amp;lt;/code&amp;gt; starten (dadurch wird die Datei debug.log erzeugt im aktuellen Verzeichnis)&lt;br /&gt;
:* Alexa-Befehl auslösen&lt;br /&gt;
:* alexa-fhem auf der Kommandozeile wieder stoppen (CTRL-C)&lt;br /&gt;
:* set &amp;lt;alexa&amp;gt; start (FHEM-Oberfläche)&lt;br /&gt;
&lt;br /&gt;
Die Datei debug.log sollte Hinweise enthalten, wie das Problem zu lösen ist oder Dich zumindest in die richtige Richtung schieben.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel aus dem Forum fand sich in dem Logfile der Hinweis darauf, dass das Device mit falschen min/max-Werten unterwegs war.&lt;br /&gt;
&lt;br /&gt;
=== Registrierungskey vergessen, Registrierung zurücksetzen ===&lt;br /&gt;
&lt;br /&gt;
Auf der Kommandoshell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de status&lt;br /&gt;
Registered.&lt;br /&gt;
Registered on 2019-01-13T15:38:13Z.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
heisst, das der Vereinsserver eigentlich alles hat, was er will. Es wird kein neuer Schlüssel generiert.&lt;br /&gt;
Wenn Du die Situation zurücksetzen möchtest, wäre die hässliche Methode, Deinen SSH-Key zu löschen. Eleganter ist, die Registrierung auf Vereinsseite zu löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de unregister&lt;br /&gt;
Your registration has been removed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
löscht Deinen Schlüssel mitsamt allen dort gespeicherten Daten auf Vereinsseite. Bei Restart von alexa-fhem in FHEM-WEB wird jetzt ein neuer Registrierungskey angefordert.&lt;br /&gt;
&lt;br /&gt;
== Sicherheitskonzept und Secrets ==&lt;br /&gt;
&lt;br /&gt;
Um diesen Abschnitt zu verstehen, solltest Du den Abschnitt &amp;quot;Arbeitsweise&amp;quot; im Kopf haben. Einerseits ist Dir vermutlich einleuchtend, dass ein Server, der per SSH rückwärts nur ausgewählte Kommandos in den Tunnel, den Du aufgebaut hast, leitet, &amp;quot;irgendwie sicherer&amp;quot; ist. Andererseits möchte man nicht blind vertrauen.&lt;br /&gt;
&lt;br /&gt;
=== SSH ===&lt;br /&gt;
==== SSH - macht das nichts Gefährliches? ====&lt;br /&gt;
SSH ist ein Veteran des Internet und entstand, um sich sicher (verschlüsselt) und schnell auf Servern einzuloggen. Schon früh wurde dabei der sogenannte &amp;quot;Reverse-Tunnel&amp;quot; implementiert: Also der vom Client (Deinem Rechner) geäußerte Wunsch: &amp;quot;Bitte leite mir Requests, die bei Dir, Server, auf Port xy eingehen, an meinen lokalen Port yz weiter.&amp;quot;. Dieses Verfahren implementiert der Reverseproxy, wobei tatsächlich auf dem Server für Dich kein echter Port geöffnet wird.&lt;br /&gt;
&lt;br /&gt;
Wie Dir ggf. sicher der Unix-Guru Deines Vertrauens bestätigen wird: Die Kombination&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
ssh -R 1234:localhost:&amp;lt;zufälliger port&amp;gt; zielserver &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
erlaubt keine Ausführung von Shell-Kommandos auf Deinem Server, sondern einzig, dass vom SSH-Programm Verbindungen zu einem lokalen Port auf Deinem Server auf dem alexa-fhem lauscht aufgebaut werden. Du kannst also z.B. mit einem&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo /usr/sbin/tcpdump -X -s 0 -i lo port &amp;lt;zufälliger port&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
vollständig überwachen (oder ggf. permanent aufzeichen), was auf Deinem Server von außen gesteuert passiert.&lt;br /&gt;
&lt;br /&gt;
==== Wie wird bei SSH verschlüsselt? ====&lt;br /&gt;
Im Prinzip wie im Web auf SSL-Seiten, teils mit den gleichen Verschlüsselungsverfahren. Allerdings arbeitet SSH eher wie das im Web recht seltene Verfahren: Bei jeder Verbindung übermitteln sowohl Server wie auch Client den öffentlichen Teil ihres Schlüssels. Anders als im Web wird der Schlüssel aber nicht von einer öffentlichen Zertifizierungsstelle wie &amp;quot;LetsEncrypt&amp;quot; unterschrieben. Stattdessen entscheiden Server wie Client beim ersten Verbindungsaufbau typischerweise per manueller Frage: &amp;quot;Willst Du jetzt und künftig diesem Schlüssel vertrauen?&amp;quot; Bei der Installation wird diese Frage für Deine Seite bejaht, und fortan wird der öffentliche Schlüssel des FHEM-Servers auf Deinem Rechner gespeichert. Ab da bist Du z.B. davor sicher, dass jemand den DNS-Eintrag verbiegt oder sich in den Datenfluss Deines Providers einhängt: Ein geänderter Serverschlüssel würde bemerkt werden.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Soweit klar? Aus Deinem öffentlichen Schlüssel wiederum leitet der Server her: &amp;quot;Das ist definitiv wieder derjenige, der sich damals &amp;quot;registriert&amp;quot; hat&amp;quot;. Und an dieser Stelle kann ich auch den &amp;lt;b&amp;gt;ersten Teil des 3-teiligen Registrierungskeys&amp;lt;/b&amp;gt; erläutern: Die typischerweise 6-stellige Hex-Zahl am Anfang ist der Java-Hashcode Deines öffentlichen Schlüssel. Sie ist damit sozusagen Deine aus Deinem öffentlichen Schlüssel abgeleitete Benutzer-ID.&lt;br /&gt;
&lt;br /&gt;
=== Die Rolle der Secrets ===&lt;br /&gt;
Wenn jetzt klar ist, dass die Verbindung zum Vereinsserver sicher und vertauschungsfrei funktioniert, bleiben noch 2 Probleme zu lösen:&lt;br /&gt;
1) Im Web bei der Skill-Aktivierung musst Du beweisen, dass Du der Mensch am Browser bist, dem der SSH-Tunnel von IP xy mit dem öffentlichen Schlüssel X gehört. Bei der automatischen Registrierung werden lokal auf Deinem Rechner zwei 64-Bit-Secrets generiert:&lt;br /&gt;
* Das &amp;lt;b&amp;gt;Anmelde&amp;lt;/b&amp;gt;-Secret&lt;br /&gt;
* Das &amp;lt;b&amp;gt;Bearer&amp;lt;/b&amp;gt;-Token&lt;br /&gt;
Beim Anmelden des SSH-Keys auf dem öffentlichen Server wird nun der &amp;lt;b&amp;gt;Hashwert&amp;lt;/b&amp;gt; des ersten Secrets übertragen und dort in Verbindung mit Deinem öffentlichen Schlüssel gespeichert. Ein Hashwert bedeutet, dass (sofern das Verfahren, hier SHA256, funktioniert), niemand aus dem Hash das Secret zurückrechnen kann. Ein Datenbankklau auf dem Server gefährdet also nicht die Sicherheit Deines Passwortes.&lt;br /&gt;
&lt;br /&gt;
Wenn Du nun beim Skill-Aktivieren den Registrierungskey eingibst, dann &amp;quot;sieht&amp;quot; der Server zum ersten Mal Dein ausgewürfeltes Secret, vergleicht es mit dem Hashwert und wird es anschließend wieder umgehend vergessen. Anhand des Hashwertes kann der Server aber entscheiden, dass Du der legitime Nutzer zum öffentlichen Schlüssel XY bist.&lt;br /&gt;
&lt;br /&gt;
2) Das zweite Problem ist: Wie soll Amazon &amp;quot;beweisen&amp;quot;, dass sie der legitime Aufrufer sind? Amazon erhält binnen wenigen Sekunden nach dem Klick auf &amp;quot;Activate Skill&amp;quot; den &amp;lt;b&amp;gt;dritten Teil&amp;lt;/b&amp;gt; des Registrierungskeys als sogenanntes Bearer-Token. Zwar läuft er durch den Registrierungsserver, er wird dort, auf dem Registrierungs/Vereinsserver aber nicht gespeichert. Das Bearer-Token wird von Amazon bei allen Requests zu Deinem Server mitgesendet. Da es am Anfang zusätzlich Deine &amp;quot;User-ID&amp;quot; enthält, weiß der Vereinsserver, zu welchem SSH-Tunnel der Request zu senden ist. Aber lokal auf Deinem Rechner wird ausgewertet, ob das Token &amp;quot;stimmt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== alexa-fhem Updaten bzw. &amp;quot;Upgraden&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Updaten einer &amp;quot;Connector&amp;quot; Installation:&#039;&#039;&#039;&lt;br /&gt;
* alexa-fhem über FHEM anhalten (Name des Alexa-Device: alexa):&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;set alexa stop&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Auf der Konsole wie anfangs bei der Installation:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo npm update -g alexa-fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Manchmal hat npm Probleme mit einem Update. Dann einfach die aktuelle Version noch mal drüber Installieren: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo npm install -g alexa-fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*alexa-fhem über FHEM wieder starten:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;set alexa start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Upgraden von einer &amp;quot;Nicht-Connector&amp;quot; Installation (z.B. manuelle Installation per pm-Download):&#039;&#039;&#039;&lt;br /&gt;
* Daten der aktuellen Installation sichern (v.a. config.json / man weiß ja nie)&lt;br /&gt;
* Autostart der aktuellen alexa-fhem Installation deaktivieren:&lt;br /&gt;
** Bei initd: Service deaktivieren mittels: &amp;lt;code&amp;gt;sudo update-rc.d -f alexa remove&amp;lt;/code&amp;gt; Vorher mittels stoppen: &amp;lt;code&amp;gt;sudo service alexa stop&amp;lt;/code&amp;gt; Startscript unter /etc/init.d/ löschen.&lt;br /&gt;
** Bei systemd: Service deaktivieren mittels: &amp;lt;code&amp;gt;sudo systemctl disable alexa&amp;lt;/code&amp;gt; Vorher mittels stoppen: &amp;lt;code&amp;gt;sudo systemctl alexa stop&amp;lt;/code&amp;gt; Startscript unter /etc/systemd/system/ löschen.&lt;br /&gt;
* ALLE vorhandenen alexa-fhem Daten LÖSCHEN! Bleiben Dinge zurück und wird dann laut Connector installiert kann es zu Problemen kommen!&lt;br /&gt;
* (reboot)&lt;br /&gt;
* Installation von alexa-fhem laut Anleitung (Beginn dieses Wiki)&lt;br /&gt;
* Falls eigene Dinge von früher genutzt werden wollen/sollen (z.B. Custom Skill), dann die entsprechenden Einträge aus der gesicherten config.json in die neu angelegte alexa-fhem.cfg (zu finden unter &amp;quot;Edit files&amp;quot;) übernehmen.&lt;br /&gt;
* Werden keine eigenen Dinge verwendet, dann kann der Port (Standard: 3000) geschlossen werden und auch die Daten unter Amazon-Developer können gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
== Bug- und Wunschliste ==&lt;br /&gt;
* Ist beim Start keine Internetverbindung vorhanden, erfolgt kein Retry -- alexa-fhem muss restartet werden (ssh_autoconfig wertet keine temporären Fehler aus)&lt;br /&gt;
&lt;br /&gt;
==Weitergehende Informationen==&lt;br /&gt;
*[[Alexa und Mappings]]&lt;br /&gt;
*[[Alexa Tipps und Kniffe]]&lt;br /&gt;
*[[FHEM Connector for Amazon Alexa]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_Connector_f%C3%BCr_Amazon_Alexa&amp;diff=33325</id>
		<title>FHEM Connector für Amazon Alexa</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_Connector_f%C3%BCr_Amazon_Alexa&amp;diff=33325"/>
		<updated>2020-06-01T18:24:22Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Geräte im FHEM-Webfrontend zuweisen */Link korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&#039;&#039;&#039;Alexa FHEMlazy&#039;&#039;&#039; war historisch ein Fork des Original [[Alexa-Fhem|alexa-fhem]], der im Januar 2019 mit dem Original zusammengeführt wurde und nun als &#039;&#039;&#039;FHEM Connector&#039;&#039;&#039; verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
Er ermöglicht innerhalb von Minuten die Verknüpfung von FHEM mit einem Amazon Echo Gerät. Auch Geräte anderer Hersteller mit verbauten Mikrofonen und Alexa-Sprachassistenten-Unterstützung sollten problemlos funktionieren. Für folgende Geräte ist dies bspw. der Fall (Falls Ihr andere/weitere Gerätemodelle bzw. Hersteller in Verwendung habt, bitte hier pflegen):&lt;br /&gt;
&lt;br /&gt;
* SONOS Beam und SONOS One   &lt;br /&gt;
&lt;br /&gt;
Gegenüber dem klassischen Ansatz ergeben sich Einschränkungen, so läuft die Software normalerweise unter dem gleichen Benutzer wie FHEM auf dem gleichen Server, und es wird z.Zt. nur der Smarthome-Skill unterstützt (die Variante, bei der die Möglichkeiten der Interaktion von Amazon festgelegt wurden).&lt;br /&gt;
Dafür ist weder ein Developer-Account bei Amazon, eigene Lambda- und Skillfunktionen, noch das Öffnen eines eingehenden Ports aus dem Internet nötig. &lt;br /&gt;
* Die Software integriert einen Installer, der die Erstkonfiguration und Anmeldung übernimmt&lt;br /&gt;
* Die Kommunikation zur Software auf dem heimischen Rechner und dann zu FHEM verläuft über SSH und einen vom FHEM-Verein gehosteten Server&lt;br /&gt;
* Funktioniert mit IPv4, IPv6, echtem Dual Stack und DS-Lite&lt;br /&gt;
* Als Skill bei Amazon wird der Skill &amp;quot;FHEM Connector&amp;quot; verwendet.&lt;br /&gt;
&lt;br /&gt;
Der Thread im Forum zur Software ist hier: {{Link2Forum|Topic=94817}}.&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einfache Anbindung von FHEM an Amazon Assistent Alexa&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=alexa&lt;br /&gt;
|ModTechName=39_alexa.pm / alexa-fhem&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModOwner=gvzdus, André/ justme1968 ({{Link2FU|430|Forum}} / [[Benutzer Diskussion:Justme|Wiki]])&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
&lt;br /&gt;
===Arbeitsweise und Datenfluss===&lt;br /&gt;
Vorläufig ist alexa-fhem im &amp;quot;FHEM Connector-Modus&amp;quot; ein reiner [https://developer.amazon.com/de/docs/smarthome/understand-the-smart-home-skill-api.html SmartHome-Skill].&lt;br /&gt;
SmartHome-Skills erhalten weder die Sprachdaten selber noch das, was Amazon in Textform verstanden hat, sondern vielmehr extrahiert Amazon aus dem verstandenen Text Anweisungen und Abfragen für Geräte, die dann an den Skill übermittelt werden. Charmant ist dabei, dass unmittelbar gefragt werden kann &amp;quot;Alexa, wie ist die Temperatur im Wohnzimmer?&amp;quot;, während andere Skills zunächst explizit angesprochen werden müssen (&amp;quot;Alexa, frage FHEM nach der Temperatur im Wohnzimmer&amp;quot;). Außerdem kann der Nutzer mehrere Smarthome-Skills installieren, und die Geräte werden zu einer Gesamtmenge zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Gehen wir den Datenfluss bei der konkreten Frage &amp;quot;Wie ist die Temperatur im Wohnzimmer?&amp;quot; durch:&lt;br /&gt;
* Alexa hat bei der Skillinstallation gelernt, dass &amp;quot;FHEM Connector&amp;quot; bei Dir einen Thermostaten im Raum Wohnzimmer kennt. Dadurch wird bei der Sprachanalyse von &amp;quot;Alexa Voice Service&amp;quot; in der Cloud erkannt, dass eine Abfrage an &amp;quot;FHEM Connector&amp;quot; erfolgversprechend ist.&lt;br /&gt;
* Zunächst wird die zentrale &amp;quot;Lambda-Funktion&amp;quot; von &amp;quot;FHEM Connector&amp;quot; aufgerufen. Die Funktion leitet aber im Kern nur den Request unverändert an den vom Verein bereitgestellten Server weiter. Im Request enthalten ist ein Token, das sogenannte &amp;quot;Bearer-Token&amp;quot;.&lt;br /&gt;
* Der &amp;quot;Vereinsserver&amp;quot; prüft anhand dieses Tokens, ob es überhaupt bekannt ist, und zu welchem Nutzer es gehört. Ist dieser Nutzer verbunden, wird der Request wiederum quasi unverändert an den Nutzer weitergeleitet.&lt;br /&gt;
* Diese Weiterleitung passiert über einen sogenannten SSH-Reverse-Tunnel, der von Deiner Seite und der Software auf dem FHEM-Tunnel automatisch aufgebaut wird.&lt;br /&gt;
* Auf Deiner Seite läuft die eigentliche Software, und zwar unter nodeJS. nodeJS ist ein Javascript ausführender Miniserver, der lokal auf einem Zufallsport auf Requests &amp;quot;lauscht&amp;quot;. In der Original-Version  [[Alexa-Fhem|Alexa FHEM]] kommen die Requests aus dem Internet (hoffentlich von der eigenen Lambda-Funktion), hier bei &amp;quot;FHEM Connector&amp;quot; kommen sie ausschließlich aus dem SSH-Tunnel von lokal.&lt;br /&gt;
* Die Software validiert nun diesen Request anhand des Bearer-Tokens. Konkret wird dabei das bei der Installation generierte Token, dass bei der Skill-Aktivierung an Amazon übertragen wurde, mit dem lokal gespeicherten Wert verglichen. Stimmt das Token, wird der Befehl verarbeitet, üblicherweise wird hierbei ein Aufruf an die Webschnittstelle von FHEM abgesetzt.&lt;br /&gt;
* FHEM führt den Befehl aus&lt;br /&gt;
&lt;br /&gt;
Hört sich langsam und kompliziert an? Kompliziert: Okay. Langsam eher nicht, in etlichen Fällen liegt die Gesamtantwortszeit unter 200 ms.&lt;br /&gt;
&lt;br /&gt;
Soweit ein erster Überblick über die Datenflüsse. Im Abschnitt Sicherheit ist das Konzept der Absicherung deutlich genauer und ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
Du wirst bei der Installation zuerst auf der Kommandozeile auf Deinem Raspberry (o.ä.) unterwegs sein, anschließend im Webfrontend von FHEM, und zum Schluss auf der Alexa-Konsole im Web.&lt;br /&gt;
&lt;br /&gt;
===node.js installieren===&lt;br /&gt;
&lt;br /&gt;
Ab Jessy liegt NodeJS bereits in einer ausreichend aktuellen Version vor (Stretch und Buster funktionieren ebenfalls). Mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install nodejs npm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kannst Du es installieren. Mit &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
node --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
erfährst Du die aktuelle Version - wenn hier etwas mit &amp;quot;8&amp;quot; oder höher vorneweg erscheint, ist alles gut.&lt;br /&gt;
Ansonsten suche Dir bitte eine Anleitung im Web, wie Du NodeJS auf Deinem System auf einen aktuellen Stand bringen kannst.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-FHEM installieren ===&lt;br /&gt;
&lt;br /&gt;
Nun installieren wir Alexa-fhem aus dem offiziellen Repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo npm install -g alexa-fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Vorgang benötigt etwas Zeit.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-FHEM aktivieren ===&lt;br /&gt;
&lt;br /&gt;
Wechsele jetzt in FHEM-Web!&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass das Alexa-Modul in der Version ab Januar 2019 vorliegt. Dafür bitte einmal FHEM aktualisieren:&lt;br /&gt;
Speichern der Config nicht vergessen, und&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
update&lt;br /&gt;
shutdown restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alles, was jetzt noch nötig ist, ist das Anlegen eines Alexa-Devices. Gib dafür in der FHEM-Web-Kommandozeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
define alexa alexa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
an. Nun läuft, während Du bereits das neu angelegte Alexa-Devices siehst, ein komplexer Prozess im Hintergrund:&lt;br /&gt;
&lt;br /&gt;
* Falls noch kein SSH-Key für den Benutzer, unter dem FHEM läuft, existiert, wird einer generiert&lt;br /&gt;
* Es wird ein Secret-Key im Prozess generiert, dass den Server nicht verlässt, und der Skillanmeldung dient.&lt;br /&gt;
* Du wirst auf dem Server &amp;quot;va-fhem.fhem.de&amp;quot; des FHEM-Vereins mit dem SSH-Key angemeldet, und der Hash-Wert Deines Secret-Key dort abgelegt.&lt;br /&gt;
&lt;br /&gt;
Und wenn Du diese Sätze gelesen hast, sollte inzwischen sich das Alexa-Device in FHEM-Web aktualisiert haben, und &lt;br /&gt;
ungefähr so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alexa-Device-2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Status für alexa-fhem und der Proxyverbindung ist wichtig, dass diese beiden Zeilen beim Reload aufgetaucht sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
alexaFHEM.bearerToken crypt:...&lt;br /&gt;
alexaFHEM.skillRegKey crypt:...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ja, und diesen Schlüssel benötigst Du wirklich! Also am besten schon einmal mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
get &amp;lt;alexa&amp;gt; proxyKey&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in Klartext anzeigen lassen und in ein Editor-Fenster dauerhaft wegsichern.&lt;br /&gt;
&lt;br /&gt;
Jetzt solltest Du Dein Alexa-Device nicht mehr löschen, denn das im Reading angezeigte &amp;quot;bearerToken&amp;quot; zu löschen bedeutet, dass die Software die Zugriffe von nicht mehr überprüfen kann und keine Kommandos mehr funktionieren. In diesem Fall hilft nur die Neuinstallation des Skills.&lt;br /&gt;
&lt;br /&gt;
==== Fehler bei der Aktivierung ====&lt;br /&gt;
&lt;br /&gt;
Während kompliziertere Fehlerfälle im Abschnitt &amp;quot;Mögliche Probleme und Lösungen&amp;quot; behandelt werden, hier häufige Fälle, warum die kryptischen Zeilen nicht auftauchen:&lt;br /&gt;
&lt;br /&gt;
* Zuerst bitte einfach einmal die Seite neu laden.&lt;br /&gt;
&lt;br /&gt;
===== 401: Authorization Required =====&lt;br /&gt;
&lt;br /&gt;
Wenn Du FHEM-Web mit einem User/Passwort-Schutz versehen hast, wirst du folgende Fehlermeldung sehen: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
alexaFHEM stopped; failed to connect to fhem: 401: Authorization Required&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Regel musst du die Angaben User/Passwort noch einmal explizit setzen. Im Attribute-Abschnitt &amp;quot;alexaFHEM-auth&amp;quot; auswählen, User/Passwort mit &amp;quot;:&amp;quot; getrennt angeben und &amp;quot;attr&amp;quot; anklicken. alexa-fhem wird automatisch neu gestartet. Hier das Ganze in der Text-Variante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
attr alexa alexaFHEM-auth user:pass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Permission denied =====&lt;br /&gt;
&lt;br /&gt;
Wenn du folgende Fehlermeldungen im Alexa Logfile siehst, wurde das Verzeichnis &amp;quot;/opt/fhem/.ssh/&amp;quot; von dir bei der Arbeit mit &amp;quot;root&amp;quot; oder &amp;quot;sudo&amp;quot; mit den falschen Berechtigungen versehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
[2019-7-25 11:59:12] sshautoconf: aborted with ssh-keygen returned error - key_save_private: Permission denied&lt;br /&gt;
[2019-7-25 11:59:12] *** SSH: proxy configuration failed: ssh-keygen returned error - key_save_private: Permission denied&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prüfen kannst du die Berechtigungen mit folgendem Befehl auf der Shell-Konsole: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
ls -l /opt/fhem/.ssh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Du solltest dann folgende Ausgabe erhalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
insgesamt 12&lt;br /&gt;
-rw------- 1 fhem dialout 1675 Jul 12 13:10 id_rsa&lt;br /&gt;
-rw-r--r-- 1 fhem dialout  391 Jul 12 13:10 id_rsa.pub&lt;br /&gt;
-rw-r--r-- 1 fhem dialout  884 Jul 12 13:10 known_hosts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Steht in der Ausgabe nicht &amp;quot;fhem dialout&amp;quot; (dein fhem User), sondern bspw. &amp;quot;root root&amp;quot;, dann bspw. mit folgendem Befehl an deinen fhem User anpassen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
chown fhem:dialout /opt/fhem/.ssh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem ersten Befehl &amp;quot;ls -l ...&amp;quot; kannst du dann nochmal prüfen, ob die Berechtigungen korrekt übernommen wurden. &lt;br /&gt;
&lt;br /&gt;
===== weitere Prüfungen =====&lt;br /&gt;
&lt;br /&gt;
Hast Du noch die Shell-Konsole offen? Dann prüfe bitte noch einmal auf der Konsole, ob nun zwei Prozesse laufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
ps -ef | egrep &#039;(alexa|ssh)&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sollte Dir idealerweise so etwas anzeigen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
fhem     31322     1 99 13:56 ?        00:00:03 alexa                              &lt;br /&gt;
fhem     31332 31322  8 13:56 ?        00:00:00 /usr/bin/ssh -R 1234:127.0.0.1:&amp;lt;zufälliger port&amp;gt; -oServerAliveInterval=90 -p 58824 fhem-va.fhem.de&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;alexa&amp;quot; ist dabei der Node-JS-Prozess, der ssh-Prozess ist die aufgebaute Verbindung zum Vereinsserver.&lt;br /&gt;
&lt;br /&gt;
Wenn Du diese Prozesse &#039;&#039;&#039;nicht&#039;&#039;&#039; siehst oder das Alexa-Device keinen Registrierungskey anzeigt, dann ist leider der Start nicht glatt verlaufen.&lt;br /&gt;
&lt;br /&gt;
Im Logfile (über den link &amp;lt;code&amp;gt;Logfile&amp;lt;/code&amp;gt; in der Detail-Ansicht über &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;, oder über den Namen bei &#039;&#039;currentlogfile&#039;&#039; in den Internals) findest Du idealerweise selber Hinweise, wo es hakt, oder kannst im Forum nachfragen.&lt;br /&gt;
&lt;br /&gt;
=== Geräte im FHEM-Webfrontend zuweisen ===&lt;br /&gt;
Um das Aha-Erlebnis zu vergrößern, ist jetzt ein guter Zeitpunkt, 1 oder besser mind. 2 Geräte für den Alexa-Dienst zuzuweisen. Von Haus aus wird keines Deiner FHEM-Geräte automatisch Alexa zugewiesen!&lt;br /&gt;
&lt;br /&gt;
Wähle die Geräte aus, rufe sie auf und setze das Attribut &amp;quot;alexaName&amp;quot;. Hierbei in Kürze nur der Hinweis:&lt;br /&gt;
* Keine Angst vor Leerzeichen und Umlauten, funktioniert.&lt;br /&gt;
* Große Angst vor Rechtschreibfehlern (Terrasse, Rollladen) oder komplizierten Wörtern &amp;quot;handgebastelte Martinslaterne im Kinderzimmer Iphigenie-Chantal&amp;quot;.&lt;br /&gt;
* Mehrere Namen für dasselbe Gerät/Device in fhem werden unterstützt. Mehrere Namen werden durch Strichpunkt getrennt &amp;lt;ref&amp;gt;Feature nicht dokumentiert {{Link2Forum|Topic=74041|LinkText=Forumsthread}} &amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Das Attribut &amp;quot;alexaRoom&amp;quot; ist NUR FÜR DEN CUSTOM SKILL relevant. Ausnahme: structure und LightScene Devices, siehe: [[FHEM_Connector_f%C3%BCr_Amazon_Alexa#Was_geht_alles_.3F]].&lt;br /&gt;
&lt;br /&gt;
Lade die Geräte neu in die Software, indem Du &amp;lt;code&amp;gt;set &amp;lt;alexa&amp;gt; restart&amp;lt;/code&amp;gt; ausführst!&lt;br /&gt;
[[Datei:HowToSet alexaName.png|alternativtext=How to set alexaName|ohne|mini|Wie setzt man das Attribut alexaName]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen (weil oft gestellte Fragen im Forum) bzgl. Erkennung von Geräten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Wichtig ist, dass die Filtereinstellung in der alexa-fhem.cfg (zu finden unter &amp;quot;Edit Files&amp;quot;) passt.&lt;br /&gt;
Das, was dort eingetragen ist (Standard: alexaName=..* / also es ist ein alexaName vergeben) auch an den entsprechenden Devices in fhem vorhanden ist.&lt;br /&gt;
Stimmt das nicht überein, kann alexa-fhem keine Devices von fhem abfragen/finden.&lt;br /&gt;
Ob der Filter entsprechend funktioniert kann man wie folgt testen: &#039;&#039;list Filtereinstellung&#039;&#039; beispiel mit Standardfilter: &#039;&#039;list alexaName=..*&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Hat alexa-fhem per Filter Devices aus fhem &amp;quot;gefunden&amp;quot;, geht es weiter mit der &amp;quot;Erkennung&amp;quot;. Also um welches Device (Typ und &amp;quot;Fähigkeiten&amp;quot;) handelt es sich. Dazu gilt folgendes:&lt;br /&gt;
** sind entsprechende Readings beim Device vorhanden (z.B. temperature, state mit on/off, ...) erkennt das alexa-fhem automatisch. Die Liste der automatisch erkannten Readings wächst ständig. Daher erst mal schauen ob das Device bereits entsprechend erkannt (typisiert) wurde. Das kann durch prüfen des alexa-fhem-Logs geschehen (NICHT fhem-log!).&lt;br /&gt;
** sind entsprechende &amp;quot;set-Befehle&amp;quot; erkennbar (oft auch durch Readings). Also ist beispielsweise (wie beim Dummy nötig) ein &#039;&#039;setList&#039;&#039; mit entsprechenden Einträgen vorhanden oder entsprechende Readings, z.B. desired-temp zum Stellen der Temperatur etc.&lt;br /&gt;
** wird das Device nicht richtig oder &amp;quot;unvollständig&amp;quot; erkannt helfen folgende Attribute:&lt;br /&gt;
*** genericDeviceType: hiermit kann alexa-fhem in die gewünschte Richtung &amp;quot;geschubbst&amp;quot; werden. Anmerkung: man kann nicht alles erzwingen, Readings bzw. set-Befehle müssen passen (oder per homebridgeMapping passend gemacht werden). Wenn ein genericDeviceType nicht per &amp;quot;Drop-Down&amp;quot; erscheint, dann kann er auch (wenn bekannt) einfach per WEB-cmd eingegeben werden: &#039;&#039;attr Devicename genericDeviceType media&#039;&#039;&lt;br /&gt;
*** homebridgeMapping: hierdurch kann alexa-fhem bei der Erkennung von Zuständen und möglichen Einstellungen (also WAS kann das Device) unterstützt werden. Mittels homebridgeMapping können vorhandene Readings (Zustände) auf für alexa-fhem bekannte Zustände gemappt werden. Ebenso können damit Standard-fhem-Kommandos von alexa-fhem auf Device-spezifische gemappt werden. Beispiel: on/off auf Ein/Aus (falls das Device statt on/off eben ein Ein/Aus erwartet). Zum Beispiel: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;thermostat&amp;gt; homebridgeMapping TargetTemperature=target::target,minValue=18,maxValue=25,minStep=0.5 CurrentTemperature=myTemp:temperature&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; [https://github.com/justme-1968/homebridge-fhem/blob/master/README.md weitere Beispiele]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&#039;&#039;&#039;Mehrere Namen für dasselbe Gerät/Device in fhem sind möglich.&#039;&#039;&#039;&amp;lt;/br&amp;gt;&lt;br /&gt;
Die Namen werden durch Strichpunkt getrennt.&amp;lt;/br&amp;gt;&lt;br /&gt;
Beispiel:&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;attr dmLampe alexaName Lichtkuppel;Lichtkugel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung bzgl. genericDeviceType und homebridgeMapping:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* diese Attribute werden von verschiedenen &amp;quot;Sprachsteuerungsmodulen&amp;quot; in fhem verwendet (homebridge [dort wurde es &amp;quot;erfunden&amp;quot;], alexa-fhem, gassistant, ...). Daher ist nicht jedes Mapping für alle &amp;quot;Dienste&amp;quot; verwendbar. Ausprobieren schadet aber nicht.&lt;br /&gt;
* ebenso kann man mit diesen Attributen (homebridgeMapping wird gerne so &amp;quot;missbraucht&amp;quot;) nichts erzwingen, was seitens Amazon/Alexa nicht unterstützt bzw. verstanden wird! D.h. zunächst ist zu prüfen, ob ein bestimmter (gewünschter) Sprachbefehl seitens Amazon/Alexa unterstützt wird! Aktuelles Beispiel (Stand Jan 2020): &amp;quot;Alexa, fahre den Rollo hoch/runter&amp;quot;. Da ist Amazon/Alexa gerade dabei etwas zu tun. Bislang wird das nicht unterstützt, also ist das auch mit einem entsprechenden homebridgeMapping nicht zu erzwingen! Was unterstützt wird kann man bei Amazon nachlesen: [https://developer.amazon.com/es-ES/docs/alexa/device-apis/list-of-interfaces.html]&lt;br /&gt;
&lt;br /&gt;
== Finale: Skill verknüpfen ==&lt;br /&gt;
Suche im WebFrontend oder der Alexa-App den Skill &amp;quot;FHEM Connector&amp;quot;. Für nicht-Mac/iOS Anwerder empfiehlt das WebFrontend (https://alexa.amazon.de) statt die App, damit Du den Anmeldeschlüssel auch bequem kopieren kannst.&lt;br /&gt;
&lt;br /&gt;
Wenn du noch nicht bei Amazon angemeldet bist, erwartet Amazon zunächst, dass Du Dich normal bei Amazon anmeldest.&lt;br /&gt;
&lt;br /&gt;
Sobald Du &amp;quot;FHEM Connector&amp;quot; aktivierst, öffnet sich ein Browser-Tab mit folgender Maske:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:FHEMlazy_login.png|240px]]&lt;br /&gt;
&lt;br /&gt;
Hier kopierst Du Deinen Anmeldeschlüssel (im Klartext!) hinein und klickst auf Check. Als glücklicher Mensch ist auf der folgenden Statusseite alles grün:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:FHEMlazy_check.png|240px]]&lt;br /&gt;
&lt;br /&gt;
Im Einzelnen wird hier geprüft, ob Du per SSH verbunden bist (und auch Deine IP zur Sicherheit angezeigt), ob der Reverse-Tunnel steht, ob nodeJS erreichbar ist und wie viele Geräte Alexa gleich finden sollte (in meinem Fall 22).&lt;br /&gt;
&lt;br /&gt;
Sollte etwas nicht grün sein und Du eine Idee zum Fixen haben, kannst Du mit &amp;quot;Retry&amp;quot; neue Versuche auslösen.&lt;br /&gt;
&lt;br /&gt;
Ist alles okay, klicke rechts den Button &amp;quot;Activate Skill&amp;quot;. Du springst damit wieder zurück zu Amazon, die Dir hoffentlich zur erfolgreichen Verknüpfung gratulieren.&lt;br /&gt;
&lt;br /&gt;
Amazon möchte nun unmittelbar die Gerätesuche starten, und unter SmartHome-Geräte sollten diese nun auftauchen.&lt;br /&gt;
&lt;br /&gt;
== Was geht alles ? ==&lt;br /&gt;
&lt;br /&gt;
* Geräte, die sich ein- und ausschalten lassen:&lt;br /&gt;
** Automatisch: Müssen &amp;lt;code&amp;gt;set on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set off&amp;lt;/code&amp;gt; Kommandos haben&lt;br /&gt;
** dummys müssen &amp;lt;code&amp;gt;setList&amp;lt;/code&amp;gt; mit on und off haben&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; switch bzw. light kann bestimmt werden ob es in alexa als Schalter oder Licht behandelt wird.&lt;br /&gt;
** Wenn die Set-Kommandos im FHEM Device anders benannt sind: homebridgeMapping On:cmdOn=&amp;lt;ein&amp;gt;,cmdOff=&amp;lt;aus&amp;gt; setzen&lt;br /&gt;
** Kommandos:&lt;br /&gt;
***Alexa, schalte &amp;lt;name&amp;gt; ein/aus&lt;br /&gt;
***Alexa, Licht an/aus&lt;br /&gt;
***Alexa, schalte &amp;lt;gruppe&amp;gt; ein/aus&lt;br /&gt;
* Geräte, die eine Temperatur messen&lt;br /&gt;
** Automatisch: Es muss ein Reading &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; thermometer&lt;br /&gt;
** Sonst: homebridgeMapping CurrentTemperature:reading=&amp;lt;reading&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Helligkeit sich ändern lässt&lt;br /&gt;
** Automatisch: wenn &amp;lt;code&amp;gt;dim&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Kommandos erkannt werden&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; light&lt;br /&gt;
** Über homebridgeMapping: Wenn &amp;lt;code&amp;gt;helligkeit&amp;lt;/code&amp;gt; das Reading für die aktuelle Helligkeit enthält und die Helligkeit mit &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; prozent xxx&amp;lt;/code&amp;gt; gesetzt wird, sieht das homebridgeMapping wie folgt aus: homebridgeMapping Brightness=helligkeit::prozent,minValue=0,maxValue=&amp;lt;maximalwert&amp;gt;&lt;br /&gt;
** Kommandos:&lt;br /&gt;
*** Alexa, mache &amp;lt;name&amp;gt; heller/dunkler&lt;br /&gt;
*** Alexa, Licht heller/dunkler&lt;br /&gt;
* Geräte, deren Farbe sich ändern lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Farbtemperatur sich ändern lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, bei denen sich eine Lautstärke einstellen lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, bei denen sich ein prozentualer Wert einstellen lässt&lt;br /&gt;
** Automatisch: wenn &amp;lt;code&amp;gt;dim&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Kommandos erkannt werden&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* elektrische Türschlösser&lt;br /&gt;
** &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;: lock&lt;br /&gt;
** homebridgeMapping mit LockCurrentState und LockTargetState&lt;br /&gt;
&lt;br /&gt;
* Thermostate&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; thermostate&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* structure Devices aus FHEM (ab alexa-fhem version 0.5.7)&lt;br /&gt;
** können mit &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene als Szene eingebunden werden&lt;br /&gt;
** über &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; kann der name um einen Ort ergänzt werden&lt;br /&gt;
** Szenen aus einer structure lassen sich ein- und ausschalten&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
&lt;br /&gt;
* LightScene Devices aus FHEM (ab alexa-fhem version 0.5.8)&lt;br /&gt;
** können mit &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene als Szenen eingebunden werden&lt;br /&gt;
** über &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; kann der name um einen Ort ergänzt werden&lt;br /&gt;
** Szenen aus einer LightScene lassen sich nur einschalten&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Kanal sich umschalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping ChannelController:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-channelcontroller.html#changechannel&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Playback status sich schalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping PlaybackController:playback,values=Play;Pause;Stop;Previous;Next&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-playbackcontroller.html#discovery&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Eingang sich umschalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping InputController:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;,values=HDMI+1;HDMI+2;XBOX&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-property-schemas.html#input&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Kontaktsensoren (ab alexa-fhem version 0.5.15)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; contact&lt;br /&gt;
** homebridgeMapping ContactSensorState:reading=&amp;lt;reading&amp;gt; oder CurrentDoorState:reading=&amp;lt;reading&amp;gt;&lt;br /&gt;
** Die Anzeige in der Alexa-App funktioniert sofort, die Abfrage per Sprache erst ab Version 0.5.27.&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Lautstärke sich ändern lässt (ab alexa-fhem version 0.5.24)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; speaker&lt;br /&gt;
** Automatisch: es muss ein Reading &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;mute&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** homebridgeMapping Volume:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt; Mute:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, die sich ein- (und optional) ausschalten lassen als Szene (ab alexa-fhem version 0.5.26)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene&lt;br /&gt;
** Automatisch: Müssen &amp;lt;code&amp;gt;set on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set off&amp;lt;/code&amp;gt; Kommandos haben&lt;br /&gt;
** homebridgeMapping On:reading=&amp;lt;reading&amp;gt;,cmdOn=&amp;lt;cmd&amp;gt;[,cmdOff=&amp;lt;cmd&amp;gt;]&lt;br /&gt;
** Hinweis: Fehlende Kommandos lassen sich mit cmdalias erzeugen&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
* Rollläden. Lange ein Problemthema, das nur mit &amp;quot;Schalte auf 0%, schalte auf 100% lief&amp;quot;. Wichtig: &amp;quot;alexa-fhem&amp;quot; ab Version 0.5.39 einsetzen. GenericDevice-Type auf &amp;quot;blind&amp;quot; setzen. Nach Restart von alexa-fhem und neuer Gerätesuche sollte folgendes funktionieren:&lt;br /&gt;
** &amp;quot;..., öffne &amp;lt;Name&amp;gt; ganz&amp;quot;&lt;br /&gt;
** &amp;quot;..., schließe &amp;lt;Name&amp;gt; komplett&amp;quot;&lt;br /&gt;
** &amp;quot;hoch&amp;quot; und &amp;quot;runter&amp;quot; (ohne &amp;quot;ganz&amp;quot; oder &amp;quot;komplett&amp;quot;) schalten jeweils nur einen bestimmten Prozentsatz hoch oder runter. Dieser kann mit &amp;lt;code&amp;gt;attr &amp;lt;name&amp;gt; homebridgeMapping TargetPosition:minStep=&amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt;geändert werden. Aber Achtung: In diesem Intervall kann dann auch nur noch ein absoluter Prozentwert per Sprache oder Slider eingestellt werden! Bei z.B. 25% würden 13% zu 25% aufgerundet, 12% zu 0% abgerundet werden.&lt;br /&gt;
* Kontaktsensoren (ab alexa-fhem version 0.5.47)&lt;br /&gt;
** Automatisch wenn ein Reading &amp;lt;code&amp;gt;motion&amp;lt;/code&amp;gt; vorhanden ist oder es sich um einen Zigbee bewgungsmelder an einer HUE oder deCONZ Bridge handelt&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; MotionSensor&lt;br /&gt;
** homebridgeMapping MotionDetected:reading=&amp;lt;reading&amp;gt;,values=&amp;lt;wert für bewgung&amp;gt;:1;&amp;lt;wert für keine bewegung&amp;gt;:0&lt;br /&gt;
&lt;br /&gt;
* Alarmmelder (noch nicht in Deutschland):&lt;br /&gt;
** genericDeviceType Security&lt;br /&gt;
** homebridgeMapping Alarm=&amp;lt;reading&amp;gt;[,type=[fireAlarm|waterAlarm|burglaryAlarm|carbonMonoxideAlarm]]&lt;br /&gt;
** wenn der type nicht angegeben wird ist fireAlarm der default&lt;br /&gt;
** automatisch werden 0, ok und alles was mit no anfängt als OK erkannt. alles andere gilt als ALARM.&lt;br /&gt;
&lt;br /&gt;
Es werden noch einige andere häufig verwendete Geräte (Homematic, hue,...) automatisch erkannt.&lt;br /&gt;
&lt;br /&gt;
to be continued ...&lt;br /&gt;
&lt;br /&gt;
In der [https://developer.amazon.com/docs/device-apis/list-of-interfaces.html List of Capability Interfaces] bei Amazon kann man sehen, welche Möglichkeiten das Smart Home Skill API aktuell in einzelnen Ländern bietet. Leider ohne die jeweiligen landessprachlichen Kommandos.&lt;br /&gt;
&lt;br /&gt;
=== Aktiv Routinen starten ===&lt;br /&gt;
Routinen (eine Funktionalität, die rein - genauso wie &amp;quot;Räume&amp;quot; - bei Amazon liegt und nicht von FHEM Connector beeinflusst wird) waren lange die ewige Antwort auf die Frage: &amp;quot;Meine Frau möchte aber &#039;&#039;&#039;Öffne Rollläden&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039; sagen&amp;quot;: In der Alexa-App gibt es im Menü den Punkt &amp;quot;Routinen&amp;quot;, und hier lässt sich eine gewisse Anzahl von Aktionen (unter optionalen Bedingungen) an ein Sprachkommando knüpfen.&lt;br /&gt;
&lt;br /&gt;
Neu: Routinen können inzwischen auch von Skills getriggert werden, und seit Version 0.5.47 (Februar 2020) auch von FHEM Connector. Das braucht niemand, um die Rollläden hochzufahren, denn das kann FHEM ja selber, aber um z.B. eine Ansage auf einem Alexa-Gerät zu triggern. Dafür gibt es auch das FHEM-Modul &amp;quot;echodevice&amp;quot;, aber es erfordert ein paar Klimmzüge. Mit dem aktiven Triggern von Routinen kann FHEM auslösen, dass Alexa ungefragt (!) Dinge wie &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Temperatur in der Tiefkühltruhe hat -16 Grad überschritten&amp;quot;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
in den Raum sagt. Also eine Alternative bzw. Ergänzung zu Alarmen / Erinnerungen per Telegram o.ä.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorgeschichte&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Die Smarthome-Skill-API von Amazon sah schon lange das &amp;quot;proactiveReporting&amp;quot; vor: Also z.B. die gemessene Temperatur nicht erst auf Anfrage hin zu übermitteln, sondern laufend aktiv zu pushen. Aber warum Daten an Amazon senden, wenn es dafür keinen Mehrwert gibt? Beim Öffnen z.B. des Thermostaten in der Alexa-App kommen ohnehin laufend Statusabfragen. Warum also einen Datenpool bei Amazon über die Haustemperatur aufbauen und Änderungen pushen, wenn es keinen Mehrwert dafür gibt? &lt;br /&gt;
&lt;br /&gt;
Inzwischen lassen sich (reale oder vermeintliche) Änderungen von &#039;&#039;Bewegungssensoren&#039;&#039; und &#039;&#039;Fensterkontakten&#039;&#039; als Startbedingung an Alexa-Routinen koppeln. Man kann in der Alexa-App (ggf. fiktive) Öffnen eines Fensterkontaktes an das Aufsagen eines freien Textes durch die Hausbutlerin knüpfen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Umsetzung&#039;&#039;&#039;:&lt;br /&gt;
* Jedes Alexa-Device, dessen Status aktiv zu Amazon gepusht werden soll, im Attribut &amp;quot;alexaProactiveEvents&amp;quot; mit einer &amp;quot;1&amp;quot; versehen. Per Default wird &#039;&#039;kein&#039;&#039; Gerät laufend aktiv zu Amazon gepusht!&lt;br /&gt;
* das geänderte Device einmal zu Amazon pushen &amp;quot;set &amp;lt;alexa&amp;gt; add &amp;lt;device&amp;gt;&amp;quot; (oder &#039;Alexa, suche neue Geräte&#039; murmeln)&lt;br /&gt;
* Das Gerät sollte jetzt beim Anlegen einer neuen Routine (&amp;quot;Neue Routine&amp;quot;, &amp;quot;Wenn Folgendes passiert&amp;quot;, &amp;quot;Smart Home&amp;quot;) als möglicher Triggerpunkt erscheinen.&lt;br /&gt;
&lt;br /&gt;
==== Dummygeräte: ====&lt;br /&gt;
Ein Dummydevice sollte einen Kontaktschalter oder Bewegungssensor simulieren, um dann in FHEM eine beliebige Bedingung als Trigger zu definieren, und eine freie Ansage in Alexa als Routine zu definieren. Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
define voicetrigger1 dummy&lt;br /&gt;
attr voicetrigger1 alexaName Trigger 1&lt;br /&gt;
attr voicetrigger1 alexaProactiveEvents 1&lt;br /&gt;
attr voicetrigger1 genericDeviceType contact&lt;br /&gt;
attr voicetrigger1 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;;open:CONTACT_NOT_DETECTED&lt;br /&gt;
attr voicetrigger1 readingList 0:closed 1:open&lt;br /&gt;
attr voicetrigger1 setList closed open&lt;br /&gt;
&lt;br /&gt;
set alexa add voicetrigger1&lt;br /&gt;
set alexa restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fehlersuche:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Push setzt ein intaktes Push-Token voraus. Sollte im Alexa-Logfile Folgendes erscheinen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;failed to refresh token: invalid_grant: &#039;The request has an invalid grant parameter : refresh_token&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
so ist das Push-Token nicht aktuell. Weil die Auswirkung lange nur war, dass Geräteänderungen nicht aktiv an Amazon gemeldet wurden, gibt es noch keine umfassende Analyse des Problems. Es lässt sich lösen, indem eine oder beide folgenden Aktionen ausgeführt werden:&lt;br /&gt;
* Löschen des &amp;quot;.eventToken&amp;quot; im Alexa-Device über &amp;quot;deletereading&amp;quot;&lt;br /&gt;
* &amp;quot;FHEM-Connector&amp;quot;-Skill auf &amp;quot;alexa.amazon.de&amp;quot; einmal deaktivieren und dann neu verbinden&lt;br /&gt;
&lt;br /&gt;
== Mögliche Probleme und Lösungen ==&lt;br /&gt;
&lt;br /&gt;
Es kann vorkommen, dass Geräte zwar korrekt erkannt werden, aber das durch Alexa erkannte Kommando nicht richtig umgesetzt wird (Beispiel - mittlerweile behoben: {{Link2Forum|Topic=96766}}). Neben dem FHEM-Log gibt es noch das Logfile, welches von alexa-fhem angelegt wird. &lt;br /&gt;
&lt;br /&gt;
=== Fehlersuche über die FHEM-Oberfläche ===&lt;br /&gt;
&lt;br /&gt;
* alexa-fhem Logfile anschauen (Detail-Ansicht des &amp;lt;alexa&amp;gt;-Device aufrufen, klick auf &#039;&#039;&#039;Logfile&#039;&#039;&#039; oben)&lt;br /&gt;
* alexa-fhem im Debug-Modus aufrufen:&lt;br /&gt;
** -D zum alexaFHEM-params attribut hinzufügen&lt;br /&gt;
** Alexa-Befehl auslösen&lt;br /&gt;
** -D aus dem alexaFHEM-params attribut entfernen&lt;br /&gt;
* Die notwendigen Informationen finden sich in dem alexa-Logfile (siehe oben)&lt;br /&gt;
&lt;br /&gt;
=== Fehlersuche über Kommandozeile (lies: Shell) + FHEM-Oberfläche ===&lt;br /&gt;
&lt;br /&gt;
:* set &amp;lt;alexa&amp;gt; stop (FHEM-Oberfläche)&lt;br /&gt;
:* Auf der Kommandozeile &amp;lt;code&amp;gt;alexa-fhem -D -c /opt/fhem/alexa-fhem.cfg &amp;gt; debug.log&amp;lt;/code&amp;gt; starten (dadurch wird die Datei debug.log erzeugt im aktuellen Verzeichnis)&lt;br /&gt;
:* Alexa-Befehl auslösen&lt;br /&gt;
:* alexa-fhem auf der Kommandozeile wieder stoppen (CTRL-C)&lt;br /&gt;
:* set &amp;lt;alexa&amp;gt; start (FHEM-Oberfläche)&lt;br /&gt;
&lt;br /&gt;
Die Datei debug.log sollte Hinweise enthalten, wie das Problem zu lösen ist oder Dich zumindest in die richtige Richtung schieben.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel aus dem Forum fand sich in dem Logfile der Hinweis darauf, dass das Device mit falschen min/max-Werten unterwegs war.&lt;br /&gt;
&lt;br /&gt;
=== Registrierungskey vergessen, Registrierung zurücksetzen ===&lt;br /&gt;
&lt;br /&gt;
Auf der Kommandoshell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de status&lt;br /&gt;
Registered.&lt;br /&gt;
Registered on 2019-01-13T15:38:13Z.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
heisst, das der Vereinsserver eigentlich alles hat, was er will. Es wird kein neuer Schlüssel generiert.&lt;br /&gt;
Wenn Du die Situation zurücksetzen möchtest, wäre die hässliche Methode, Deinen SSH-Key zu löschen. Eleganter ist, die Registrierung auf Vereinsseite zu löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de unregister&lt;br /&gt;
Your registration has been removed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
löscht Deinen Schlüssel mitsamt allen dort gespeicherten Daten auf Vereinsseite. Bei Restart von alexa-fhem in FHEM-WEB wird jetzt ein neuer Registrierungskey angefordert.&lt;br /&gt;
&lt;br /&gt;
== Sicherheitskonzept und Secrets ==&lt;br /&gt;
&lt;br /&gt;
Um diesen Abschnitt zu verstehen, solltest Du den Abschnitt &amp;quot;Arbeitsweise&amp;quot; im Kopf haben. Einerseits ist Dir vermutlich einleuchtend, dass ein Server, der per SSH rückwärts nur ausgewählte Kommandos in den Tunnel, den Du aufgebaut hast, leitet, &amp;quot;irgendwie sicherer&amp;quot; ist. Andererseits möchte man nicht blind vertrauen.&lt;br /&gt;
&lt;br /&gt;
=== SSH ===&lt;br /&gt;
==== SSH - macht das nichts Gefährliches? ====&lt;br /&gt;
SSH ist ein Veteran des Internet und entstand, um sich sicher (verschlüsselt) und schnell auf Servern einzuloggen. Schon früh wurde dabei der sogenannte &amp;quot;Reverse-Tunnel&amp;quot; implementiert: Also der vom Client (Deinem Rechner) geäußerte Wunsch: &amp;quot;Bitte leite mir Requests, die bei Dir, Server, auf Port xy eingehen, an meinen lokalen Port yz weiter.&amp;quot;. Dieses Verfahren implementiert der Reverseproxy, wobei tatsächlich auf dem Server für Dich kein echter Port geöffnet wird.&lt;br /&gt;
&lt;br /&gt;
Wie Dir ggf. sicher der Unix-Guru Deines Vertrauens bestätigen wird: Die Kombination&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
ssh -R 1234:localhost:&amp;lt;zufälliger port&amp;gt; zielserver &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
erlaubt keine Ausführung von Shell-Kommandos auf Deinem Server, sondern einzig, dass vom SSH-Programm Verbindungen zu einem lokalen Port auf Deinem Server auf dem alexa-fhem lauscht aufgebaut werden. Du kannst also z.B. mit einem&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo /usr/sbin/tcpdump -X -s 0 -i lo port &amp;lt;zufälliger port&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
vollständig überwachen (oder ggf. permanent aufzeichen), was auf Deinem Server von außen gesteuert passiert.&lt;br /&gt;
&lt;br /&gt;
==== Wie wird bei SSH verschlüsselt? ====&lt;br /&gt;
Im Prinzip wie im Web auf SSL-Seiten, teils mit den gleichen Verschlüsselungsverfahren. Allerdings arbeitet SSH eher wie das im Web recht seltene Verfahren: Bei jeder Verbindung übermitteln sowohl Server wie auch Client den öffentlichen Teil ihres Schlüssels. Anders als im Web wird der Schlüssel aber nicht von einer öffentlichen Zertifizierungsstelle wie &amp;quot;LetsEncrypt&amp;quot; unterschrieben. Stattdessen entscheiden Server wie Client beim ersten Verbindungsaufbau typischerweise per manueller Frage: &amp;quot;Willst Du jetzt und künftig diesem Schlüssel vertrauen?&amp;quot; Bei der Installation wird diese Frage für Deine Seite bejaht, und fortan wird der öffentliche Schlüssel des FHEM-Servers auf Deinem Rechner gespeichert. Ab da bist Du z.B. davor sicher, dass jemand den DNS-Eintrag verbiegt oder sich in den Datenfluss Deines Providers einhängt: Ein geänderter Serverschlüssel würde bemerkt werden.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Soweit klar? Aus Deinem öffentlichen Schlüssel wiederum leitet der Server her: &amp;quot;Das ist definitiv wieder derjenige, der sich damals &amp;quot;registriert&amp;quot; hat&amp;quot;. Und an dieser Stelle kann ich auch den &amp;lt;b&amp;gt;ersten Teil des 3-teiligen Registrierungskeys&amp;lt;/b&amp;gt; erläutern: Die typischerweise 6-stellige Hex-Zahl am Anfang ist der Java-Hashcode Deines öffentlichen Schlüssel. Sie ist damit sozusagen Deine aus Deinem öffentlichen Schlüssel abgeleitete Benutzer-ID.&lt;br /&gt;
&lt;br /&gt;
=== Die Rolle der Secrets ===&lt;br /&gt;
Wenn jetzt klar ist, dass die Verbindung zum Vereinsserver sicher und vertauschungsfrei funktioniert, bleiben noch 2 Probleme zu lösen:&lt;br /&gt;
1) Im Web bei der Skill-Aktivierung musst Du beweisen, dass Du der Mensch am Browser bist, dem der SSH-Tunnel von IP xy mit dem öffentlichen Schlüssel X gehört. Bei der automatischen Registrierung werden lokal auf Deinem Rechner zwei 64-Bit-Secrets generiert:&lt;br /&gt;
* Das &amp;lt;b&amp;gt;Anmelde&amp;lt;/b&amp;gt;-Secret&lt;br /&gt;
* Das &amp;lt;b&amp;gt;Bearer&amp;lt;/b&amp;gt;-Token&lt;br /&gt;
Beim Anmelden des SSH-Keys auf dem öffentlichen Server wird nun der &amp;lt;b&amp;gt;Hashwert&amp;lt;/b&amp;gt; des ersten Secrets übertragen und dort in Verbindung mit Deinem öffentlichen Schlüssel gespeichert. Ein Hashwert bedeutet, dass (sofern das Verfahren, hier SHA256, funktioniert), niemand aus dem Hash das Secret zurückrechnen kann. Ein Datenbankklau auf dem Server gefährdet also nicht die Sicherheit Deines Passwortes.&lt;br /&gt;
&lt;br /&gt;
Wenn Du nun beim Skill-Aktivieren den Registrierungskey eingibst, dann &amp;quot;sieht&amp;quot; der Server zum ersten Mal Dein ausgewürfeltes Secret, vergleicht es mit dem Hashwert und wird es anschließend wieder umgehend vergessen. Anhand des Hashwertes kann der Server aber entscheiden, dass Du der legitime Nutzer zum öffentlichen Schlüssel XY bist.&lt;br /&gt;
&lt;br /&gt;
2) Das zweite Problem ist: Wie soll Amazon &amp;quot;beweisen&amp;quot;, dass sie der legitime Aufrufer sind? Amazon erhält binnen wenigen Sekunden nach dem Klick auf &amp;quot;Activate Skill&amp;quot; den &amp;lt;b&amp;gt;dritten Teil&amp;lt;/b&amp;gt; des Registrierungskeys als sogenanntes Bearer-Token. Zwar läuft er durch den Registrierungsserver, er wird dort, auf dem Registrierungs/Vereinsserver aber nicht gespeichert. Das Bearer-Token wird von Amazon bei allen Requests zu Deinem Server mitgesendet. Da es am Anfang zusätzlich Deine &amp;quot;User-ID&amp;quot; enthält, weiß der Vereinsserver, zu welchem SSH-Tunnel der Request zu senden ist. Aber lokal auf Deinem Rechner wird ausgewertet, ob das Token &amp;quot;stimmt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== alexa-fhem Updaten bzw. &amp;quot;Upgraden&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Updaten einer &amp;quot;Connector&amp;quot; Installation:&#039;&#039;&#039;&lt;br /&gt;
* alexa-fhem über FHEM anhalten (Name des Alexa-Device: alexa):&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;set alexa stop&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Auf der Konsole wie anfangs bei der Installation:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo npm update -g alexa-fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Manchmal hat npm Probleme mit einem Update. Dann einfach die aktuelle Version noch mal drüber Installieren: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo npm install -g alexa-fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*alexa-fhem über FHEM wieder starten:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;set alexa start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Upgraden von einer &amp;quot;Nicht-Connector&amp;quot; Installation (z.B. manuelle Installation per pm-Download):&#039;&#039;&#039;&lt;br /&gt;
* Daten der aktuellen Installation sichern (v.a. config.json / man weiß ja nie)&lt;br /&gt;
* Autostart der aktuellen alexa-fhem Installation deaktivieren:&lt;br /&gt;
** Bei initd: Service deaktivieren mittels: &amp;lt;code&amp;gt;sudo update-rc.d -f alexa remove&amp;lt;/code&amp;gt; Vorher mittels stoppen: &amp;lt;code&amp;gt;sudo service alexa stop&amp;lt;/code&amp;gt; Startscript unter /etc/init.d/ löschen.&lt;br /&gt;
** Bei systemd: Service deaktivieren mittels: &amp;lt;code&amp;gt;sudo systemctl disable alexa&amp;lt;/code&amp;gt; Vorher mittels stoppen: &amp;lt;code&amp;gt;sudo systemctl alexa stop&amp;lt;/code&amp;gt; Startscript unter /etc/systemd/system/ löschen.&lt;br /&gt;
* ALLE vorhandenen alexa-fhem Daten LÖSCHEN! Bleiben Dinge zurück und wird dann laut Connector installiert kann es zu Problemen kommen!&lt;br /&gt;
* (reboot)&lt;br /&gt;
* Installation von alexa-fhem laut Anleitung (Beginn dieses Wiki)&lt;br /&gt;
* Falls eigene Dinge von früher genutzt werden wollen/sollen (z.B. Custom Skill), dann die entsprechenden Einträge aus der gesicherten config.json in die neu angelegte alexa-fhem.cfg (zu finden unter &amp;quot;Edit files&amp;quot;) übernehmen.&lt;br /&gt;
* Werden keine eigenen Dinge verwendet, dann kann der Port (Standard: 3000) geschlossen werden und auch die Daten unter Amazon-Developer können gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
== Bug- und Wunschliste ==&lt;br /&gt;
* Ist beim Start keine Internetverbindung vorhanden, erfolgt kein Retry -- alexa-fhem muss restartet werden (ssh_autoconfig wertet keine temporären Fehler aus)&lt;br /&gt;
&lt;br /&gt;
==Weitergehende Informationen==&lt;br /&gt;
*[[Alexa und Mappings]]&lt;br /&gt;
*[[Alexa Tipps und Kniffe]]&lt;br /&gt;
*[[FHEM Connector for Amazon Alexa]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_Connector_f%C3%BCr_Amazon_Alexa&amp;diff=33324</id>
		<title>FHEM Connector für Amazon Alexa</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_Connector_f%C3%BCr_Amazon_Alexa&amp;diff=33324"/>
		<updated>2020-06-01T18:07:07Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Geräte im FHEM-Webfrontend zuweisen */Fußnote ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&#039;&#039;&#039;Alexa FHEMlazy&#039;&#039;&#039; war historisch ein Fork des Original [[Alexa-Fhem|alexa-fhem]], der im Januar 2019 mit dem Original zusammengeführt wurde und nun als &#039;&#039;&#039;FHEM Connector&#039;&#039;&#039; verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
Er ermöglicht innerhalb von Minuten die Verknüpfung von FHEM mit einem Amazon Echo Gerät. Auch Geräte anderer Hersteller mit verbauten Mikrofonen und Alexa-Sprachassistenten-Unterstützung sollten problemlos funktionieren. Für folgende Geräte ist dies bspw. der Fall (Falls Ihr andere/weitere Gerätemodelle bzw. Hersteller in Verwendung habt, bitte hier pflegen):&lt;br /&gt;
&lt;br /&gt;
* SONOS Beam und SONOS One   &lt;br /&gt;
&lt;br /&gt;
Gegenüber dem klassischen Ansatz ergeben sich Einschränkungen, so läuft die Software normalerweise unter dem gleichen Benutzer wie FHEM auf dem gleichen Server, und es wird z.Zt. nur der Smarthome-Skill unterstützt (die Variante, bei der die Möglichkeiten der Interaktion von Amazon festgelegt wurden).&lt;br /&gt;
Dafür ist weder ein Developer-Account bei Amazon, eigene Lambda- und Skillfunktionen, noch das Öffnen eines eingehenden Ports aus dem Internet nötig. &lt;br /&gt;
* Die Software integriert einen Installer, der die Erstkonfiguration und Anmeldung übernimmt&lt;br /&gt;
* Die Kommunikation zur Software auf dem heimischen Rechner und dann zu FHEM verläuft über SSH und einen vom FHEM-Verein gehosteten Server&lt;br /&gt;
* Funktioniert mit IPv4, IPv6, echtem Dual Stack und DS-Lite&lt;br /&gt;
* Als Skill bei Amazon wird der Skill &amp;quot;FHEM Connector&amp;quot; verwendet.&lt;br /&gt;
&lt;br /&gt;
Der Thread im Forum zur Software ist hier: {{Link2Forum|Topic=94817}}.&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einfache Anbindung von FHEM an Amazon Assistent Alexa&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=alexa&lt;br /&gt;
|ModTechName=39_alexa.pm / alexa-fhem&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModOwner=gvzdus, André/ justme1968 ({{Link2FU|430|Forum}} / [[Benutzer Diskussion:Justme|Wiki]])&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
&lt;br /&gt;
===Arbeitsweise und Datenfluss===&lt;br /&gt;
Vorläufig ist alexa-fhem im &amp;quot;FHEM Connector-Modus&amp;quot; ein reiner [https://developer.amazon.com/de/docs/smarthome/understand-the-smart-home-skill-api.html SmartHome-Skill].&lt;br /&gt;
SmartHome-Skills erhalten weder die Sprachdaten selber noch das, was Amazon in Textform verstanden hat, sondern vielmehr extrahiert Amazon aus dem verstandenen Text Anweisungen und Abfragen für Geräte, die dann an den Skill übermittelt werden. Charmant ist dabei, dass unmittelbar gefragt werden kann &amp;quot;Alexa, wie ist die Temperatur im Wohnzimmer?&amp;quot;, während andere Skills zunächst explizit angesprochen werden müssen (&amp;quot;Alexa, frage FHEM nach der Temperatur im Wohnzimmer&amp;quot;). Außerdem kann der Nutzer mehrere Smarthome-Skills installieren, und die Geräte werden zu einer Gesamtmenge zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Gehen wir den Datenfluss bei der konkreten Frage &amp;quot;Wie ist die Temperatur im Wohnzimmer?&amp;quot; durch:&lt;br /&gt;
* Alexa hat bei der Skillinstallation gelernt, dass &amp;quot;FHEM Connector&amp;quot; bei Dir einen Thermostaten im Raum Wohnzimmer kennt. Dadurch wird bei der Sprachanalyse von &amp;quot;Alexa Voice Service&amp;quot; in der Cloud erkannt, dass eine Abfrage an &amp;quot;FHEM Connector&amp;quot; erfolgversprechend ist.&lt;br /&gt;
* Zunächst wird die zentrale &amp;quot;Lambda-Funktion&amp;quot; von &amp;quot;FHEM Connector&amp;quot; aufgerufen. Die Funktion leitet aber im Kern nur den Request unverändert an den vom Verein bereitgestellten Server weiter. Im Request enthalten ist ein Token, das sogenannte &amp;quot;Bearer-Token&amp;quot;.&lt;br /&gt;
* Der &amp;quot;Vereinsserver&amp;quot; prüft anhand dieses Tokens, ob es überhaupt bekannt ist, und zu welchem Nutzer es gehört. Ist dieser Nutzer verbunden, wird der Request wiederum quasi unverändert an den Nutzer weitergeleitet.&lt;br /&gt;
* Diese Weiterleitung passiert über einen sogenannten SSH-Reverse-Tunnel, der von Deiner Seite und der Software auf dem FHEM-Tunnel automatisch aufgebaut wird.&lt;br /&gt;
* Auf Deiner Seite läuft die eigentliche Software, und zwar unter nodeJS. nodeJS ist ein Javascript ausführender Miniserver, der lokal auf einem Zufallsport auf Requests &amp;quot;lauscht&amp;quot;. In der Original-Version  [[Alexa-Fhem|Alexa FHEM]] kommen die Requests aus dem Internet (hoffentlich von der eigenen Lambda-Funktion), hier bei &amp;quot;FHEM Connector&amp;quot; kommen sie ausschließlich aus dem SSH-Tunnel von lokal.&lt;br /&gt;
* Die Software validiert nun diesen Request anhand des Bearer-Tokens. Konkret wird dabei das bei der Installation generierte Token, dass bei der Skill-Aktivierung an Amazon übertragen wurde, mit dem lokal gespeicherten Wert verglichen. Stimmt das Token, wird der Befehl verarbeitet, üblicherweise wird hierbei ein Aufruf an die Webschnittstelle von FHEM abgesetzt.&lt;br /&gt;
* FHEM führt den Befehl aus&lt;br /&gt;
&lt;br /&gt;
Hört sich langsam und kompliziert an? Kompliziert: Okay. Langsam eher nicht, in etlichen Fällen liegt die Gesamtantwortszeit unter 200 ms.&lt;br /&gt;
&lt;br /&gt;
Soweit ein erster Überblick über die Datenflüsse. Im Abschnitt Sicherheit ist das Konzept der Absicherung deutlich genauer und ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
Du wirst bei der Installation zuerst auf der Kommandozeile auf Deinem Raspberry (o.ä.) unterwegs sein, anschließend im Webfrontend von FHEM, und zum Schluss auf der Alexa-Konsole im Web.&lt;br /&gt;
&lt;br /&gt;
===node.js installieren===&lt;br /&gt;
&lt;br /&gt;
Ab Jessy liegt NodeJS bereits in einer ausreichend aktuellen Version vor (Stretch und Buster funktionieren ebenfalls). Mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install nodejs npm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kannst Du es installieren. Mit &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
node --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
erfährst Du die aktuelle Version - wenn hier etwas mit &amp;quot;8&amp;quot; oder höher vorneweg erscheint, ist alles gut.&lt;br /&gt;
Ansonsten suche Dir bitte eine Anleitung im Web, wie Du NodeJS auf Deinem System auf einen aktuellen Stand bringen kannst.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-FHEM installieren ===&lt;br /&gt;
&lt;br /&gt;
Nun installieren wir Alexa-fhem aus dem offiziellen Repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo npm install -g alexa-fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Vorgang benötigt etwas Zeit.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-FHEM aktivieren ===&lt;br /&gt;
&lt;br /&gt;
Wechsele jetzt in FHEM-Web!&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass das Alexa-Modul in der Version ab Januar 2019 vorliegt. Dafür bitte einmal FHEM aktualisieren:&lt;br /&gt;
Speichern der Config nicht vergessen, und&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
update&lt;br /&gt;
shutdown restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alles, was jetzt noch nötig ist, ist das Anlegen eines Alexa-Devices. Gib dafür in der FHEM-Web-Kommandozeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
define alexa alexa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
an. Nun läuft, während Du bereits das neu angelegte Alexa-Devices siehst, ein komplexer Prozess im Hintergrund:&lt;br /&gt;
&lt;br /&gt;
* Falls noch kein SSH-Key für den Benutzer, unter dem FHEM läuft, existiert, wird einer generiert&lt;br /&gt;
* Es wird ein Secret-Key im Prozess generiert, dass den Server nicht verlässt, und der Skillanmeldung dient.&lt;br /&gt;
* Du wirst auf dem Server &amp;quot;va-fhem.fhem.de&amp;quot; des FHEM-Vereins mit dem SSH-Key angemeldet, und der Hash-Wert Deines Secret-Key dort abgelegt.&lt;br /&gt;
&lt;br /&gt;
Und wenn Du diese Sätze gelesen hast, sollte inzwischen sich das Alexa-Device in FHEM-Web aktualisiert haben, und &lt;br /&gt;
ungefähr so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alexa-Device-2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Status für alexa-fhem und der Proxyverbindung ist wichtig, dass diese beiden Zeilen beim Reload aufgetaucht sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
alexaFHEM.bearerToken crypt:...&lt;br /&gt;
alexaFHEM.skillRegKey crypt:...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ja, und diesen Schlüssel benötigst Du wirklich! Also am besten schon einmal mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
get &amp;lt;alexa&amp;gt; proxyKey&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in Klartext anzeigen lassen und in ein Editor-Fenster dauerhaft wegsichern.&lt;br /&gt;
&lt;br /&gt;
Jetzt solltest Du Dein Alexa-Device nicht mehr löschen, denn das im Reading angezeigte &amp;quot;bearerToken&amp;quot; zu löschen bedeutet, dass die Software die Zugriffe von nicht mehr überprüfen kann und keine Kommandos mehr funktionieren. In diesem Fall hilft nur die Neuinstallation des Skills.&lt;br /&gt;
&lt;br /&gt;
==== Fehler bei der Aktivierung ====&lt;br /&gt;
&lt;br /&gt;
Während kompliziertere Fehlerfälle im Abschnitt &amp;quot;Mögliche Probleme und Lösungen&amp;quot; behandelt werden, hier häufige Fälle, warum die kryptischen Zeilen nicht auftauchen:&lt;br /&gt;
&lt;br /&gt;
* Zuerst bitte einfach einmal die Seite neu laden.&lt;br /&gt;
&lt;br /&gt;
===== 401: Authorization Required =====&lt;br /&gt;
&lt;br /&gt;
Wenn Du FHEM-Web mit einem User/Passwort-Schutz versehen hast, wirst du folgende Fehlermeldung sehen: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
alexaFHEM stopped; failed to connect to fhem: 401: Authorization Required&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Regel musst du die Angaben User/Passwort noch einmal explizit setzen. Im Attribute-Abschnitt &amp;quot;alexaFHEM-auth&amp;quot; auswählen, User/Passwort mit &amp;quot;:&amp;quot; getrennt angeben und &amp;quot;attr&amp;quot; anklicken. alexa-fhem wird automatisch neu gestartet. Hier das Ganze in der Text-Variante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
attr alexa alexaFHEM-auth user:pass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Permission denied =====&lt;br /&gt;
&lt;br /&gt;
Wenn du folgende Fehlermeldungen im Alexa Logfile siehst, wurde das Verzeichnis &amp;quot;/opt/fhem/.ssh/&amp;quot; von dir bei der Arbeit mit &amp;quot;root&amp;quot; oder &amp;quot;sudo&amp;quot; mit den falschen Berechtigungen versehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
[2019-7-25 11:59:12] sshautoconf: aborted with ssh-keygen returned error - key_save_private: Permission denied&lt;br /&gt;
[2019-7-25 11:59:12] *** SSH: proxy configuration failed: ssh-keygen returned error - key_save_private: Permission denied&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prüfen kannst du die Berechtigungen mit folgendem Befehl auf der Shell-Konsole: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
ls -l /opt/fhem/.ssh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Du solltest dann folgende Ausgabe erhalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
insgesamt 12&lt;br /&gt;
-rw------- 1 fhem dialout 1675 Jul 12 13:10 id_rsa&lt;br /&gt;
-rw-r--r-- 1 fhem dialout  391 Jul 12 13:10 id_rsa.pub&lt;br /&gt;
-rw-r--r-- 1 fhem dialout  884 Jul 12 13:10 known_hosts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Steht in der Ausgabe nicht &amp;quot;fhem dialout&amp;quot; (dein fhem User), sondern bspw. &amp;quot;root root&amp;quot;, dann bspw. mit folgendem Befehl an deinen fhem User anpassen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
chown fhem:dialout /opt/fhem/.ssh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem ersten Befehl &amp;quot;ls -l ...&amp;quot; kannst du dann nochmal prüfen, ob die Berechtigungen korrekt übernommen wurden. &lt;br /&gt;
&lt;br /&gt;
===== weitere Prüfungen =====&lt;br /&gt;
&lt;br /&gt;
Hast Du noch die Shell-Konsole offen? Dann prüfe bitte noch einmal auf der Konsole, ob nun zwei Prozesse laufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
ps -ef | egrep &#039;(alexa|ssh)&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sollte Dir idealerweise so etwas anzeigen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
fhem     31322     1 99 13:56 ?        00:00:03 alexa                              &lt;br /&gt;
fhem     31332 31322  8 13:56 ?        00:00:00 /usr/bin/ssh -R 1234:127.0.0.1:&amp;lt;zufälliger port&amp;gt; -oServerAliveInterval=90 -p 58824 fhem-va.fhem.de&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;alexa&amp;quot; ist dabei der Node-JS-Prozess, der ssh-Prozess ist die aufgebaute Verbindung zum Vereinsserver.&lt;br /&gt;
&lt;br /&gt;
Wenn Du diese Prozesse &#039;&#039;&#039;nicht&#039;&#039;&#039; siehst oder das Alexa-Device keinen Registrierungskey anzeigt, dann ist leider der Start nicht glatt verlaufen.&lt;br /&gt;
&lt;br /&gt;
Im Logfile (über den link &amp;lt;code&amp;gt;Logfile&amp;lt;/code&amp;gt; in der Detail-Ansicht über &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;, oder über den Namen bei &#039;&#039;currentlogfile&#039;&#039; in den Internals) findest Du idealerweise selber Hinweise, wo es hakt, oder kannst im Forum nachfragen.&lt;br /&gt;
&lt;br /&gt;
=== Geräte im FHEM-Webfrontend zuweisen ===&lt;br /&gt;
Um das Aha-Erlebnis zu vergrößern, ist jetzt ein guter Zeitpunkt, 1 oder besser mind. 2 Geräte für den Alexa-Dienst zuzuweisen. Von Haus aus wird keines Deiner FHEM-Geräte automatisch Alexa zugewiesen!&lt;br /&gt;
&lt;br /&gt;
Wähle die Geräte aus, rufe sie auf und setze das Attribut &amp;quot;alexaName&amp;quot;. Hierbei in Kürze nur der Hinweis:&lt;br /&gt;
* Keine Angst vor Leerzeichen und Umlauten, funktioniert.&lt;br /&gt;
* Große Angst vor Rechtschreibfehlern (Terrasse, Rollladen) oder komplizierten Wörtern &amp;quot;handgebastelte Martinslaterne im Kinderzimmer Iphigenie-Chantal&amp;quot;.&lt;br /&gt;
* Mehrere Namen für dasselbe Gerät/Device in fhem werden unterstützt. Mehrere Namen werden durch Strichpunkt getrennt &amp;lt;ref&amp;gt;Feature nicht dokumentiert {{Link2Forum|Topic=664492|LinkText=Forumsthread}} &amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Das Attribut &amp;quot;alexaRoom&amp;quot; ist NUR FÜR DEN CUSTOM SKILL relevant. Ausnahme: structure und LightScene Devices, siehe: [[FHEM_Connector_f%C3%BCr_Amazon_Alexa#Was_geht_alles_.3F]].&lt;br /&gt;
&lt;br /&gt;
Lade die Geräte neu in die Software, indem Du &amp;lt;code&amp;gt;set &amp;lt;alexa&amp;gt; restart&amp;lt;/code&amp;gt; ausführst!&lt;br /&gt;
[[Datei:HowToSet alexaName.png|alternativtext=How to set alexaName|ohne|mini|Wie setzt man das Attribut alexaName]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen (weil oft gestellte Fragen im Forum) bzgl. Erkennung von Geräten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Wichtig ist, dass die Filtereinstellung in der alexa-fhem.cfg (zu finden unter &amp;quot;Edit Files&amp;quot;) passt.&lt;br /&gt;
Das, was dort eingetragen ist (Standard: alexaName=..* / also es ist ein alexaName vergeben) auch an den entsprechenden Devices in fhem vorhanden ist.&lt;br /&gt;
Stimmt das nicht überein, kann alexa-fhem keine Devices von fhem abfragen/finden.&lt;br /&gt;
Ob der Filter entsprechend funktioniert kann man wie folgt testen: &#039;&#039;list Filtereinstellung&#039;&#039; beispiel mit Standardfilter: &#039;&#039;list alexaName=..*&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Hat alexa-fhem per Filter Devices aus fhem &amp;quot;gefunden&amp;quot;, geht es weiter mit der &amp;quot;Erkennung&amp;quot;. Also um welches Device (Typ und &amp;quot;Fähigkeiten&amp;quot;) handelt es sich. Dazu gilt folgendes:&lt;br /&gt;
** sind entsprechende Readings beim Device vorhanden (z.B. temperature, state mit on/off, ...) erkennt das alexa-fhem automatisch. Die Liste der automatisch erkannten Readings wächst ständig. Daher erst mal schauen ob das Device bereits entsprechend erkannt (typisiert) wurde. Das kann durch prüfen des alexa-fhem-Logs geschehen (NICHT fhem-log!).&lt;br /&gt;
** sind entsprechende &amp;quot;set-Befehle&amp;quot; erkennbar (oft auch durch Readings). Also ist beispielsweise (wie beim Dummy nötig) ein &#039;&#039;setList&#039;&#039; mit entsprechenden Einträgen vorhanden oder entsprechende Readings, z.B. desired-temp zum Stellen der Temperatur etc.&lt;br /&gt;
** wird das Device nicht richtig oder &amp;quot;unvollständig&amp;quot; erkannt helfen folgende Attribute:&lt;br /&gt;
*** genericDeviceType: hiermit kann alexa-fhem in die gewünschte Richtung &amp;quot;geschubbst&amp;quot; werden. Anmerkung: man kann nicht alles erzwingen, Readings bzw. set-Befehle müssen passen (oder per homebridgeMapping passend gemacht werden). Wenn ein genericDeviceType nicht per &amp;quot;Drop-Down&amp;quot; erscheint, dann kann er auch (wenn bekannt) einfach per WEB-cmd eingegeben werden: &#039;&#039;attr Devicename genericDeviceType media&#039;&#039;&lt;br /&gt;
*** homebridgeMapping: hierdurch kann alexa-fhem bei der Erkennung von Zuständen und möglichen Einstellungen (also WAS kann das Device) unterstützt werden. Mittels homebridgeMapping können vorhandene Readings (Zustände) auf für alexa-fhem bekannte Zustände gemappt werden. Ebenso können damit Standard-fhem-Kommandos von alexa-fhem auf Device-spezifische gemappt werden. Beispiel: on/off auf Ein/Aus (falls das Device statt on/off eben ein Ein/Aus erwartet). Zum Beispiel: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;thermostat&amp;gt; homebridgeMapping TargetTemperature=target::target,minValue=18,maxValue=25,minStep=0.5 CurrentTemperature=myTemp:temperature&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; [https://github.com/justme-1968/homebridge-fhem/blob/master/README.md weitere Beispiele]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&#039;&#039;&#039;Mehrere Namen für dasselbe Gerät/Device in fhem sind möglich.&#039;&#039;&#039;&amp;lt;/br&amp;gt;&lt;br /&gt;
Die Namen werden durch Strichpunkt getrennt.&amp;lt;/br&amp;gt;&lt;br /&gt;
Beispiel:&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;attr dmLampe alexaName Lichtkuppel;Lichtkugel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung bzgl. genericDeviceType und homebridgeMapping:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* diese Attribute werden von verschiedenen &amp;quot;Sprachsteuerungsmodulen&amp;quot; in fhem verwendet (homebridge [dort wurde es &amp;quot;erfunden&amp;quot;], alexa-fhem, gassistant, ...). Daher ist nicht jedes Mapping für alle &amp;quot;Dienste&amp;quot; verwendbar. Ausprobieren schadet aber nicht.&lt;br /&gt;
* ebenso kann man mit diesen Attributen (homebridgeMapping wird gerne so &amp;quot;missbraucht&amp;quot;) nichts erzwingen, was seitens Amazon/Alexa nicht unterstützt bzw. verstanden wird! D.h. zunächst ist zu prüfen, ob ein bestimmter (gewünschter) Sprachbefehl seitens Amazon/Alexa unterstützt wird! Aktuelles Beispiel (Stand Jan 2020): &amp;quot;Alexa, fahre den Rollo hoch/runter&amp;quot;. Da ist Amazon/Alexa gerade dabei etwas zu tun. Bislang wird das nicht unterstützt, also ist das auch mit einem entsprechenden homebridgeMapping nicht zu erzwingen! Was unterstützt wird kann man bei Amazon nachlesen: [https://developer.amazon.com/es-ES/docs/alexa/device-apis/list-of-interfaces.html]&lt;br /&gt;
&lt;br /&gt;
== Finale: Skill verknüpfen ==&lt;br /&gt;
Suche im WebFrontend oder der Alexa-App den Skill &amp;quot;FHEM Connector&amp;quot;. Für nicht-Mac/iOS Anwerder empfiehlt das WebFrontend (https://alexa.amazon.de) statt die App, damit Du den Anmeldeschlüssel auch bequem kopieren kannst.&lt;br /&gt;
&lt;br /&gt;
Wenn du noch nicht bei Amazon angemeldet bist, erwartet Amazon zunächst, dass Du Dich normal bei Amazon anmeldest.&lt;br /&gt;
&lt;br /&gt;
Sobald Du &amp;quot;FHEM Connector&amp;quot; aktivierst, öffnet sich ein Browser-Tab mit folgender Maske:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:FHEMlazy_login.png|240px]]&lt;br /&gt;
&lt;br /&gt;
Hier kopierst Du Deinen Anmeldeschlüssel (im Klartext!) hinein und klickst auf Check. Als glücklicher Mensch ist auf der folgenden Statusseite alles grün:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:FHEMlazy_check.png|240px]]&lt;br /&gt;
&lt;br /&gt;
Im Einzelnen wird hier geprüft, ob Du per SSH verbunden bist (und auch Deine IP zur Sicherheit angezeigt), ob der Reverse-Tunnel steht, ob nodeJS erreichbar ist und wie viele Geräte Alexa gleich finden sollte (in meinem Fall 22).&lt;br /&gt;
&lt;br /&gt;
Sollte etwas nicht grün sein und Du eine Idee zum Fixen haben, kannst Du mit &amp;quot;Retry&amp;quot; neue Versuche auslösen.&lt;br /&gt;
&lt;br /&gt;
Ist alles okay, klicke rechts den Button &amp;quot;Activate Skill&amp;quot;. Du springst damit wieder zurück zu Amazon, die Dir hoffentlich zur erfolgreichen Verknüpfung gratulieren.&lt;br /&gt;
&lt;br /&gt;
Amazon möchte nun unmittelbar die Gerätesuche starten, und unter SmartHome-Geräte sollten diese nun auftauchen.&lt;br /&gt;
&lt;br /&gt;
== Was geht alles ? ==&lt;br /&gt;
&lt;br /&gt;
* Geräte, die sich ein- und ausschalten lassen:&lt;br /&gt;
** Automatisch: Müssen &amp;lt;code&amp;gt;set on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set off&amp;lt;/code&amp;gt; Kommandos haben&lt;br /&gt;
** dummys müssen &amp;lt;code&amp;gt;setList&amp;lt;/code&amp;gt; mit on und off haben&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; switch bzw. light kann bestimmt werden ob es in alexa als Schalter oder Licht behandelt wird.&lt;br /&gt;
** Wenn die Set-Kommandos im FHEM Device anders benannt sind: homebridgeMapping On:cmdOn=&amp;lt;ein&amp;gt;,cmdOff=&amp;lt;aus&amp;gt; setzen&lt;br /&gt;
** Kommandos:&lt;br /&gt;
***Alexa, schalte &amp;lt;name&amp;gt; ein/aus&lt;br /&gt;
***Alexa, Licht an/aus&lt;br /&gt;
***Alexa, schalte &amp;lt;gruppe&amp;gt; ein/aus&lt;br /&gt;
* Geräte, die eine Temperatur messen&lt;br /&gt;
** Automatisch: Es muss ein Reading &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; thermometer&lt;br /&gt;
** Sonst: homebridgeMapping CurrentTemperature:reading=&amp;lt;reading&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Helligkeit sich ändern lässt&lt;br /&gt;
** Automatisch: wenn &amp;lt;code&amp;gt;dim&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Kommandos erkannt werden&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; light&lt;br /&gt;
** Über homebridgeMapping: Wenn &amp;lt;code&amp;gt;helligkeit&amp;lt;/code&amp;gt; das Reading für die aktuelle Helligkeit enthält und die Helligkeit mit &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; prozent xxx&amp;lt;/code&amp;gt; gesetzt wird, sieht das homebridgeMapping wie folgt aus: homebridgeMapping Brightness=helligkeit::prozent,minValue=0,maxValue=&amp;lt;maximalwert&amp;gt;&lt;br /&gt;
** Kommandos:&lt;br /&gt;
*** Alexa, mache &amp;lt;name&amp;gt; heller/dunkler&lt;br /&gt;
*** Alexa, Licht heller/dunkler&lt;br /&gt;
* Geräte, deren Farbe sich ändern lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Farbtemperatur sich ändern lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, bei denen sich eine Lautstärke einstellen lässt&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, bei denen sich ein prozentualer Wert einstellen lässt&lt;br /&gt;
** Automatisch: wenn &amp;lt;code&amp;gt;dim&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Kommandos erkannt werden&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* elektrische Türschlösser&lt;br /&gt;
** &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;: lock&lt;br /&gt;
** homebridgeMapping mit LockCurrentState und LockTargetState&lt;br /&gt;
&lt;br /&gt;
* Thermostate&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; thermostate&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* structure Devices aus FHEM (ab alexa-fhem version 0.5.7)&lt;br /&gt;
** können mit &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene als Szene eingebunden werden&lt;br /&gt;
** über &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; kann der name um einen Ort ergänzt werden&lt;br /&gt;
** Szenen aus einer structure lassen sich ein- und ausschalten&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
&lt;br /&gt;
* LightScene Devices aus FHEM (ab alexa-fhem version 0.5.8)&lt;br /&gt;
** können mit &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene als Szenen eingebunden werden&lt;br /&gt;
** über &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; kann der name um einen Ort ergänzt werden&lt;br /&gt;
** Szenen aus einer LightScene lassen sich nur einschalten&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Kanal sich umschalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping ChannelController:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-channelcontroller.html#changechannel&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Playback status sich schalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping PlaybackController:playback,values=Play;Pause;Stop;Previous;Next&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-playbackcontroller.html#discovery&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Eingang sich umschalten lässt (ab alexa-fhem version 0.5.13)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; media&lt;br /&gt;
** homebridgeMapping InputController:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;,values=HDMI+1;HDMI+2;XBOX&lt;br /&gt;
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-property-schemas.html#input&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Kontaktsensoren (ab alexa-fhem version 0.5.15)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; contact&lt;br /&gt;
** homebridgeMapping ContactSensorState:reading=&amp;lt;reading&amp;gt; oder CurrentDoorState:reading=&amp;lt;reading&amp;gt;&lt;br /&gt;
** Die Anzeige in der Alexa-App funktioniert sofort, die Abfrage per Sprache erst ab Version 0.5.27.&lt;br /&gt;
&lt;br /&gt;
* Geräte, deren Lautstärke sich ändern lässt (ab alexa-fhem version 0.5.24)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; speaker&lt;br /&gt;
** Automatisch: es muss ein Reading &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;mute&amp;lt;/code&amp;gt; geben&lt;br /&gt;
** homebridgeMapping Volume:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt; Mute:reading=&amp;lt;reading&amp;gt;,cmd=&amp;lt;cmd&amp;gt;&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* Geräte, die sich ein- (und optional) ausschalten lassen als Szene (ab alexa-fhem version 0.5.26)&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; scene&lt;br /&gt;
** Automatisch: Müssen &amp;lt;code&amp;gt;set on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set off&amp;lt;/code&amp;gt; Kommandos haben&lt;br /&gt;
** homebridgeMapping On:reading=&amp;lt;reading&amp;gt;,cmdOn=&amp;lt;cmd&amp;gt;[,cmdOff=&amp;lt;cmd&amp;gt;]&lt;br /&gt;
** Hinweis: Fehlende Kommandos lassen sich mit cmdalias erzeugen&lt;br /&gt;
** Wichtig:&lt;br /&gt;
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.&lt;br /&gt;
* Rollläden. Lange ein Problemthema, das nur mit &amp;quot;Schalte auf 0%, schalte auf 100% lief&amp;quot;. Wichtig: &amp;quot;alexa-fhem&amp;quot; ab Version 0.5.39 einsetzen. GenericDevice-Type auf &amp;quot;blind&amp;quot; setzen. Nach Restart von alexa-fhem und neuer Gerätesuche sollte folgendes funktionieren:&lt;br /&gt;
** &amp;quot;..., öffne &amp;lt;Name&amp;gt; ganz&amp;quot;&lt;br /&gt;
** &amp;quot;..., schließe &amp;lt;Name&amp;gt; komplett&amp;quot;&lt;br /&gt;
** &amp;quot;hoch&amp;quot; und &amp;quot;runter&amp;quot; (ohne &amp;quot;ganz&amp;quot; oder &amp;quot;komplett&amp;quot;) schalten jeweils nur einen bestimmten Prozentsatz hoch oder runter. Dieser kann mit &amp;lt;code&amp;gt;attr &amp;lt;name&amp;gt; homebridgeMapping TargetPosition:minStep=&amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt;geändert werden. Aber Achtung: In diesem Intervall kann dann auch nur noch ein absoluter Prozentwert per Sprache oder Slider eingestellt werden! Bei z.B. 25% würden 13% zu 25% aufgerundet, 12% zu 0% abgerundet werden.&lt;br /&gt;
* Kontaktsensoren (ab alexa-fhem version 0.5.47)&lt;br /&gt;
** Automatisch wenn ein Reading &amp;lt;code&amp;gt;motion&amp;lt;/code&amp;gt; vorhanden ist oder es sich um einen Zigbee bewgungsmelder an einer HUE oder deCONZ Bridge handelt&lt;br /&gt;
** Über &amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt; MotionSensor&lt;br /&gt;
** homebridgeMapping MotionDetected:reading=&amp;lt;reading&amp;gt;,values=&amp;lt;wert für bewgung&amp;gt;:1;&amp;lt;wert für keine bewegung&amp;gt;:0&lt;br /&gt;
&lt;br /&gt;
* Alarmmelder (noch nicht in Deutschland):&lt;br /&gt;
** genericDeviceType Security&lt;br /&gt;
** homebridgeMapping Alarm=&amp;lt;reading&amp;gt;[,type=[fireAlarm|waterAlarm|burglaryAlarm|carbonMonoxideAlarm]]&lt;br /&gt;
** wenn der type nicht angegeben wird ist fireAlarm der default&lt;br /&gt;
** automatisch werden 0, ok und alles was mit no anfängt als OK erkannt. alles andere gilt als ALARM.&lt;br /&gt;
&lt;br /&gt;
Es werden noch einige andere häufig verwendete Geräte (Homematic, hue,...) automatisch erkannt.&lt;br /&gt;
&lt;br /&gt;
to be continued ...&lt;br /&gt;
&lt;br /&gt;
In der [https://developer.amazon.com/docs/device-apis/list-of-interfaces.html List of Capability Interfaces] bei Amazon kann man sehen, welche Möglichkeiten das Smart Home Skill API aktuell in einzelnen Ländern bietet. Leider ohne die jeweiligen landessprachlichen Kommandos.&lt;br /&gt;
&lt;br /&gt;
=== Aktiv Routinen starten ===&lt;br /&gt;
Routinen (eine Funktionalität, die rein - genauso wie &amp;quot;Räume&amp;quot; - bei Amazon liegt und nicht von FHEM Connector beeinflusst wird) waren lange die ewige Antwort auf die Frage: &amp;quot;Meine Frau möchte aber &#039;&#039;&#039;Öffne Rollläden&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039; sagen&amp;quot;: In der Alexa-App gibt es im Menü den Punkt &amp;quot;Routinen&amp;quot;, und hier lässt sich eine gewisse Anzahl von Aktionen (unter optionalen Bedingungen) an ein Sprachkommando knüpfen.&lt;br /&gt;
&lt;br /&gt;
Neu: Routinen können inzwischen auch von Skills getriggert werden, und seit Version 0.5.47 (Februar 2020) auch von FHEM Connector. Das braucht niemand, um die Rollläden hochzufahren, denn das kann FHEM ja selber, aber um z.B. eine Ansage auf einem Alexa-Gerät zu triggern. Dafür gibt es auch das FHEM-Modul &amp;quot;echodevice&amp;quot;, aber es erfordert ein paar Klimmzüge. Mit dem aktiven Triggern von Routinen kann FHEM auslösen, dass Alexa ungefragt (!) Dinge wie &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Temperatur in der Tiefkühltruhe hat -16 Grad überschritten&amp;quot;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
in den Raum sagt. Also eine Alternative bzw. Ergänzung zu Alarmen / Erinnerungen per Telegram o.ä.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorgeschichte&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Die Smarthome-Skill-API von Amazon sah schon lange das &amp;quot;proactiveReporting&amp;quot; vor: Also z.B. die gemessene Temperatur nicht erst auf Anfrage hin zu übermitteln, sondern laufend aktiv zu pushen. Aber warum Daten an Amazon senden, wenn es dafür keinen Mehrwert gibt? Beim Öffnen z.B. des Thermostaten in der Alexa-App kommen ohnehin laufend Statusabfragen. Warum also einen Datenpool bei Amazon über die Haustemperatur aufbauen und Änderungen pushen, wenn es keinen Mehrwert dafür gibt? &lt;br /&gt;
&lt;br /&gt;
Inzwischen lassen sich (reale oder vermeintliche) Änderungen von &#039;&#039;Bewegungssensoren&#039;&#039; und &#039;&#039;Fensterkontakten&#039;&#039; als Startbedingung an Alexa-Routinen koppeln. Man kann in der Alexa-App (ggf. fiktive) Öffnen eines Fensterkontaktes an das Aufsagen eines freien Textes durch die Hausbutlerin knüpfen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Umsetzung&#039;&#039;&#039;:&lt;br /&gt;
* Jedes Alexa-Device, dessen Status aktiv zu Amazon gepusht werden soll, im Attribut &amp;quot;alexaProactiveEvents&amp;quot; mit einer &amp;quot;1&amp;quot; versehen. Per Default wird &#039;&#039;kein&#039;&#039; Gerät laufend aktiv zu Amazon gepusht!&lt;br /&gt;
* das geänderte Device einmal zu Amazon pushen &amp;quot;set &amp;lt;alexa&amp;gt; add &amp;lt;device&amp;gt;&amp;quot; (oder &#039;Alexa, suche neue Geräte&#039; murmeln)&lt;br /&gt;
* Das Gerät sollte jetzt beim Anlegen einer neuen Routine (&amp;quot;Neue Routine&amp;quot;, &amp;quot;Wenn Folgendes passiert&amp;quot;, &amp;quot;Smart Home&amp;quot;) als möglicher Triggerpunkt erscheinen.&lt;br /&gt;
&lt;br /&gt;
==== Dummygeräte: ====&lt;br /&gt;
Ein Dummydevice sollte einen Kontaktschalter oder Bewegungssensor simulieren, um dann in FHEM eine beliebige Bedingung als Trigger zu definieren, und eine freie Ansage in Alexa als Routine zu definieren. Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
define voicetrigger1 dummy&lt;br /&gt;
attr voicetrigger1 alexaName Trigger 1&lt;br /&gt;
attr voicetrigger1 alexaProactiveEvents 1&lt;br /&gt;
attr voicetrigger1 genericDeviceType contact&lt;br /&gt;
attr voicetrigger1 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;;open:CONTACT_NOT_DETECTED&lt;br /&gt;
attr voicetrigger1 readingList 0:closed 1:open&lt;br /&gt;
attr voicetrigger1 setList closed open&lt;br /&gt;
&lt;br /&gt;
set alexa add voicetrigger1&lt;br /&gt;
set alexa restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fehlersuche:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Push setzt ein intaktes Push-Token voraus. Sollte im Alexa-Logfile Folgendes erscheinen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;failed to refresh token: invalid_grant: &#039;The request has an invalid grant parameter : refresh_token&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
so ist das Push-Token nicht aktuell. Weil die Auswirkung lange nur war, dass Geräteänderungen nicht aktiv an Amazon gemeldet wurden, gibt es noch keine umfassende Analyse des Problems. Es lässt sich lösen, indem eine oder beide folgenden Aktionen ausgeführt werden:&lt;br /&gt;
* Löschen des &amp;quot;.eventToken&amp;quot; im Alexa-Device über &amp;quot;deletereading&amp;quot;&lt;br /&gt;
* &amp;quot;FHEM-Connector&amp;quot;-Skill auf &amp;quot;alexa.amazon.de&amp;quot; einmal deaktivieren und dann neu verbinden&lt;br /&gt;
&lt;br /&gt;
== Mögliche Probleme und Lösungen ==&lt;br /&gt;
&lt;br /&gt;
Es kann vorkommen, dass Geräte zwar korrekt erkannt werden, aber das durch Alexa erkannte Kommando nicht richtig umgesetzt wird (Beispiel - mittlerweile behoben: {{Link2Forum|Topic=96766}}). Neben dem FHEM-Log gibt es noch das Logfile, welches von alexa-fhem angelegt wird. &lt;br /&gt;
&lt;br /&gt;
=== Fehlersuche über die FHEM-Oberfläche ===&lt;br /&gt;
&lt;br /&gt;
* alexa-fhem Logfile anschauen (Detail-Ansicht des &amp;lt;alexa&amp;gt;-Device aufrufen, klick auf &#039;&#039;&#039;Logfile&#039;&#039;&#039; oben)&lt;br /&gt;
* alexa-fhem im Debug-Modus aufrufen:&lt;br /&gt;
** -D zum alexaFHEM-params attribut hinzufügen&lt;br /&gt;
** Alexa-Befehl auslösen&lt;br /&gt;
** -D aus dem alexaFHEM-params attribut entfernen&lt;br /&gt;
* Die notwendigen Informationen finden sich in dem alexa-Logfile (siehe oben)&lt;br /&gt;
&lt;br /&gt;
=== Fehlersuche über Kommandozeile (lies: Shell) + FHEM-Oberfläche ===&lt;br /&gt;
&lt;br /&gt;
:* set &amp;lt;alexa&amp;gt; stop (FHEM-Oberfläche)&lt;br /&gt;
:* Auf der Kommandozeile &amp;lt;code&amp;gt;alexa-fhem -D -c /opt/fhem/alexa-fhem.cfg &amp;gt; debug.log&amp;lt;/code&amp;gt; starten (dadurch wird die Datei debug.log erzeugt im aktuellen Verzeichnis)&lt;br /&gt;
:* Alexa-Befehl auslösen&lt;br /&gt;
:* alexa-fhem auf der Kommandozeile wieder stoppen (CTRL-C)&lt;br /&gt;
:* set &amp;lt;alexa&amp;gt; start (FHEM-Oberfläche)&lt;br /&gt;
&lt;br /&gt;
Die Datei debug.log sollte Hinweise enthalten, wie das Problem zu lösen ist oder Dich zumindest in die richtige Richtung schieben.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel aus dem Forum fand sich in dem Logfile der Hinweis darauf, dass das Device mit falschen min/max-Werten unterwegs war.&lt;br /&gt;
&lt;br /&gt;
=== Registrierungskey vergessen, Registrierung zurücksetzen ===&lt;br /&gt;
&lt;br /&gt;
Auf der Kommandoshell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de status&lt;br /&gt;
Registered.&lt;br /&gt;
Registered on 2019-01-13T15:38:13Z.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
heisst, das der Vereinsserver eigentlich alles hat, was er will. Es wird kein neuer Schlüssel generiert.&lt;br /&gt;
Wenn Du die Situation zurücksetzen möchtest, wäre die hässliche Methode, Deinen SSH-Key zu löschen. Eleganter ist, die Registrierung auf Vereinsseite zu löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:90%;&amp;quot;&amp;gt;&lt;br /&gt;
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de unregister&lt;br /&gt;
Your registration has been removed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
löscht Deinen Schlüssel mitsamt allen dort gespeicherten Daten auf Vereinsseite. Bei Restart von alexa-fhem in FHEM-WEB wird jetzt ein neuer Registrierungskey angefordert.&lt;br /&gt;
&lt;br /&gt;
== Sicherheitskonzept und Secrets ==&lt;br /&gt;
&lt;br /&gt;
Um diesen Abschnitt zu verstehen, solltest Du den Abschnitt &amp;quot;Arbeitsweise&amp;quot; im Kopf haben. Einerseits ist Dir vermutlich einleuchtend, dass ein Server, der per SSH rückwärts nur ausgewählte Kommandos in den Tunnel, den Du aufgebaut hast, leitet, &amp;quot;irgendwie sicherer&amp;quot; ist. Andererseits möchte man nicht blind vertrauen.&lt;br /&gt;
&lt;br /&gt;
=== SSH ===&lt;br /&gt;
==== SSH - macht das nichts Gefährliches? ====&lt;br /&gt;
SSH ist ein Veteran des Internet und entstand, um sich sicher (verschlüsselt) und schnell auf Servern einzuloggen. Schon früh wurde dabei der sogenannte &amp;quot;Reverse-Tunnel&amp;quot; implementiert: Also der vom Client (Deinem Rechner) geäußerte Wunsch: &amp;quot;Bitte leite mir Requests, die bei Dir, Server, auf Port xy eingehen, an meinen lokalen Port yz weiter.&amp;quot;. Dieses Verfahren implementiert der Reverseproxy, wobei tatsächlich auf dem Server für Dich kein echter Port geöffnet wird.&lt;br /&gt;
&lt;br /&gt;
Wie Dir ggf. sicher der Unix-Guru Deines Vertrauens bestätigen wird: Die Kombination&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
ssh -R 1234:localhost:&amp;lt;zufälliger port&amp;gt; zielserver &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
erlaubt keine Ausführung von Shell-Kommandos auf Deinem Server, sondern einzig, dass vom SSH-Programm Verbindungen zu einem lokalen Port auf Deinem Server auf dem alexa-fhem lauscht aufgebaut werden. Du kannst also z.B. mit einem&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo /usr/sbin/tcpdump -X -s 0 -i lo port &amp;lt;zufälliger port&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
vollständig überwachen (oder ggf. permanent aufzeichen), was auf Deinem Server von außen gesteuert passiert.&lt;br /&gt;
&lt;br /&gt;
==== Wie wird bei SSH verschlüsselt? ====&lt;br /&gt;
Im Prinzip wie im Web auf SSL-Seiten, teils mit den gleichen Verschlüsselungsverfahren. Allerdings arbeitet SSH eher wie das im Web recht seltene Verfahren: Bei jeder Verbindung übermitteln sowohl Server wie auch Client den öffentlichen Teil ihres Schlüssels. Anders als im Web wird der Schlüssel aber nicht von einer öffentlichen Zertifizierungsstelle wie &amp;quot;LetsEncrypt&amp;quot; unterschrieben. Stattdessen entscheiden Server wie Client beim ersten Verbindungsaufbau typischerweise per manueller Frage: &amp;quot;Willst Du jetzt und künftig diesem Schlüssel vertrauen?&amp;quot; Bei der Installation wird diese Frage für Deine Seite bejaht, und fortan wird der öffentliche Schlüssel des FHEM-Servers auf Deinem Rechner gespeichert. Ab da bist Du z.B. davor sicher, dass jemand den DNS-Eintrag verbiegt oder sich in den Datenfluss Deines Providers einhängt: Ein geänderter Serverschlüssel würde bemerkt werden.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Soweit klar? Aus Deinem öffentlichen Schlüssel wiederum leitet der Server her: &amp;quot;Das ist definitiv wieder derjenige, der sich damals &amp;quot;registriert&amp;quot; hat&amp;quot;. Und an dieser Stelle kann ich auch den &amp;lt;b&amp;gt;ersten Teil des 3-teiligen Registrierungskeys&amp;lt;/b&amp;gt; erläutern: Die typischerweise 6-stellige Hex-Zahl am Anfang ist der Java-Hashcode Deines öffentlichen Schlüssel. Sie ist damit sozusagen Deine aus Deinem öffentlichen Schlüssel abgeleitete Benutzer-ID.&lt;br /&gt;
&lt;br /&gt;
=== Die Rolle der Secrets ===&lt;br /&gt;
Wenn jetzt klar ist, dass die Verbindung zum Vereinsserver sicher und vertauschungsfrei funktioniert, bleiben noch 2 Probleme zu lösen:&lt;br /&gt;
1) Im Web bei der Skill-Aktivierung musst Du beweisen, dass Du der Mensch am Browser bist, dem der SSH-Tunnel von IP xy mit dem öffentlichen Schlüssel X gehört. Bei der automatischen Registrierung werden lokal auf Deinem Rechner zwei 64-Bit-Secrets generiert:&lt;br /&gt;
* Das &amp;lt;b&amp;gt;Anmelde&amp;lt;/b&amp;gt;-Secret&lt;br /&gt;
* Das &amp;lt;b&amp;gt;Bearer&amp;lt;/b&amp;gt;-Token&lt;br /&gt;
Beim Anmelden des SSH-Keys auf dem öffentlichen Server wird nun der &amp;lt;b&amp;gt;Hashwert&amp;lt;/b&amp;gt; des ersten Secrets übertragen und dort in Verbindung mit Deinem öffentlichen Schlüssel gespeichert. Ein Hashwert bedeutet, dass (sofern das Verfahren, hier SHA256, funktioniert), niemand aus dem Hash das Secret zurückrechnen kann. Ein Datenbankklau auf dem Server gefährdet also nicht die Sicherheit Deines Passwortes.&lt;br /&gt;
&lt;br /&gt;
Wenn Du nun beim Skill-Aktivieren den Registrierungskey eingibst, dann &amp;quot;sieht&amp;quot; der Server zum ersten Mal Dein ausgewürfeltes Secret, vergleicht es mit dem Hashwert und wird es anschließend wieder umgehend vergessen. Anhand des Hashwertes kann der Server aber entscheiden, dass Du der legitime Nutzer zum öffentlichen Schlüssel XY bist.&lt;br /&gt;
&lt;br /&gt;
2) Das zweite Problem ist: Wie soll Amazon &amp;quot;beweisen&amp;quot;, dass sie der legitime Aufrufer sind? Amazon erhält binnen wenigen Sekunden nach dem Klick auf &amp;quot;Activate Skill&amp;quot; den &amp;lt;b&amp;gt;dritten Teil&amp;lt;/b&amp;gt; des Registrierungskeys als sogenanntes Bearer-Token. Zwar läuft er durch den Registrierungsserver, er wird dort, auf dem Registrierungs/Vereinsserver aber nicht gespeichert. Das Bearer-Token wird von Amazon bei allen Requests zu Deinem Server mitgesendet. Da es am Anfang zusätzlich Deine &amp;quot;User-ID&amp;quot; enthält, weiß der Vereinsserver, zu welchem SSH-Tunnel der Request zu senden ist. Aber lokal auf Deinem Rechner wird ausgewertet, ob das Token &amp;quot;stimmt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== alexa-fhem Updaten bzw. &amp;quot;Upgraden&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Updaten einer &amp;quot;Connector&amp;quot; Installation:&#039;&#039;&#039;&lt;br /&gt;
* alexa-fhem über FHEM anhalten (Name des Alexa-Device: alexa):&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;set alexa stop&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Auf der Konsole wie anfangs bei der Installation:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo npm update -g alexa-fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Manchmal hat npm Probleme mit einem Update. Dann einfach die aktuelle Version noch mal drüber Installieren: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo npm install -g alexa-fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*alexa-fhem über FHEM wieder starten:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;set alexa start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Upgraden von einer &amp;quot;Nicht-Connector&amp;quot; Installation (z.B. manuelle Installation per pm-Download):&#039;&#039;&#039;&lt;br /&gt;
* Daten der aktuellen Installation sichern (v.a. config.json / man weiß ja nie)&lt;br /&gt;
* Autostart der aktuellen alexa-fhem Installation deaktivieren:&lt;br /&gt;
** Bei initd: Service deaktivieren mittels: &amp;lt;code&amp;gt;sudo update-rc.d -f alexa remove&amp;lt;/code&amp;gt; Vorher mittels stoppen: &amp;lt;code&amp;gt;sudo service alexa stop&amp;lt;/code&amp;gt; Startscript unter /etc/init.d/ löschen.&lt;br /&gt;
** Bei systemd: Service deaktivieren mittels: &amp;lt;code&amp;gt;sudo systemctl disable alexa&amp;lt;/code&amp;gt; Vorher mittels stoppen: &amp;lt;code&amp;gt;sudo systemctl alexa stop&amp;lt;/code&amp;gt; Startscript unter /etc/systemd/system/ löschen.&lt;br /&gt;
* ALLE vorhandenen alexa-fhem Daten LÖSCHEN! Bleiben Dinge zurück und wird dann laut Connector installiert kann es zu Problemen kommen!&lt;br /&gt;
* (reboot)&lt;br /&gt;
* Installation von alexa-fhem laut Anleitung (Beginn dieses Wiki)&lt;br /&gt;
* Falls eigene Dinge von früher genutzt werden wollen/sollen (z.B. Custom Skill), dann die entsprechenden Einträge aus der gesicherten config.json in die neu angelegte alexa-fhem.cfg (zu finden unter &amp;quot;Edit files&amp;quot;) übernehmen.&lt;br /&gt;
* Werden keine eigenen Dinge verwendet, dann kann der Port (Standard: 3000) geschlossen werden und auch die Daten unter Amazon-Developer können gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
== Bug- und Wunschliste ==&lt;br /&gt;
* Ist beim Start keine Internetverbindung vorhanden, erfolgt kein Retry -- alexa-fhem muss restartet werden (ssh_autoconfig wertet keine temporären Fehler aus)&lt;br /&gt;
&lt;br /&gt;
==Weitergehende Informationen==&lt;br /&gt;
*[[Alexa und Mappings]]&lt;br /&gt;
*[[Alexa Tipps und Kniffe]]&lt;br /&gt;
*[[FHEM Connector for Amazon Alexa]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=32962</id>
		<title>MQTT2-Module - Praxisbeispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=32962"/>
		<updated>2020-03-16T15:27:01Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Allgemeines */Tippfehler korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung: MQTT bzw. MQTT2 in FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] oder benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht&amp;lt;ref&amp;gt;Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden&amp;lt;/ref&amp;gt;. MQTT2_DEVICE unterstützt u.a. auch die &#039;&#039;setExtensions&#039;&#039; direkt, also z.B. &#039;&#039;on-for-timer&amp;lt;ref&amp;gt;Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die &#039;&#039;split&#039;&#039;-Varianten der attrTemplate-Einrichtung zu verwenden.&amp;lt;/ref&amp;gt;&#039;&#039; sowie &#039;&#039;[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]&#039;&#039;&amp;lt;ref&amp;gt;Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muß dies dort per Attribut eingeschaltet werden&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Einstellungen und Hinweise ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für autocreate in Verbindung mit MQTT2_SERVER &#039;&#039;&#039;zwingend&#039;&#039;&#039; jeder über MQTT kommunizierende Client eine ClientID angeben muß. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch &amp;quot;Wegwerf&amp;quot;-ClientID&#039;s. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit &#039;&#039;&#039;MQTT2_SERVER als Server (&amp;quot;Broker&amp;quot;)&#039;&#039;&#039;, für diesen sollte dabei &#039;&#039;autocreate&#039;&#039; nicht deaktiviert sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden&amp;lt;ref&amp;gt;Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) ebenfalls aktiv ist.&amp;lt;/ref&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Beispiel&amp;lt;ref&amp;gt;MQTT2_SERVER verwendet als default-Einstellung für &#039;&#039;autocreate&#039;&#039; &#039;&#039;simple&#039;&#039;, ohne dass ein entsprechendes Attribut gesetzt werden müßte. Die Einstellung &#039;&#039;complex&#039;&#039; empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 define MQTT2_FHEM_Server MQTT2_SERVER 1883 global&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muß ggf. die &amp;quot;\&amp;quot; entfernen!}}&lt;br /&gt;
&lt;br /&gt;
=== MQTT-Einstellungen in den Geräten ===&lt;br /&gt;
Die Beispiele gehen davon aus, dass die einzubindenden Geräte &#039;&#039;&#039;&#039;&#039;mit den default-Einstellungen&#039;&#039;&#039;&#039;&#039; für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere &#039;&#039;&#039;keine Veränderungen der topic-Pfade&#039;&#039;&#039; vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen.  }}&lt;br /&gt;
&lt;br /&gt;
== zigbee2mqtt ==&lt;br /&gt;
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]&lt;br /&gt;
[https://github.com/Koenkk/zigbee2mqtt zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.&lt;br /&gt;
=== Installation von zigbee2mqtt ===&lt;br /&gt;
Die Installation des zigbee2mqtt-Diensts ist auf der Homepage des Projekts beschrieben. Ergänzend muß in der configuration.yaml eine &#039;&#039;client_id&#039;&#039; unter &#039;&#039;mqtt&#039;&#039; (z.B. zigbee_pi) vergeben werden&amp;lt;ref&amp;gt;Die Anführungszeichen sowie genau zwei Leerzeichen sind hier erforderlich!&amp;lt;/ref&amp;gt;.&lt;br /&gt;
 mqtt:&lt;br /&gt;
   client_id: &#039;zigbee_pi&#039;&lt;br /&gt;
Da der Dienst auch später in den Anlernmodus versetzt werden kann, kann man auch gleich &amp;lt;code&amp;gt;permit_join: false&amp;lt;/code&amp;gt; setzen, um das versehentliche Einbinden neuer oder fremder Geräte zu unterbinden.&lt;br /&gt;
{{Hinweis|Wird ein CC2531 auf demselben Linux-Computer verwendet, auf dem auch FHEM installiert ist, kann es vorkommen, dass FHEM diesen mit einem CUL verwechselt und durch &#039;&#039;initialUsbCheck&#039;&#039; in FHEM einbindet, wodurch er für den zigbee2mqtt-Dienst nicht mehr verfügbar ist. Dann sollte &#039;&#039;initialUsbCheck&#039;&#039; deaktiviert und das automatisch angelegte CUL-Device wieder gelöscht werden. Weiter sollte der CC2531 auch in FHEM &#039;&#039;&#039;und&#039;&#039;&#039; zigbee2mqtt &#039;&#039;[[Mehrere USB-Geräte einbinden|by-id]]&#039;&#039; eingebunden werden, um Probleme beim gleichzeitigen Einsatz anderer Geräte, die &#039;&#039;/dev/ttyACMx&#039;&#039; belegen können, zu vermeiden (betrifft z.B. CUL/MapleCUL ).}}&lt;br /&gt;
&lt;br /&gt;
=== Define eines MQTT2-Devices als &amp;quot;Bridge&amp;quot; === &lt;br /&gt;
Dann kann eine Art &amp;quot;Grund-Device&amp;quot; angelegt werden, das für die Ansteuerung des eigentlichen Server-Dienstes genutzt wird, der bereits unmittelbar nach der erfolgreichen Konfiguration von zigbee2mqtt zur Verfügung steht. In der Regel sollte dieses automatisch erstellt werden, wenn der zigbee2mqtt-Dienst (oder der betreffende Rechner) neu gestartet wird (oder FHEM oder dort ein Sensor einen Messwert sendet). Beispiel&amp;lt;ref&amp;gt;Hier waren bereits zwei Zigbee-Geräte angelernt&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 defmod MQTT2_zigbee_pi MQTT2_DEVICE zigbee_pi&lt;br /&gt;
 attr MQTT2_zigbee_pi IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_zigbee_pi readingList zigbee_pi:zigbee2mqtt/bridge/state:.* state\&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/0x90fd9ffffe65db16:.* { json2nameValue($EVENT, &#039;&#039;) }\&#039;&#039;&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/0x90fd9ffffe0bcd51:.* { json2nameValue($EVENT, &#039;&#039;) }\&#039;&#039;&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/bridge/log:.* { json2nameValue($EVENT, &#039;log_&#039;) }&lt;br /&gt;
 attr MQTT2_zigbee_pi room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Für die Funktion einer zigbee2mqtt-Bridge steht ein {{Link2CmdRef|Anker=set|Lang=en|Label=template}} bereit, das direkt die passenden Attribute vergibt, um dem zigbee2mqtt-Dienst passende Anweisungen geben zu können und weitere Geräte für die eigentlichen Aktoren und Sensoren anzulegen:&lt;br /&gt;
&lt;br /&gt;
 set MQTT2_zigbee_pi attrTemplate zigbee2mqtt_bridge&lt;br /&gt;
&lt;br /&gt;
Ist dieses angelegt, kann zigbee2mqtt mit &amp;lt;code&amp;gt;set MQTT2_zigbee_pi permit_join true&amp;lt;/code&amp;gt; in den Anlernmodus versetzt werden, anzulernende Geräte müssen anschließend jeweils nach Bedienungsanleitung in den Anlernmodus gebracht werden.&lt;br /&gt;
&lt;br /&gt;
=== Vereinzeln der eigentlichen Geräte ===&lt;br /&gt;
&lt;br /&gt;
Über das mit dem template vergebene bridgeRegexp-Attribut  &lt;br /&gt;
 attr MQTT2_zigbee_pi bridgeRegexp zigbee2mqtt/([A-Za-z0-9]*)[/]?.*:.* &amp;quot;zigbee_$1&amp;quot; &lt;br /&gt;
werden anschließend neue MQTT2_DEVICE-Geräte automatisch angelegt, sobald ein bisher unbekanntes Zigbee-Gerät einen neuen Status (z.B. einen Meßwert) meldet. Um zu erfragen, welche Geräte dem zigbee-Deinst bekannt sind, kann via &amp;lt;code&amp;gt;get MQTT2_zigbee_pi devicelist true&amp;lt;/code&amp;gt; eine Liste abgefragt werden, die weitere Informationen zu den bereits angelernten Geräten enthält.&lt;br /&gt;
Geräte, die nicht automatisch etwas senden, kann man mit Hilfe des MQTT2_SERVER-Geräts einmalig schalten, damit diese ihren Status bzw. das erfolgreiche Schalten zurückmelden, Beispiel&amp;lt;ref&amp;gt;Die mit 0x... beginnende Angabe entspricht dabei dem &#039;&#039;friendly_name&#039;&#039;.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;ON&amp;quot;,&amp;quot;brightness&amp;quot;:60}&lt;br /&gt;
&lt;br /&gt;
Für Gerätetypen, für die bereits templates vorhanden sind, ist es am einfachsten, diese einmalig auf die Geräte anzuwenden. Das Vorgehen entspricht dabei dem oben für die Bridge beschriebenen. Dafür wird immer vorausgesetzt, dass ein neues Device mit autocreate (ggf. über die bridgeRegexp) angelegt wurde&amp;lt;ref&amp;gt;Dieses befindet sich dann im Raum MQTT2_DEVICE. Um diesen sichtbar zu machen, muß ggf. die Browser-Seite neu geladen werden.&amp;lt;/ref&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
==== IKEA-Tradfri-Birne ====&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Wie wähle ich nun das richtige Template für mein Leuchtmittel aus?&lt;br /&gt;
-&amp;gt; Es wird nicht zwischen einer Birne/Bulb/Lampe und einem LED-Controller unterschieden sondern anhand der möglichen Lichtdarstellung des Gerätes:&lt;br /&gt;
&lt;br /&gt;
light_dimmer:&lt;br /&gt;
Das anzusteuernde Geräte besitzt ausschließlich eine feste Lichtfarbe welche gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_cct:&lt;br /&gt;
Das anzusteuernde Gerät besitzt eine warmweiße sowie kaltweiße Lichtfarbe welche verändert sowie gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_rgb_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und kann gedimmt werden.&lt;br /&gt;
&lt;br /&gt;
light_rgbw_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und besitzt eine warmweiße ODER kaltweiße Lichtfarbe welche eingestellt sowie gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_rgbcct_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und besitzt eine warmweiße UND kaltweiße Lichtfarbe welche verändert sowie gedimmt werden kann.&lt;br /&gt;
   &lt;br /&gt;
   xxx:&lt;br /&gt;
      hex:   Farbänderung mit hex&lt;br /&gt;
      rgb:   Farbänderung mit r g b&lt;br /&gt;
      xy:   Farbänderung mit x sowie y&lt;br /&gt;
      hue:   Farbänderung mit hue und saturation&lt;br /&gt;
&lt;br /&gt;
Warum diese Einteilung in &amp;quot;hex&amp;quot;, &amp;quot;rgb&amp;quot;, &amp;quot;xy&amp;quot; sowie &amp;quot;hue&amp;quot;?&lt;br /&gt;
-&amp;gt; Zigbee2MQTT unterstützt das Übermitteln aller dieser Werte, allerdings unterscheiden sich hier die Geräte. Manche &amp;quot;verstehen&amp;quot; nur z.B. Hex-Farbänderungen, andere halt nur eine Farbänderung mit rgb-Werten.&lt;br /&gt;
-&amp;gt; Aus diesem Grund muss an dieser Stelle probiert werden mit welchem der 4 Templates sich die Farbveränderung des Gerätes steuern lässt!&lt;br /&gt;
&lt;br /&gt;
HINWEIS: Templates für Farbänderungen mithilfe von XY- sowie HUE-Werten wurden bis heute nicht angelegt!&lt;br /&gt;
}}&lt;br /&gt;
Beispiel eines dimmbaren Tradfri-Leuchtmittels&lt;br /&gt;
 defmod IKEA_Bulb2 MQTT2_DEVICE&lt;br /&gt;
 attr IKEA_Bulb2 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr IKEA_Bulb2 icon light_control&lt;br /&gt;
 attr IKEA_Bulb2 devStateIcon {zigbee2mqtt_devStateIcon255($name)}&lt;br /&gt;
 attr IKEA_Bulb2 readingList zigbee_pi:zigbee2mqtt/0x90fd9ffffe0bcd51:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr IKEA_Bulb2 setList on:noArg zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
     off:noArg zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
     brightness:colorpicker,BRI,0,15,255 zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;on&amp;quot;,&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr IKEA_Bulb2 webCmd toggle:on:off:brightness&lt;br /&gt;
 attr IKEA_Bulb2 model L_02a_zigbee2mqtt_bulb&lt;br /&gt;
&lt;br /&gt;
Kann man auch die Farbtemperatur einstellen, wird die setList wie folgt erweitert oder das entsprechende template&amp;lt;ref&amp;gt;Durch die &#039;&#039;model&#039;&#039;-Angabe kann nachvollzogen werden, welches template angewendet wurde.&amp;lt;/ref&amp;gt; anwendet:&lt;br /&gt;
 ...&lt;br /&gt;
 color_temp:colorpicker,CT,250,1,454 zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Die templates sind dabei in der Regel so gestaltet, dass eventuell mehr Optionen in FHEMWEB erscheinen, als tatsächlich vorhanden oder erwünscht sind. &lt;br /&gt;
Da sich obige einfarbige dimmbare Lampe durch Klicken auf das devStateIcon schalten läßt, ist für die vollständige Ansteuerung bereits dieses webCmd hinreichend:&lt;br /&gt;
 attr IKEA_Bulb2 webCmd brightness&lt;br /&gt;
&lt;br /&gt;
==== Temp/Hum. Sensor ====&lt;br /&gt;
tbd&lt;br /&gt;
&lt;br /&gt;
==== Motion Sensor ====&lt;br /&gt;
Als MQTT-Server wird hier &#039;&#039;mosquitto&#039;&#039; verwendet, als IO-Device wird daher ein {{Link2CmdRef|Anker=MQTT2_CLIENT|Lang=en|Label=MQTT2_CLIENT}}-Gerät definiert: &lt;br /&gt;
&lt;br /&gt;
 defmod mqtt2_client MQTT2_CLIENT 192.168.2.4:1883&lt;br /&gt;
 attr mqtt2_client autocreate 1&lt;br /&gt;
 attr mqtt2_client rawEvents zigbee2mqtt/GB_Bewegungsmelder:.*&lt;br /&gt;
 attr mqtt2_client room test&lt;br /&gt;
 attr mqtt2_client subscriptions #&lt;br /&gt;
&lt;br /&gt;
Das eigentliche Device sieht dann so aus:&lt;br /&gt;
 defmod GB_Bewegungsmelder_MQTT2 MQTT2_DEVICE zigbee_158d0001f9d030&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 IODev mqtt2_client&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 devStateIcon motion:motion_detector@red off:motion_detector@green no_motion:motion_detector@green&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 icon motion_detector@blue&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 readingList mqtt2client:zigbee2mqtt/GB_Bewegungsmelder:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 room MQTT2_DEVICE&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 stateFormat {\&lt;br /&gt;
 if(ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;occupancy&amp;quot;,0) eq &amp;quot;true&amp;quot;) {\&lt;br /&gt;
 	sprintf(&amp;quot;motion&amp;quot;);;\&lt;br /&gt;
 	} else {\&lt;br /&gt;
 	sprintf(&amp;quot;no_motion&amp;quot;);;	\&lt;br /&gt;
 	}\&lt;br /&gt;
 }&lt;br /&gt;
==== Anlegen von Zigbee2MQTT-Gruppen in FHEM ====&lt;br /&gt;
{{Hinweis|Die nachfolgende Darstellung ist vorläufig!}}&lt;br /&gt;
{{Hinweis|Bevor man eine Gruppe mithilfe von Zigbee2MQTT anlegen kann, sollte man sicherstellen, dass man über die aktuelleste Version von Zigbee2MQTT verfügt (min. vom 15. Februar 2019). Außerdem sollte auch der Koordinator (zumeist CC2531) die aktuellste Firmware besitzen (min. vom 15. Februar 2019). Falls ein flashen des Koordinators mit der neusten Firmware erfolgen soll, ist darauf zu achten, dass nach einem flashen alle Geräte neu angelernt werden müssen! (Hinweise zum flashen ohne erneutem anlernen sind hier zu finden: https://www.zigbee2mqtt.io/information/flashing_without_re-pairing.html)}}&lt;br /&gt;
&lt;br /&gt;
=====Erstellen einer Zigbee2MQTT-Gruppe=====&lt;br /&gt;
Bevor das Ganze in FHEM funktioniert, muss eine Gruppe in der &amp;quot;configuration.yaml&amp;quot; angelegt werden, dieser Vorgang ist auf folgender Seite beschrieben: https://www.zigbee2mqtt.io/information/groups.html&lt;br /&gt;
Wenn die Geräte anschließend über den FHEM MQTT2-Server der Gruppe hinzugefügen werden sollen, kann dies mit folgendem Befehl erfolgen:&lt;br /&gt;
 set &amp;lt;MQTT2-Server&amp;gt; publish zigbee2mqtt/bridge/group/&amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;/add &amp;lt;Zigbee2MQTT Friendly-Gerätename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/bridge/group/Wohnzimmer/add Stehlampe&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl kann so oft verwendet werden, wie man Geräte zu einer Gruppe hinzufügen möchte.&lt;br /&gt;
&lt;br /&gt;
Zum Entfernen eines Gerätes aus einer Gruppe kann folgender Befehl verwendet werden:&lt;br /&gt;
 set &amp;lt;MQTT2-Server&amp;gt; publish zigbee2mqtt/bridge/group/&amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;/remove &amp;lt;Zigbee2MQTT Friendly-Gerätename&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/bridge/group/Wohnzimmer/remove Kuechenlampe&lt;br /&gt;
&lt;br /&gt;
=====Anlegen der Gruppe in FHEM=====&lt;br /&gt;
Da Gruppen in Zigbee2MQTT aktuell keine Rückmeldung über ihren Status geben, wird auch beim einmaligen Schalten kein Gerät automatisch in FHEM angelegt. Aus diesem Grund muss dies mit folgendem Befehl noch manuell erfolgen:&lt;br /&gt;
 defmod &amp;lt;FHEM NAME&amp;gt; MQTT2_DEVICE&lt;br /&gt;
Beispiel&lt;br /&gt;
 defmod lichtWohnzimmer MQTT2_DEVICE&lt;br /&gt;
Anschließend wird auch für dieses Gerät wieder ein passendes template ausgewählt, wie als wäre es ein normales Zigbee2MQTT-Gerät.&lt;br /&gt;
Im anschließenden Dialog-Fenster welches sich nach dem Setzen des templates öffnet, müssen die folgenden Werte durch passendes ersetzt werden:&lt;br /&gt;
 BASE_TOPIC -&amp;gt; zigbee2mqtt&lt;br /&gt;
 DEV_ID -&amp;gt; &amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach sollte sich die Gruppe wie ein normales Zigbee2MQTT Gerät steuern lassen.&lt;br /&gt;
&lt;br /&gt;
== Tasmota ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. &lt;br /&gt;
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter &#039;&#039;&amp;lt;nowiki&amp;gt;topic = %topic% (tasmota)&amp;lt;/nowiki&amp;gt;&#039;&#039; ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem  Eingabefeld für &#039;&#039;&amp;quot;client ...&amp;quot;&#039;&#039;, siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
=== MQTT2_DEVICE ===&lt;br /&gt;
Dieses sollte bei aktiviertem &#039;&#039;autocreate&#039;&#039; am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen ===&lt;br /&gt;
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden:  &lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD IODev m2server&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    DVES_9B01BD:cmnd/DVES_9B01BD/POWER:.* POWER\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr MQTT2_DVES_9B01BD room MQTT2_DEVICE&lt;br /&gt;
 attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\&lt;br /&gt;
    off cmnd/DVES_9B01BD/POWER off\&lt;br /&gt;
    reboot cmnd/DVES_9B01BD/Restart 1&lt;br /&gt;
 attr MQTT2_DVES_9B01BD webCmd on:off:reboot&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
&lt;br /&gt;
===== Allgemeines =====&lt;br /&gt;
Für gängige Tasmota-Geräte stehen &#039;&#039;templates&#039;&#039; bereit, mit denen sich diese schnell konfigurieren lassen. &lt;br /&gt;
Beachten Sie dazu den Abschnitt &#039;&#039;attrTemplate&#039;&#039; in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}&lt;br /&gt;
&lt;br /&gt;
===== Kein passendes attrTemplate vorhanden? =====&lt;br /&gt;
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das &amp;quot;&#039;&#039;tasmota_basic&#039;&#039;&amp;quot; anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults &amp;quot;ON&amp;quot; bzw. &amp;quot;OFF&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Allerdings stellt dieses das &#039;&#039;autocreate&#039;&#039; an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das &#039;&#039;autocreate&#039;&#039;-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im &#039;&#039;jsonMap&#039;&#039;-Attribut nur die Angabe &amp;quot;&#039;&#039;POWER1:state&#039;&#039;&amp;quot; zu belassen.&lt;br /&gt;
&lt;br /&gt;
=== on-for-timer ===&lt;br /&gt;
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen &#039;&#039;setter&#039;&#039; in der &#039;&#039;setList&#039;&#039; werden die &#039;&#039;&#039;SetExtensions&#039;&#039;&#039; verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:&lt;br /&gt;
&lt;br /&gt;
==== delay ==== &lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039;:&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1*10; &#039;cmnd/DVES_575127/Backlog POWER1 1; delay &#039;.$duration.&#039;; POWER1 0&#039;}&lt;br /&gt;
&lt;br /&gt;
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe https://github.com/arendst/Tasmota/wiki/Commands#delay), also eine Stunde.&lt;br /&gt;
&lt;br /&gt;
====pulseTime ====&lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039;:&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1 &amp;lt; 11.2 ? $EVTPART1*10 : $EVTPART1+100; &#039;CMNDTOPIC/Backlog pulseTime1 &#039;.$duration.&#039;; POWER1 1&#039;}&lt;br /&gt;
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit &#039;&#039;delay&#039;&#039;. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren &amp;quot;normalen&amp;quot; Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites &#039;&#039;save&#039;&#039; nur bis zum nächsten reboot des Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
== ESPurna ==&lt;br /&gt;
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool&#039;sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als &amp;quot;on&amp;quot; oder &amp;quot;off&amp;quot; oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.&lt;br /&gt;
&lt;br /&gt;
== Shelly ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.&lt;br /&gt;
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen weitere Geräte angelegt und konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly1 ===&lt;br /&gt;
&lt;br /&gt;
=== Shellybulb ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate  angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
 Internals:&lt;br /&gt;
   CFGFN     &lt;br /&gt;
   CID        shellybulb_3CC533&lt;br /&gt;
   DEF        shellybulb_3CC533&lt;br /&gt;
   DEVICETOPIC MQTT2_shellybulb_3CC533&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   NAME       MQTT2_shellybulb_3CC533&lt;br /&gt;
   NR         246&lt;br /&gt;
   STATE      ???&lt;br /&gt;
   TYPE       MQTT2_DEVICE&lt;br /&gt;
   READINGS:&lt;br /&gt;
     2018-12-12 19:28:08   status_blue     0&lt;br /&gt;
     2018-12-12 19:28:08   status_brightness 61&lt;br /&gt;
     2018-12-12 19:28:08   status_effect   0&lt;br /&gt;
     2018-12-12 19:28:08   status_gain     26&lt;br /&gt;
     2018-12-12 19:28:08   status_green    0&lt;br /&gt;
     2018-12-12 19:28:08   status_ison     true&lt;br /&gt;
     2018-12-12 19:28:08   status_mode     color&lt;br /&gt;
     2018-12-12 19:28:08   status_red      255&lt;br /&gt;
     2018-12-12 19:28:08   status_temp     3250&lt;br /&gt;
     2018-12-12 19:28:08   status_white    0&lt;br /&gt;
 Attributes:&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, &#039;status_&#039;) }&lt;br /&gt;
   room       MQTT2_DEVICE&lt;br /&gt;
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate &amp;quot;shellybulb&amp;quot; auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly Plug S ===&lt;br /&gt;
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb &amp;gt; 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:&lt;br /&gt;
  attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state =&amp;gt; $EVTPART0&amp;lt;100?&amp;quot;off&amp;quot;:&amp;quot;on&amp;quot; } }&lt;br /&gt;
Der Status des MQTT2 Devices zeigt dann bei &amp;lt;100W &amp;quot;off&amp;quot; und sonst &amp;quot;on&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
=== HTTP-Commands ===&lt;br /&gt;
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.&lt;br /&gt;
&lt;br /&gt;
== 8-Port-Ethernet Board ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse&lt;br /&gt;
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
In diesem [https://forum.fhem.de/index.php/topic,107536.msg1016379.html#msg1016379 Forenbeitrag] bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.&lt;br /&gt;
&lt;br /&gt;
== Milight-Bridge ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von &#039;&#039;openmili&#039;&#039; eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel.&lt;br /&gt;
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway&amp;lt;ref&amp;gt;Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist.&lt;br /&gt;
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen am MiLight-Hub ===&lt;br /&gt;
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.&lt;br /&gt;
Die Einstellungen für &#039;&#039;MQTT topic pattern&#039;&#039; usw. können auf den default-Werten&amp;lt;ref&amp;gt;Diese sind: &amp;lt;br&amp;gt;&#039;&#039;milight/:device_id/:device_type/:group_id&#039;&#039; für &amp;quot;topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/updates/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;update topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/states/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;state topic pattern&amp;quot;. Der Autor hat derzeit folgende Infotypen zum Senden markiert: &amp;quot;status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color&amp;quot; (enthält eventuell zu viele Angaben. Bei einem Eventhandler muß man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).&amp;lt;/ref&amp;gt; belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (&#039;&#039;MQTT Client Status Topic&#039;&#039;), tragen Sie &#039;&#039;milight/LWT&#039;&#039; ein und aktivieren &#039;&#039;Detailed&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Devices ===&lt;br /&gt;
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]&lt;br /&gt;
==== Bridge ====&lt;br /&gt;
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:&lt;br /&gt;
 defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses Device wird nun das &#039;&#039;template&#039;&#039; &#039;&#039;&#039;esp_milight_hub_bridge&#039;&#039;&#039; angewandt.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Leuchtmittel ====&lt;br /&gt;
&lt;br /&gt;
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:&lt;br /&gt;
 defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Devices werden genauso erstellt. &lt;br /&gt;
&lt;br /&gt;
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template &#039;&#039;X_01a_esp_milight_hub_make_rgbw_group&#039;&#039; verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt &#039;&#039;&#039;eine Kopie&#039;&#039;&#039;, die dann modifiziert wird. Diese Kopie ist unter dem Namen &#039;&#039;milight_&amp;lt;RemoteID&amp;gt;_0&#039;&#039; im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepaßt werden. &lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele:&lt;br /&gt;
Beispiel für ein RGB-CCT-Device:&lt;br /&gt;
 defmod Licht_Wz_all MQTT2_DEVICE&lt;br /&gt;
 attr Licht_Wz_all IODev MQTT2_Broker&lt;br /&gt;
 attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/&lt;br /&gt;
 attr Licht_Wz_all group Licht&lt;br /&gt;
 attr Licht_Wz_all icon light_control&lt;br /&gt;
 attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 &lt;br /&gt;
 attr Licht_Wz_all room Wohnzimmer&lt;br /&gt;
 attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
 off milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
 level milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 next_mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_up milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 device_id milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 effect milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 commands milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr Licht_Wz_all sortby 1&lt;br /&gt;
 attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue&lt;br /&gt;
 attr Licht_Wz_all webCmdLabel command\ &lt;br /&gt;
 :brightness:saturation\&lt;br /&gt;
 :color_temp:hue&lt;br /&gt;
==== Ein Leuchtmittel, mehrere Fernbedienungen ====&lt;br /&gt;
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen &amp;quot;hört&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }&lt;br /&gt;
&lt;br /&gt;
==== Fernbedienung als Input-Device nutzen ====&lt;br /&gt;
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.&lt;br /&gt;
Um hier nur Differenz-Meldungen zu erhalten und doppelte Events zu verhindern, sollte hier die readingList so angepaßt werden, dass nur Messages aus dem &amp;quot;updates&amp;quot;-Zweig ausgewertet werden: &lt;br /&gt;
 defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0&lt;br /&gt;
 attr MiLight_RC1_0 readingList milight/updates/0xABCD/fut089/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/fut089/0:.* {}&lt;br /&gt;
&lt;br /&gt;
== eBus ==&lt;br /&gt;
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition am eBus ===&lt;br /&gt;
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.&lt;br /&gt;
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. &#039;&#039;ebusd/%circuit/%name&#039;&#039;.&lt;br /&gt;
 --accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name&lt;br /&gt;
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic &#039;&#039;ebusd&#039;&#039; verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit &#039;&#039;ebus...&#039;&#039; zu beginnen!}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition  in FHEM ===&lt;br /&gt;
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem &#039;&#039;&#039;&#039;&#039;vor&#039;&#039;&#039;&#039;&#039; den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der &#039;&#039;readingList&#039;&#039; enthalten, die vom ebus stammen. Da wir die &#039;&#039;readingList&#039;&#039; anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche &#039;&#039;readingList&#039;&#039;-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-&amp;quot;Sammeldevices&amp;quot; genutzt werden, und dessen &#039;&#039;CID&#039;&#039; auf &#039;&#039;ebusd&#039;&#039; geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der &#039;&#039;readingList&#039;&#039; des &amp;quot;Sammeldevices&amp;quot; gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. &lt;br /&gt;
&lt;br /&gt;
Sind die Vorbereitungen abgeschlossen, aktivieren wir &#039;&#039;autocreate&#039;&#039; wieder, allerdings wählen wir als autocreate-Methode &#039;&#039;complex&#039;&#039; aus, da der eBus-Dämon teilweise&amp;lt;ref&amp;gt;Dies betrifft vorrangig die Statusmeldungen&amp;lt;/ref&amp;gt; eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt&amp;lt;ref&amp;gt;Bei Verwendung des MQTT2_CLIENT wird dann die &#039;&#039;readingList&#039;&#039; am bereits definierten MQTT2_DEVICE aus der Kopie des &amp;quot;Sammeldevice&amp;quot; automatisch wieder erstellt bzw. gefüllt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;ebus-Bridge&amp;quot; ====&lt;br /&gt;
Auf das von &#039;&#039;autocreate&#039;&#039; erstellte MQTT2_DEVICE wird nunmehr das template &#039;&#039;eBus_daemon_splitter&#039;&#039; angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. &lt;br /&gt;
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen &#039;&#039;uptime&#039;&#039;, alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;attrTemplate&#039;&#039; läd eine weitere &#039;&#039;attrTemplate&#039;&#039;-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. &lt;br /&gt;
==== &amp;quot;ebusd_bai&amp;quot; und weitere Geräte ====&lt;br /&gt;
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}&lt;br /&gt;
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens &#039;&#039;MQTT2_ebus_bai&#039;&#039; angelegt worden sein.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Hinweise ==&lt;br /&gt;
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===&lt;br /&gt;
Nutzt man das rawEvents-Attribut am MQTT2-IO&amp;lt;ref&amp;gt;z.B. &amp;lt;code&amp;gt;attr MQTT2_FHEM_Server rawEvents .*&amp;lt;/code&amp;gt;, der regex-Filter kann wie üblich angepaßt werden&amp;lt;/ref&amp;gt;, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.&lt;br /&gt;
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit &amp;lt;code&amp;gt;attr mqtt2_server verbose 5&amp;lt;/code&amp;gt; auch alles ins FHEM-Log schreiben lassen.&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; genutzt werden. &lt;br /&gt;
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate: Es werden nicht alle templates angezeigt ===&lt;br /&gt;
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate und Sprachsteuerung ===&lt;br /&gt;
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; dem betreffenden Hauptartikel zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
=== bridgeRegexp ===&lt;br /&gt;
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch &#039;&#039;&#039;&#039;&#039;einem&#039;&#039;&#039;&#039;&#039; &#039;&#039;MQTT2_DEVICE&#039;&#039; zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. Das &#039;&#039;&#039;Attribut&#039;&#039;&#039; &#039;&#039;bridgeRegexp&#039;&#039; kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem &#039;&#039;&#039;anderen Device&#039;&#039;&#039; (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als &#039;&#039;newClientId&#039;&#039; hinterlegte Angabe verwendet. &lt;br /&gt;
Dementsprechend sind in den hier aufgeführten Beispielen &#039;&#039;bridgeRegexp&#039;&#039;-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren. Ein Sonderfall hierbei ist das template &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem &#039;&#039;mosquitto&#039;&#039;-Server und würden sonst alle einem einem MQTT2_DEVICE zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Ständig neue Devices? ===&lt;br /&gt;
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:&lt;br /&gt;
==== Vergabe einer ClientID ====&lt;br /&gt;
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). &lt;br /&gt;
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID&#039;s. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.&lt;br /&gt;
&lt;br /&gt;
==== Löschen der ClientID aus der readingList usw. ====&lt;br /&gt;
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den &#039;&#039;default&#039;&#039; &amp;quot;sonoff&amp;quot; zu ändern).&lt;br /&gt;
Beispielsweise wäre &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt; zu ändern in &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt;&lt;br /&gt;
Die über &#039;&#039;attrTemplate&#039;&#039; verfügbaren Konfigurationen verwenden in der Regel keine ClientID&#039;s bzw. entfernen diese.&lt;br /&gt;
&lt;br /&gt;
=== Wildcards in readingList und setList ===&lt;br /&gt;
Auch in redingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;readingList&#039;&#039; werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise duch einen &amp;quot;/&amp;quot;) kann man so schreiben: &amp;quot;[^/]+&amp;quot; (entspricht: &amp;quot;Mindestens ein Zeichen, das kein Schrägstrich ist&amp;quot;). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;setList&#039;&#039; gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht &amp;quot;+&amp;quot; für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es &amp;quot;Gruppen-Topics&amp;quot;, auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Themen ===&lt;br /&gt;
=== Verbinden mehrerer FHEM-Instanzen über MQTT ===&lt;br /&gt;
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeigen kann. So kann man z.B. Messdaten eines Systems über ein &#039;&#039;notify&#039;&#039; iVm. einer einfachen &#039;&#039;publish&#039;&#039;-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.&lt;br /&gt;
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten &#039;&#039;bridgeRegexp&#039;&#039; automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:&lt;br /&gt;
 attr MQTT2_myMqttServer bridgeRegexp \&lt;br /&gt;
   SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* &amp;quot;mgb2_$1&amp;quot;&lt;br /&gt;
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema &#039;&#039;SmartHome/MqttGenericBridge2/&amp;lt;Device-Name&amp;gt;/&amp;lt;Reading-Name&amp;gt;&#039;&#039; versendet.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}&lt;br /&gt;
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}&lt;br /&gt;
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;br /&gt;
[[Kategorie:ZigBee]]&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=32896</id>
		<title>MQTT2-Module - Praxisbeispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=32896"/>
		<updated>2020-03-03T12:33:13Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* Tasmota */default Wert angepasst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung: MQTT bzw. MQTT2 in FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] oder benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht&amp;lt;ref&amp;gt;Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden&amp;lt;/ref&amp;gt;. MQTT2_DEVICE unterstützt u.a. auch die &#039;&#039;setExtensions&#039;&#039; direkt, also z.B. &#039;&#039;on-for-timer&amp;lt;ref&amp;gt;Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die &#039;&#039;split&#039;&#039;-Varianten der attrTemplate-Einrichtung zu verwenden.&amp;lt;/ref&amp;gt;&#039;&#039; sowie &#039;&#039;[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]&#039;&#039;&amp;lt;ref&amp;gt;Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muß dies dort per Attribut eingeschaltet werden&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Einstellungen und Hinweise ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für autocreate in Verbindung mit MQTT2_SERVER &#039;&#039;&#039;zwingend&#039;&#039;&#039; jeder über MQTT kommunizierende Client eine ClientID angeben muß. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch &amp;quot;Wegwerf&amp;quot;-ClientID&#039;s. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit &#039;&#039;&#039;MQTT2_SERVER als Server (&amp;quot;Broker&amp;quot;)&#039;&#039;&#039;, für diesen sollte dabei &#039;&#039;autocreate&#039;&#039; nicht deaktiviert sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden&amp;lt;ref&amp;gt;Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) ebenfalls aktiv ist.&amp;lt;/ref&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Beispiel&amp;lt;ref&amp;gt;MQTT2_SERVER verwendet als default-Einstellung für &#039;&#039;autocreate&#039;&#039; &#039;&#039;simple&#039;&#039;, ohne dass ein entsprechendes Attribut gesetzt werden müßte. Die Einstellung &#039;&#039;complex&#039;&#039; empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 define MQTT2_FHEM_Server MQTT2_SERVER 1883 global&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muß ggf. die &amp;quot;\&amp;quot; entfernen!}}&lt;br /&gt;
&lt;br /&gt;
=== MQTT-Einstellungen in den Geräten ===&lt;br /&gt;
Die Beispiele gehen davon aus, dass die einzubindenden Geräte &#039;&#039;&#039;&#039;&#039;mit den default-Einstellungen&#039;&#039;&#039;&#039;&#039; für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere &#039;&#039;&#039;keine Veränderungen der topic-Pfade&#039;&#039;&#039; vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen.  }}&lt;br /&gt;
&lt;br /&gt;
== zigbee2mqtt ==&lt;br /&gt;
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]&lt;br /&gt;
[https://github.com/Koenkk/zigbee2mqtt zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.&lt;br /&gt;
=== Installation von zigbee2mqtt ===&lt;br /&gt;
Die Installation des zigbee2mqtt-Diensts ist auf der Homepage des Projekts beschrieben. Ergänzend muß in der configuration.yaml eine &#039;&#039;client_id&#039;&#039; unter &#039;&#039;mqtt&#039;&#039; (z.B. zigbee_pi) vergeben werden&amp;lt;ref&amp;gt;Die Anführungszeichen sowie genau zwei Leerzeichen sind hier erforderlich!&amp;lt;/ref&amp;gt;.&lt;br /&gt;
 mqtt:&lt;br /&gt;
   client_id: &#039;zigbee_pi&#039;&lt;br /&gt;
Da der Dienst auch später in den Anlernmodus versetzt werden kann, kann man auch gleich &amp;lt;code&amp;gt;permit_join: false&amp;lt;/code&amp;gt; setzen, um das versehentliche Einbinden neuer oder fremder Geräte zu unterbinden.&lt;br /&gt;
{{Hinweis|Wird ein CC2531 auf demselben Linux-Computer verwendet, auf dem auch FHEM installiert ist, kann es vorkommen, dass FHEM diesen mit einem CUL verwechselt und durch &#039;&#039;initialUsbCheck&#039;&#039; in FHEM einbindet, wodurch er für den zigbee2mqtt-Dienst nicht mehr verfügbar ist. Dann sollte &#039;&#039;initialUsbCheck&#039;&#039; deaktiviert und das automatisch angelegte CUL-Device wieder gelöscht werden. Weiter sollte der CC2531 auch in FHEM &#039;&#039;&#039;und&#039;&#039;&#039; zigbee2mqtt &#039;&#039;[[Mehrere USB-Geräte einbinden|by-id]]&#039;&#039; eingebunden werden, um Probleme beim gleichzeitigen Einsatz anderer Geräte, die &#039;&#039;/dev/ttyACMx&#039;&#039; belegen können, zu vermeiden (betrifft z.B. CUL/MapleCUL ).}}&lt;br /&gt;
&lt;br /&gt;
=== Define eines MQTT2-Devices als &amp;quot;Bridge&amp;quot; === &lt;br /&gt;
Dann kann eine Art &amp;quot;Grund-Device&amp;quot; angelegt werden, das für die Ansteuerung des eigentlichen Server-Dienstes genutzt wird, der bereits unmittelbar nach der erfolgreichen Konfiguration von zigbee2mqtt zur Verfügung steht. In der Regel sollte dieses automatisch erstellt werden, wenn der zigbee2mqtt-Dienst (oder der betreffende Rechner) neu gestartet wird (oder FHEM oder dort ein Sensor einen Messwert sendet). Beispiel&amp;lt;ref&amp;gt;Hier waren bereits zwei Zigbee-Geräte angelernt&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 defmod MQTT2_zigbee_pi MQTT2_DEVICE zigbee_pi&lt;br /&gt;
 attr MQTT2_zigbee_pi IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_zigbee_pi readingList zigbee_pi:zigbee2mqtt/bridge/state:.* state\&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/0x90fd9ffffe65db16:.* { json2nameValue($EVENT, &#039;&#039;) }\&#039;&#039;&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/0x90fd9ffffe0bcd51:.* { json2nameValue($EVENT, &#039;&#039;) }\&#039;&#039;&lt;br /&gt;
   zigbee_pi:zigbee2mqtt/bridge/log:.* { json2nameValue($EVENT, &#039;log_&#039;) }&lt;br /&gt;
 attr MQTT2_zigbee_pi room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Für die Funktion einer zigbee2mqtt-Bridge steht ein {{Link2CmdRef|Anker=set|Lang=en|Label=template}} bereit, das direkt die passenden Attribute vergibt, um dem zigbee2mqtt-Dienst passende Anweisungen geben zu können und weitere Geräte für die eigentlichen Aktoren und Sensoren anzulegen:&lt;br /&gt;
&lt;br /&gt;
 set MQTT2_zigbee_pi attrTemplate zigbee2mqtt_bridge&lt;br /&gt;
&lt;br /&gt;
Ist dieses angelegt, kann zigbee2mqtt mit &amp;lt;code&amp;gt;set MQTT2_zigbee_pi permit_join true&amp;lt;/code&amp;gt; in den Anlernmodus versetzt werden, anzulernende Geräte müssen anschließend jeweils nach Bedienungsanleitung in den Anlernmodus gebracht werden.&lt;br /&gt;
&lt;br /&gt;
=== Vereinzeln der eigentlichen Geräte ===&lt;br /&gt;
&lt;br /&gt;
Über das mit dem template vergebene bridgeRegexp-Attribut  &lt;br /&gt;
 attr MQTT2_zigbee_pi bridgeRegexp zigbee2mqtt/([A-Za-z0-9]*)[/]?.*:.* &amp;quot;zigbee_$1&amp;quot; &lt;br /&gt;
werden anschließend neue MQTT2_DEVICE-Geräte automatisch angelegt, sobald ein bisher unbekanntes Zigbee-Gerät einen neuen Status (z.B. einen Meßwert) meldet. Um zu erfragen, welche Geräte dem zigbee-Deinst bekannt sind, kann via &amp;lt;code&amp;gt;get MQTT2_zigbee_pi devicelist true&amp;lt;/code&amp;gt; eine Liste abgefragt werden, die weitere Informationen zu den bereits angelernten Geräten enthält.&lt;br /&gt;
Geräte, die nicht automatisch etwas senden, kann man mit Hilfe des MQTT2_SERVER-Geräts einmalig schalten, damit diese ihren Status bzw. das erfolgreiche Schalten zurückmelden, Beispiel&amp;lt;ref&amp;gt;Die mit 0x... beginnende Angabe entspricht dabei dem &#039;&#039;friendly_name&#039;&#039;.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;ON&amp;quot;,&amp;quot;brightness&amp;quot;:60}&lt;br /&gt;
&lt;br /&gt;
Für Gerätetypen, für die bereits templates vorhanden sind, ist es am einfachsten, diese einmalig auf die Geräte anzuwenden. Das Vorgehen entspricht dabei dem oben für die Bridge beschriebenen. Dafür wird immer vorausgesetzt, dass ein neues Device mit autocreate (ggf. über die bridgeRegexp) angelegt wurde&amp;lt;ref&amp;gt;Dieses befindet sich dann im Raum MQTT2_DEVICE. Um diesen sichtbar zu machen, muß ggf. die Browser-Seite neu geladen werden.&amp;lt;/ref&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
==== IKEA-Tradfri-Birne ====&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Wie wähle ich nun das richtige Template für mein Leuchtmittel aus?&lt;br /&gt;
-&amp;gt; Es wird nicht zwischen einer Birne/Bulb/Lampe und einem LED-Controller unterschieden sondern anhand der möglichen Lichtdarstellung des Gerätes:&lt;br /&gt;
&lt;br /&gt;
light_dimmer:&lt;br /&gt;
Das anzusteuernde Geräte besitzt ausschließlich eine feste Lichtfarbe welche gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_cct:&lt;br /&gt;
Das anzusteuernde Gerät besitzt eine warmweiße sowie kaltweiße Lichtfarbe welche verändert sowie gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_rgb_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und kann gedimmt werden.&lt;br /&gt;
&lt;br /&gt;
light_rgbw_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und besitzt eine warmweiße ODER kaltweiße Lichtfarbe welche eingestellt sowie gedimmt werden kann.&lt;br /&gt;
&lt;br /&gt;
light_rgbcct_xxx:&lt;br /&gt;
Das anzusteuernde Gerät besitzt die Möglichlichkeit einer farbigen Lichtdarstellung (Rot, Grün, Blau) und besitzt eine warmweiße UND kaltweiße Lichtfarbe welche verändert sowie gedimmt werden kann.&lt;br /&gt;
   &lt;br /&gt;
   xxx:&lt;br /&gt;
      hex:   Farbänderung mit hex&lt;br /&gt;
      rgb:   Farbänderung mit r g b&lt;br /&gt;
      xy:   Farbänderung mit x sowie y&lt;br /&gt;
      hue:   Farbänderung mit hue und saturation&lt;br /&gt;
&lt;br /&gt;
Warum diese Einteilung in &amp;quot;hex&amp;quot;, &amp;quot;rgb&amp;quot;, &amp;quot;xy&amp;quot; sowie &amp;quot;hue&amp;quot;?&lt;br /&gt;
-&amp;gt; Zigbee2MQTT unterstützt das Übermitteln aller dieser Werte, allerdings unterscheiden sich hier die Geräte. Manche &amp;quot;verstehen&amp;quot; nur z.B. Hex-Farbänderungen, andere halt nur eine Farbänderung mit rgb-Werten.&lt;br /&gt;
-&amp;gt; Aus diesem Grund muss an dieser Stelle probiert werden mit welchem der 4 Templates sich die Farbveränderung des Gerätes steuern lässt!&lt;br /&gt;
&lt;br /&gt;
HINWEIS: Templates für Farbänderungen mithilfe von XY- sowie HUE-Werten wurden bis heute nicht angelegt!&lt;br /&gt;
}}&lt;br /&gt;
Beispiel eines dimmbaren Tradfri-Leuchtmittels&lt;br /&gt;
 defmod IKEA_Bulb2 MQTT2_DEVICE&lt;br /&gt;
 attr IKEA_Bulb2 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr IKEA_Bulb2 icon light_control&lt;br /&gt;
 attr IKEA_Bulb2 devStateIcon {zigbee2mqtt_devStateIcon255($name)}&lt;br /&gt;
 attr IKEA_Bulb2 readingList zigbee_pi:zigbee2mqtt/0x90fd9ffffe0bcd51:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr IKEA_Bulb2 setList on:noArg zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
     off:noArg zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
     brightness:colorpicker,BRI,0,15,255 zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;state&amp;quot;:&amp;quot;on&amp;quot;,&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr IKEA_Bulb2 webCmd toggle:on:off:brightness&lt;br /&gt;
 attr IKEA_Bulb2 model L_02a_zigbee2mqtt_bulb&lt;br /&gt;
&lt;br /&gt;
Kann man auch die Farbtemperatur einstellen, wird die setList wie folgt erweitert oder das entsprechende template&amp;lt;ref&amp;gt;Durch die &#039;&#039;model&#039;&#039;-Angabe kann nachvollzogen werden, welches template angewendet wurde.&amp;lt;/ref&amp;gt; anwendet:&lt;br /&gt;
 ...&lt;br /&gt;
 color_temp:colorpicker,CT,250,1,454 zigbee2mqtt/0x90fd9ffffe0bcd51/set {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Die templates sind dabei in der Regel so gestaltet, dass eventuell mehr Optionen in FHEMWEB erscheinen, als tatsächlich vorhanden oder erwünscht sind. &lt;br /&gt;
Da sich obige einfarbige dimmbare Lampe durch Klicken auf das devStateIcon schalten läßt, ist für die vollständige Ansteuerung bereits dieses webCmd hinreichend:&lt;br /&gt;
 attr IKEA_Bulb2 webCmd brightness&lt;br /&gt;
&lt;br /&gt;
==== Temp/Hum. Sensor ====&lt;br /&gt;
tbd&lt;br /&gt;
&lt;br /&gt;
==== Motion Sensor ====&lt;br /&gt;
Als MQTT-Server wird hier &#039;&#039;mosquitto&#039;&#039; verwendet, als IO-Device wird daher ein {{Link2CmdRef|Anker=MQTT2_CLIENT|Lang=en|Label=MQTT2_CLIENT}}-Gerät definiert: &lt;br /&gt;
&lt;br /&gt;
 defmod mqtt2_client MQTT2_CLIENT 192.168.2.4:1883&lt;br /&gt;
 attr mqtt2_client autocreate 1&lt;br /&gt;
 attr mqtt2_client rawEvents zigbee2mqtt/GB_Bewegungsmelder:.*&lt;br /&gt;
 attr mqtt2_client room test&lt;br /&gt;
 attr mqtt2_client subscriptions #&lt;br /&gt;
&lt;br /&gt;
Das eigentliche Device sieht dann so aus:&lt;br /&gt;
 defmod GB_Bewegungsmelder_MQTT2 MQTT2_DEVICE zigbee_158d0001f9d030&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 IODev mqtt2_client&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 devStateIcon motion:motion_detector@red off:motion_detector@green no_motion:motion_detector@green&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 icon motion_detector@blue&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 readingList mqtt2client:zigbee2mqtt/GB_Bewegungsmelder:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 room MQTT2_DEVICE&lt;br /&gt;
 attr GB_Bewegungsmelder_MQTT2 stateFormat {\&lt;br /&gt;
 if(ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;occupancy&amp;quot;,0) eq &amp;quot;true&amp;quot;) {\&lt;br /&gt;
 	sprintf(&amp;quot;motion&amp;quot;);;\&lt;br /&gt;
 	} else {\&lt;br /&gt;
 	sprintf(&amp;quot;no_motion&amp;quot;);;	\&lt;br /&gt;
 	}\&lt;br /&gt;
 }&lt;br /&gt;
==== Anlegen von Zigbee2MQTT-Gruppen in FHEM ====&lt;br /&gt;
{{Hinweis|Die nachfolgende Darstellung ist vorläufig!}}&lt;br /&gt;
{{Hinweis|Bevor man eine Gruppe mithilfe von Zigbee2MQTT anlegen kann, sollte man sicherstellen, dass man über die aktuelleste Version von Zigbee2MQTT verfügt (min. vom 15. Februar 2019). Außerdem sollte auch der Koordinator (zumeist CC2531) die aktuellste Firmware besitzen (min. vom 15. Februar 2019). Falls ein flashen des Koordinators mit der neusten Firmware erfolgen soll, ist darauf zu achten, dass nach einem flashen alle Geräte neu angelernt werden müssen! (Hinweise zum flashen ohne erneutem anlernen sind hier zu finden: https://www.zigbee2mqtt.io/information/flashing_without_re-pairing.html)}}&lt;br /&gt;
&lt;br /&gt;
=====Erstellen einer Zigbee2MQTT-Gruppe=====&lt;br /&gt;
Bevor das Ganze in FHEM funktioniert, muss eine Gruppe in der &amp;quot;configuration.yaml&amp;quot; angelegt werden, dieser Vorgang ist auf folgender Seite beschrieben: https://www.zigbee2mqtt.io/information/groups.html&lt;br /&gt;
Wenn die Geräte anschließend über den FHEM MQTT2-Server der Gruppe hinzugefügen werden sollen, kann dies mit folgendem Befehl erfolgen:&lt;br /&gt;
 set &amp;lt;MQTT2-Server&amp;gt; publish zigbee2mqtt/bridge/group/&amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;/add &amp;lt;Zigbee2MQTT Friendly-Gerätename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/bridge/group/Wohnzimmer/add Stehlampe&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl kann so oft verwendet werden, wie man Geräte zu einer Gruppe hinzufügen möchte.&lt;br /&gt;
&lt;br /&gt;
Zum Entfernen eines Gerätes aus einer Gruppe kann folgender Befehl verwendet werden:&lt;br /&gt;
 set &amp;lt;MQTT2-Server&amp;gt; publish zigbee2mqtt/bridge/group/&amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;/remove &amp;lt;Zigbee2MQTT Friendly-Gerätename&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
 set MQTT2_FHEM_Server publish zigbee2mqtt/bridge/group/Wohnzimmer/remove Kuechenlampe&lt;br /&gt;
&lt;br /&gt;
=====Anlegen der Gruppe in FHEM=====&lt;br /&gt;
Da Gruppen in Zigbee2MQTT aktuell keine Rückmeldung über ihren Status geben, wird auch beim einmaligen Schalten kein Gerät automatisch in FHEM angelegt. Aus diesem Grund muss dies mit folgendem Befehl noch manuell erfolgen:&lt;br /&gt;
 defmod &amp;lt;FHEM NAME&amp;gt; MQTT2_DEVICE&lt;br /&gt;
Beispiel&lt;br /&gt;
 defmod lichtWohnzimmer MQTT2_DEVICE&lt;br /&gt;
Anschließend wird auch für dieses Gerät wieder ein passendes template ausgewählt, wie als wäre es ein normales Zigbee2MQTT-Gerät.&lt;br /&gt;
Im anschließenden Dialog-Fenster welches sich nach dem Setzen des templates öffnet, müssen die folgenden Werte durch passendes ersetzt werden:&lt;br /&gt;
 BASE_TOPIC -&amp;gt; zigbee2mqtt&lt;br /&gt;
 DEV_ID -&amp;gt; &amp;lt;Zigbee2MQTT Friendly-Gruppenname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach sollte sich die Gruppe wie ein normales Zigbee2MQTT Gerät steuern lassen.&lt;br /&gt;
&lt;br /&gt;
== Tasmota ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. &lt;br /&gt;
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter &#039;&#039;&amp;lt;nowiki&amp;gt;topic = %topic% (tasmota)&amp;lt;/nowiki&amp;gt;&#039;&#039; ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem  Eingabefeld für &#039;&#039;&amp;quot;client ...&amp;quot;&#039;&#039;, siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
=== MQTT2_DEVICE ===&lt;br /&gt;
Dieses sollte bei aktiviertem &#039;&#039;autocreate&#039;&#039; am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Hier wurden Tasmota version(en) 6.1.1 und 6.2.1 getestet, Hardware war Sonoff Touch und S20.&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen ===&lt;br /&gt;
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden:  &lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD IODev m2server&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    DVES_9B01BD:cmnd/DVES_9B01BD/POWER:.* POWER\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr MQTT2_DVES_9B01BD room MQTT2_DEVICE&lt;br /&gt;
 attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\&lt;br /&gt;
    off cmnd/DVES_9B01BD/POWER off\&lt;br /&gt;
    reboot cmnd/DVES_9B01BD/Restart 1&lt;br /&gt;
 attr MQTT2_DVES_9B01BD webCmd on:off:reboot&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
Für gängige Tasmota-Geräte stehen &#039;&#039;templates&#039;&#039; bereit, mit denen sich diese schnell konfigurieren lassen. &lt;br /&gt;
Beachten Sie dazu den Abschnitt &#039;&#039;attrTemplate&#039;&#039; in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen werden dabei weitere Geräte angelegt und konfiguriert.&lt;br /&gt;
&lt;br /&gt;
=== on-for-timer ===&lt;br /&gt;
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen &#039;&#039;setter&#039;&#039; in der &#039;&#039;setList&#039;&#039; werden die &#039;&#039;&#039;SetExtensions&#039;&#039;&#039; verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:&lt;br /&gt;
&lt;br /&gt;
==== delay ==== &lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039;:&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1*10; &#039;cmnd/DVES_575127/Backlog POWER1 1; delay &#039;.$duration.&#039;; POWER1 0&#039;}&lt;br /&gt;
&lt;br /&gt;
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe https://github.com/arendst/Tasmota/wiki/Commands#delay), also eine Stunde.&lt;br /&gt;
&lt;br /&gt;
====pulseTime ====&lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039;:&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1 &amp;lt; 11.2 ? $EVTPART1*10 : $EVTPART1+100; &#039;CMNDTOPIC/Backlog pulseTime1 &#039;.$duration.&#039;; POWER1 1&#039;}&lt;br /&gt;
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit &#039;&#039;delay&#039;&#039;. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren &amp;quot;normalen&amp;quot; Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites &#039;&#039;save&#039;&#039; nur bis zum nächsten reboot des Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
== ESPurna ==&lt;br /&gt;
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool&#039;sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als &amp;quot;on&amp;quot; oder &amp;quot;off&amp;quot; oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.&lt;br /&gt;
&lt;br /&gt;
== Shelly ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.&lt;br /&gt;
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen weitere Geräte angelegt und konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly1 ===&lt;br /&gt;
&lt;br /&gt;
=== Shellybulb ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate  angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
 Internals:&lt;br /&gt;
   CFGFN     &lt;br /&gt;
   CID        shellybulb_3CC533&lt;br /&gt;
   DEF        shellybulb_3CC533&lt;br /&gt;
   DEVICETOPIC MQTT2_shellybulb_3CC533&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   NAME       MQTT2_shellybulb_3CC533&lt;br /&gt;
   NR         246&lt;br /&gt;
   STATE      ???&lt;br /&gt;
   TYPE       MQTT2_DEVICE&lt;br /&gt;
   READINGS:&lt;br /&gt;
     2018-12-12 19:28:08   status_blue     0&lt;br /&gt;
     2018-12-12 19:28:08   status_brightness 61&lt;br /&gt;
     2018-12-12 19:28:08   status_effect   0&lt;br /&gt;
     2018-12-12 19:28:08   status_gain     26&lt;br /&gt;
     2018-12-12 19:28:08   status_green    0&lt;br /&gt;
     2018-12-12 19:28:08   status_ison     true&lt;br /&gt;
     2018-12-12 19:28:08   status_mode     color&lt;br /&gt;
     2018-12-12 19:28:08   status_red      255&lt;br /&gt;
     2018-12-12 19:28:08   status_temp     3250&lt;br /&gt;
     2018-12-12 19:28:08   status_white    0&lt;br /&gt;
 Attributes:&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, &#039;status_&#039;) }&lt;br /&gt;
   room       MQTT2_DEVICE&lt;br /&gt;
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate &amp;quot;shellybulb&amp;quot; auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly Plug S ===&lt;br /&gt;
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb &amp;gt; 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:&lt;br /&gt;
  attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state =&amp;gt; $EVTPART0&amp;lt;100?&amp;quot;off&amp;quot;:&amp;quot;on&amp;quot; } }&lt;br /&gt;
Der Status des MQTT2 Devices zeigt dann bei &amp;lt;100W &amp;quot;off&amp;quot; und sonst &amp;quot;on&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
=== HTTP-Commands ===&lt;br /&gt;
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.&lt;br /&gt;
&lt;br /&gt;
== 8-Port-Ethernet Board ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse&lt;br /&gt;
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
In diesem [https://forum.fhem.de/index.php/topic,107536.msg1016379.html#msg1016379 Forenbeitrag] bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.&lt;br /&gt;
&lt;br /&gt;
== Milight-Bridge ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von &#039;&#039;openmili&#039;&#039; eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel.&lt;br /&gt;
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway&amp;lt;ref&amp;gt;Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist.&lt;br /&gt;
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen am MiLight-Hub ===&lt;br /&gt;
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.&lt;br /&gt;
Die Einstellungen für &#039;&#039;MQTT topic pattern&#039;&#039; usw. können auf den default-Werten&amp;lt;ref&amp;gt;Diese sind: &amp;lt;br&amp;gt;&#039;&#039;milight/:device_id/:device_type/:group_id&#039;&#039; für &amp;quot;topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/updates/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;update topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/states/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;state topic pattern&amp;quot;. Der Autor hat derzeit folgende Infotypen zum Senden markiert: &amp;quot;status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color&amp;quot; (enthält eventuell zu viele Angaben. Bei einem Eventhandler muß man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).&amp;lt;/ref&amp;gt; belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (&#039;&#039;MQTT Client Status Topic&#039;&#039;), tragen Sie &#039;&#039;milight/LWT&#039;&#039; ein und aktivieren &#039;&#039;Detailed&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Devices ===&lt;br /&gt;
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]&lt;br /&gt;
==== Bridge ====&lt;br /&gt;
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:&lt;br /&gt;
 defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses Device wird nun das &#039;&#039;template&#039;&#039; &#039;&#039;&#039;esp_milight_hub_bridge&#039;&#039;&#039; angewandt.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Leuchtmittel ====&lt;br /&gt;
&lt;br /&gt;
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:&lt;br /&gt;
 defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Devices werden genauso erstellt. &lt;br /&gt;
&lt;br /&gt;
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template &#039;&#039;X_01a_esp_milight_hub_make_rgbw_group&#039;&#039; verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt &#039;&#039;&#039;eine Kopie&#039;&#039;&#039;, die dann modifiziert wird. Diese Kopie ist unter dem Namen &#039;&#039;milight_&amp;lt;RemoteID&amp;gt;_0&#039;&#039; im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepaßt werden. &lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele:&lt;br /&gt;
Beispiel für ein RGB-CCT-Device:&lt;br /&gt;
 defmod Licht_Wz_all MQTT2_DEVICE&lt;br /&gt;
 attr Licht_Wz_all IODev MQTT2_Broker&lt;br /&gt;
 attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/&lt;br /&gt;
 attr Licht_Wz_all group Licht&lt;br /&gt;
 attr Licht_Wz_all icon light_control&lt;br /&gt;
 attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 &lt;br /&gt;
 attr Licht_Wz_all room Wohnzimmer&lt;br /&gt;
 attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
 off milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
 level milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 next_mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_up milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 device_id milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 effect milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 commands milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr Licht_Wz_all sortby 1&lt;br /&gt;
 attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue&lt;br /&gt;
 attr Licht_Wz_all webCmdLabel command\ &lt;br /&gt;
 :brightness:saturation\&lt;br /&gt;
 :color_temp:hue&lt;br /&gt;
==== Ein Leuchtmittel, mehrere Fernbedienungen ====&lt;br /&gt;
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen &amp;quot;hört&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }&lt;br /&gt;
&lt;br /&gt;
==== Fernbedienung als Input-Device nutzen ====&lt;br /&gt;
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.&lt;br /&gt;
Um hier nur Differenz-Meldungen zu erhalten und doppelte Events zu verhindern, sollte hier die readingList so angepaßt werden, dass nur Messages aus dem &amp;quot;updates&amp;quot;-Zweig ausgewertet werden: &lt;br /&gt;
 defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0&lt;br /&gt;
 attr MiLight_RC1_0 readingList milight/updates/0xABCD/fut089/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/fut089/0:.* {}&lt;br /&gt;
&lt;br /&gt;
== eBus ==&lt;br /&gt;
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition am eBus ===&lt;br /&gt;
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.&lt;br /&gt;
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. &#039;&#039;ebusd/%circuit/%name&#039;&#039;.&lt;br /&gt;
 --accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name&lt;br /&gt;
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic &#039;&#039;ebusd&#039;&#039; verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit &#039;&#039;ebus...&#039;&#039; zu beginnen!}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition  in FHEM ===&lt;br /&gt;
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem &#039;&#039;&#039;&#039;&#039;vor&#039;&#039;&#039;&#039;&#039; den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der &#039;&#039;readingList&#039;&#039; enthalten, die vom ebus stammen. Da wir die &#039;&#039;readingList&#039;&#039; anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche &#039;&#039;readingList&#039;&#039;-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-&amp;quot;Sammeldevices&amp;quot; genutzt werden, und dessen &#039;&#039;CID&#039;&#039; auf &#039;&#039;ebusd&#039;&#039; geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der &#039;&#039;readingList&#039;&#039; des &amp;quot;Sammeldevices&amp;quot; gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. &lt;br /&gt;
&lt;br /&gt;
Sind die Vorbereitungen abgeschlossen, aktivieren wir &#039;&#039;autocreate&#039;&#039; wieder, allerdings wählen wir als autocreate-Methode &#039;&#039;complex&#039;&#039; aus, da der eBus-Dämon teilweise&amp;lt;ref&amp;gt;Dies betrifft vorrangig die Statusmeldungen&amp;lt;/ref&amp;gt; eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt&amp;lt;ref&amp;gt;Bei Verwendung des MQTT2_CLIENT wird dann die &#039;&#039;readingList&#039;&#039; am bereits definierten MQTT2_DEVICE aus der Kopie des &amp;quot;Sammeldevice&amp;quot; automatisch wieder erstellt bzw. gefüllt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;ebus-Bridge&amp;quot; ====&lt;br /&gt;
Auf das von &#039;&#039;autocreate&#039;&#039; erstellte MQTT2_DEVICE wird nunmehr das template &#039;&#039;eBus_daemon_splitter&#039;&#039; angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. &lt;br /&gt;
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen &#039;&#039;uptime&#039;&#039;, alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;attrTemplate&#039;&#039; läd eine weitere &#039;&#039;attrTemplate&#039;&#039;-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. &lt;br /&gt;
==== &amp;quot;ebusd_bai&amp;quot; und weitere Geräte ====&lt;br /&gt;
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}&lt;br /&gt;
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens &#039;&#039;MQTT2_ebus_bai&#039;&#039; angelegt worden sein.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Hinweise ==&lt;br /&gt;
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===&lt;br /&gt;
Nutzt man das rawEvents-Attribut am MQTT2-IO&amp;lt;ref&amp;gt;z.B. &amp;lt;code&amp;gt;attr MQTT2_FHEM_Server rawEvents .*&amp;lt;/code&amp;gt;, der regex-Filter kann wie üblich angepaßt werden&amp;lt;/ref&amp;gt;, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.&lt;br /&gt;
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit &amp;lt;code&amp;gt;attr mqtt2_server verbose 5&amp;lt;/code&amp;gt; auch alles ins FHEM-Log schreiben lassen.&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; genutzt werden. &lt;br /&gt;
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate: Es werden nicht alle templates angezeigt ===&lt;br /&gt;
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]&lt;br /&gt;
&lt;br /&gt;
=== bridgeRegexp ===&lt;br /&gt;
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch &#039;&#039;&#039;&#039;&#039;einem&#039;&#039;&#039;&#039;&#039; &#039;&#039;MQTT2_DEVICE&#039;&#039; zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. Das &#039;&#039;&#039;Attribut&#039;&#039;&#039; &#039;&#039;bridgeRegexp&#039;&#039; kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem &#039;&#039;&#039;anderen Device&#039;&#039;&#039; (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als &#039;&#039;newClientId&#039;&#039; hinterlegte Angabe verwendet. &lt;br /&gt;
Dementsprechend sind in den hier aufgeführten Beispielen &#039;&#039;bridgeRegexp&#039;&#039;-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren. Ein Sonderfall hierbei ist das template &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem &#039;&#039;mosquitto&#039;&#039;-Server und würden sonst alle einem einem MQTT2_DEVICE zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Ständig neue Devices? ===&lt;br /&gt;
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:&lt;br /&gt;
==== Vergabe einer ClientID ====&lt;br /&gt;
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). &lt;br /&gt;
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID&#039;s. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.&lt;br /&gt;
&lt;br /&gt;
==== Löschen der ClientID aus der readingList usw. ====&lt;br /&gt;
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den &#039;&#039;default&#039;&#039; &amp;quot;sonoff&amp;quot; zu ändern).&lt;br /&gt;
Beispielsweise wäre &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt; zu ändern in &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt;&lt;br /&gt;
Die über &#039;&#039;attrTemplate&#039;&#039; verfügbaren Konfigurationen verwenden in der Regel keine ClientID&#039;s bzw. entfernen diese.&lt;br /&gt;
&lt;br /&gt;
=== Wildcards in readingList und setList ===&lt;br /&gt;
Auch in redingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;readingList&#039;&#039; werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise duch einen &amp;quot;/&amp;quot;) kann man so schreiben: &amp;quot;[^/]+&amp;quot; (entspricht: &amp;quot;Mindestens ein Zeichen, das kein Schrägstrich ist&amp;quot;). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;setList&#039;&#039; gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht &amp;quot;+&amp;quot; für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es &amp;quot;Gruppen-Topics&amp;quot;, auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Themen ===&lt;br /&gt;
=== Verbinden mehrerer FHEM-Instanzen über MQTT ===&lt;br /&gt;
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeigen kann. So kann man z.B. Messdaten eines Systems über ein &#039;&#039;notify&#039;&#039; iVm. einer einfachen &#039;&#039;publish&#039;&#039;-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.&lt;br /&gt;
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten &#039;&#039;bridgeRegexp&#039;&#039; automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:&lt;br /&gt;
 attr MQTT2_myMqttServer bridgeRegexp \&lt;br /&gt;
   SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* &amp;quot;mgb2_$1&amp;quot;&lt;br /&gt;
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema &#039;&#039;SmartHome/MqttGenericBridge2/&amp;lt;Device-Name&amp;gt;/&amp;lt;Reading-Name&amp;gt;&#039;&#039; versendet.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}&lt;br /&gt;
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}&lt;br /&gt;
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;br /&gt;
[[Kategorie:ZigBee]]&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EBUS-MQTT2&amp;diff=31413</id>
		<title>EBUS-MQTT2</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EBUS-MQTT2&amp;diff=31413"/>
		<updated>2019-10-23T15:21:02Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* eBus mit MQTT2 auswerten */Denke der Thread war gemeint&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== eBus - MQTT2 ==&lt;br /&gt;
Vorausgesetzt wird hier ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.&lt;br /&gt;
=== eBus mit MQTT2 auswerten ===&lt;br /&gt;
https://forum.fhem.de/index.php/topic,97989.0.html&lt;br /&gt;
&lt;br /&gt;
Für die MQTT Kommunikation des eBus wird für die eigentlichen Geräte [https://forum.fhem.de/index.php/topic,91394.0.html MQTT2 DEVICE ] verwendet, damit wird als IO-Device entweder [https://forum.fhem.de/index.php/topic,91394.0.html MQTT2_SERVER ]  oder MQTT2_CLIENT verwendet, NICHT beides gleichzeitig!&lt;br /&gt;
Bitte auch zu beachten, die alten Module MQTT funktionieren nicht nach der Beschreibung in diesem Artikel. Es geht hier um die komplett überarbeitete Version mit dem Namen MQTT2!&lt;br /&gt;
&lt;br /&gt;
Bei der hier beschriebenen Konfiguration der angelegten Devices muss unbedingt die Reihenfolge eingehalten werden.&lt;br /&gt;
&lt;br /&gt;
=== Anwendung: ===&lt;br /&gt;
Wer eBus komfortabel in FHEM einbinden will, kann dies nun erstmals mit wenigen Mausklicks realisieren. Erstmalig kommt diese neue Technik der von rudolfkönig implementierten Templates zur Anwendung. Templates sind im Prinzip vorgefertigte Schablonen die durch Anklicken dann selbständig den Device mit den darin enthaltenen Vorgaben konfigurieren. Beta-User hat diese Technik dann soweit für den eBus angepasst ( unter anderem die Filter erstellt ) , das sie allen eBus Anwendern zur Verfügung steht. Es kann nun jeder selbst Templates erstellen oder einfach die von mir erstellten vorhandenen Beispiele benutzen. In wenigen Minuten sollte die komplette FHEM Konfiguration dann abgeschlossen sein.&lt;br /&gt;
&lt;br /&gt;
Wer bereits einen Mosquitto Broker installiert hat, kann diesen weiter verwenden, ist aber für die Komunikation mit dem eBus Dämon nicht mehr notwendig!&lt;br /&gt;
&lt;br /&gt;
[[Bild:MQTT2_MQTT2.jpg|600px|thumb|left|Uebersicht eBus MQTT]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Welches FHEM Modul benötigt man ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Nicht MQTT2_SERVER und Mosquitto gleichzeitig laufen lassen, es kann zu verschiedenen Problemen kommen wie gegenseitiges Löschen von Einträgen in FHEM.}}&lt;br /&gt;
Beispiel: Mosquitto Broker ist vorhanden&lt;br /&gt;
dann benötigt man MQTT2_DEVICE und MQTT2_CLIENT&lt;br /&gt;
&lt;br /&gt;
Beispiel: Mosquitto Broker ist NICHT vorhanden&lt;br /&gt;
dann benötigt man MQTT2_DEVICE und MQTT2_SERVER&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition am eBus ===&lt;br /&gt;
In der Konfiguration des Dämons ( /etc/default/ebusd ) sollten diese Parameter hinzugefügt werden. Die Topic „ebusd/%circuit/%name“ bitte nicht abändern, da verschiedene Filter auf diesen Ausdruck eingestellt sind.&lt;br /&gt;
 --accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name&lt;br /&gt;
Der MQTTSERVER kann wahlweise der Mosquitto Broker sein, oder der MQTT2_SERVER. Beides wird vermutlich am Raspberry der FHEM Hauptinstanz sein, also die IP-Adresse des Raspberry einsetzen.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic &#039;&#039;ebusd&#039;&#039; verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit &#039;&#039;ebus...&#039;&#039; zu beginnen!}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition  in FHEM ===&lt;br /&gt;
&lt;br /&gt;
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem &#039;&#039;&#039;&#039;&#039;vor&#039;&#039;&#039;&#039;&#039; den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der readingList enthalten, die vom ebus stammen. Da wir die readingList anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen entweder diese Geräte nach dem Deaktivieren des autocreate am IO gelöscht, oder zumindest die readingList entsprechend bereinigt oder gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Externer Broker ====&lt;br /&gt;
Wer bereits den Mosquitto installiert hat und diesen weiter verwenden möchte, dann diese Konfiguration wählen.&lt;br /&gt;
 ### 1a. Broker in FHEM anlegen ###&lt;br /&gt;
 define MQTT_via_mosquitto MQTT2_CLIENT 127.0.0.1:1883&lt;br /&gt;
 attr MQTT_via_mosquitto room MQTT2_DEVICE,System&lt;br /&gt;
==== FHEM-Interner Server ====&lt;br /&gt;
Wer keinen Mosquitto installiert hat kann diese Konfiguration wählen. Dazu wird einfach der MQTT2-SERVER definiert.&lt;br /&gt;
&lt;br /&gt;
 ### 1b. oder MQTT Server  anlegen ###&lt;br /&gt;
 define ebusMQTT MQTT2_SERVER 1883 global&lt;br /&gt;
 attr ebusMQTT room MQTT2_SERVER&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;ebus-Bridge&amp;quot; ====&lt;br /&gt;
Nun wird noch ein Device benötigt, welcher mit einem der oben genannten Module kommuniziert und das Filter (bridgeRegexp) für den eBus beinhaltet. Auf Basis dieses Device werden später alle ankommenden JSON Telegramme vom eBus Dämon automatisch als Reading angelegt.&lt;br /&gt;
&lt;br /&gt;
 ### 2. MQTT_Device definieren&lt;br /&gt;
 define MQTT2_ebusd MQTT2_DEVICE ebusd&lt;br /&gt;
 attr MQTT2_ebusd IODev ebusMQTT&lt;br /&gt;
 attr MQTT2_ebusd room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Es kann auch ein ggf. vom MQTT2_SERVER bereits automatisch angelegtes Device genutzt werden, bei Verwendung von MQTT2_CLIENT sollte das Device wie oben dargestellt manuell erstellt werden; es ist dabei darauf zu achten, dass die CID dem Basispfad des Topic-trees entspricht, der bei der Konfiguration des ebus-Dämons verwendet wurde. &lt;br /&gt;
&lt;br /&gt;
Auf das Device MQTT2_ebusd wird nun folgendes Template angwendet:&lt;br /&gt;
&lt;br /&gt;
[[Bild:MQTT2_1template E_00 installieren.png|400px|thumb|left|Template E_00_eBus_daemon_splitter]]&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:MQTT2_2splitter.png|400px|thumb|left|Eingabe im Splitter aendern]]&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gibt es noch keine readingList mit ebus-spezifischen Einträgen, erscheint ein Fenster. In diesem kann der Name ausgewählt werden, gebt hier anstatt DEV_ID „ebus“ ein und drückt „ok“&lt;br /&gt;
&lt;br /&gt;
Zur Kontrolle bitte prüfen ob hier auch die „bridgeRegexp“ vom Template richtig gesetzt wurde.&lt;br /&gt;
&lt;br /&gt;
[[Bild:MQTT2_3Attribute_ebusd.png|400px|thumb|left|bridgeRegexp prüfen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 (ebus..*?)/(bai|\d+|cc|e7f|ehp|f\d\d|hc|he.|hmu|hwc|mc|mc.\d|omu|omu.\d|pms|rcc|rcc.\d|sc|sdr_p|ui|uih|v\d\d|v81.\d|vd\d|vl\d|vr_\d\d|zeo)/.*:.* &amp;quot;$1_$2&amp;quot;&lt;br /&gt;
 (ebus..*?)/(global|broadcast|general|scan([^/]*))/.*:.* &amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach der Konfiguration des bridge-Devices muß autocreate am IO-Device wieder aktiviert werden. Da hierbei die vom ebus-Dämon gesendeten JSON-Informationen in vielen Installationen nur sinnvoll genutzt werden können, wenn die Statusmeldungen jeweils getrennt dargestellt werden, setzen wir auf dem MQTT2_SERVER oder dem MQTT2_CLIENT ( je nachdem welcher verwendet wurde) das Attribut „autocreate“ auf „complex“.&lt;br /&gt;
&lt;br /&gt;
[[Bild:MQTT2_4autocreate-complex.png|400px|thumb|left|autocreate auf complex setzen]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Complex hat den Sinn, das JSONMAP mit dem Namen des Readings automatisch gesetzt wird.&lt;br /&gt;
Statt dem Reading 0_value wird daraus dann ein Stautus01_0_value. Dies ist gerade bei den Statusmeldungen wichtig, da sie sich sonst mit gleichem Readingnamen gegenseitig überschreiben.&lt;br /&gt;
&lt;br /&gt;
Nun heißt es etwas zurück lehnen und warten bis die MQTT Telegramme vom eBus eingetroffen sind, das kann einige Minuten dauern. Dabei wird in der Regel sowohl die readingList am Device &#039;&#039;MQTT2_ebusd&#039;&#039; erweitert, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt.&lt;br /&gt;
&lt;br /&gt;
==== myUtils-Code ====&lt;br /&gt;
Nun benötigen wir noch etwas Code für die Balkendarstellung in FHEM. Dieser Code wird in die 99_myUtils.pm kopiert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 sub Balkenanzeige($) &lt;br /&gt;
 {&lt;br /&gt;
    # Zuweisung der übergebenen Variablen&lt;br /&gt;
    my ($val) = @_;&lt;br /&gt;
    # Konfiguration des maximal übergebenen Werts (hier wäre der höchste zu erwartende Wert = 3)&lt;br /&gt;
    my $maxValue = 70;&lt;br /&gt;
    # Normalisierung auf 100%-Wert&lt;br /&gt;
    my $percent = $val / $maxValue * 100;&lt;br /&gt;
    # Definition des valueStyles&lt;br /&gt;
    my $stylestring = &#039;style=&amp;quot;&#039;.&lt;br /&gt;
        &#039;width: 200px; &#039;.&lt;br /&gt;
	&#039;text-align:center; &#039;.&lt;br /&gt;
	&#039;border: 1px solid #ccc ;&#039;. &lt;br /&gt;
	&#039;background-image: -webkit-linear-gradient(left,red &#039;.$percent.&#039;%, rgba(0,0,0,0) &#039;.$percent.&#039;%); &#039;.&lt;br /&gt;
	&#039;background-image:    -moz-linear-gradient(left,blue &#039;.$percent.&#039;%, rgba(0,0,0,0) &#039;.$percent.&#039;%); &#039;. &lt;br /&gt;
	&#039;background-image:     -ms-linear-gradient(left,red &#039;.$percent.&#039;%, rgba(0,0,0,0) &#039;.$percent.&#039;%); &#039;. &lt;br /&gt;
	&#039;background-image:      -o-linear-gradient(left,red &#039;.$percent.&#039;%, rgba(0,0,0,0) &#039;.$percent.&#039;%); &#039;. &lt;br /&gt;
	&#039;background-image:         linear-gradient(left,red &#039;.$percent.&#039;%, rgba(0,0,0,0) &#039;.$percent.&#039;%);&amp;quot;&#039;;&lt;br /&gt;
    # Rückgabe des definierten Strings&lt;br /&gt;
    return $stylestring;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenfalls muss noch das Modul Color.pm ordnungsgemäß eingebunden werden. Dieses Modul wird zur farbigen Darstellung wie es in den Templates verwendet wird benötigt.&lt;br /&gt;
 define colorInit notify global:INITIALIZED {use Color}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==== Regelmäßige Werteabfrage ====&lt;br /&gt;
&lt;br /&gt;
Es kann aber in der Zwischenzeit noch die Timer gesteuerte Abfrage definiert werden.&lt;br /&gt;
&lt;br /&gt;
 defmod get_ebus_updates at +*00:15:00 set ebusMQTT publish ebusd/430/Hc1HeatCurve/get;&lt;br /&gt;
 set ebusMQTT publish ebusd/430/HwcTempDesired/get;&lt;br /&gt;
 set ebusMQTT publish ebusd/bai/WaterPressure/get;&lt;br /&gt;
 set ebusMQTT publish ebusd/bai/FlowTemp/get;&lt;br /&gt;
 set ebusMQTT publish ebusd/bai/ReturnTemp/get;&lt;br /&gt;
 set ebusMQTT publish ebusd/bai/FanSpeed/get;&lt;br /&gt;
 set ebusMQTT publish ebusd/bai/WPPWMPower/get;&lt;br /&gt;
 set ebusMQTT publish ebusd/bai/OutdoorstempSensor/get;&lt;br /&gt;
 set ebusMQTT publish ebusd/bai/Status02/get&lt;br /&gt;
 set ebusMQTT publish ebusd/bai/FanHours/get&lt;br /&gt;
 set ebusMQTT publish ebusd/bai/HcHours/get&lt;br /&gt;
 set ebusMQTT publish ebusd/bai/HwcHours/get&lt;br /&gt;
 set ebusMQTT publish ebusd/bai/HwcStarts/get&lt;br /&gt;
&lt;br /&gt;
Diese „get“ sind nur Beispiele, wer weitere Readings abfragen möchte einfach die Liste in der FHEM Eingabe erweitern. Ebenfalls kann der Timer auf persönliche Bedürfnisse angepasst werden.&lt;br /&gt;
&lt;br /&gt;
=== ebus-Spezifische weitere Templates ===&lt;br /&gt;
==== Installation ====&lt;br /&gt;
&lt;br /&gt;
Um die eBus Templates benutzen zu können, müssen sie erst im Verzeichnis „/opt/fhem/FHEM/lib/AttrTemplate“ installiert werden. Hier kann das Mustertemplate „{{Link2Forum|Topic=79600|LinkText=mqtt2.ebus.template}}“ herunter geladen werden. Dieses Template dann in das Verzeichnis kopieren. &lt;br /&gt;
Vor der erstmaligen Benutzung muss dieses template noch Initialisiert werden, sonst wird es in der Templateliste nicht angezeigt.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Bitte das Template immer aus dem richtigen Device (zB: MQTT2_ebusd_430 für die Heizkurve) installieren, ansonsten wird das Reading des Device nicht gefunden bzw. falsch zugeordnet.}}&lt;br /&gt;
&lt;br /&gt;
[[Bild:MQTT2_7templateinitialize.png|400px|thumb|left|vor der ersten Benutzung in der Eingabezeile eingeben]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Dazu in der FHEM Eingabezeile eingeben:&lt;br /&gt;
 { AttrTemplate_Initialize() }&lt;br /&gt;
&lt;br /&gt;
==== Anwendung der Templates ====&lt;br /&gt;
&lt;br /&gt;
Wenn bereits die ersten Messwerte eingetroffen sind und die Devices mit den Readings angelegt wurden, können die Templates angelegt werden. D.h. in der Templateliste das gewünschte auswählen (hier MQTT2_ebusd_bai). Die eBus Templates beginnen alle mit E….&lt;br /&gt;
&lt;br /&gt;
[[Bild:MQTT2_8templateselect.png|400px|thumb|left|Das gewünschte Template auswählen, die Readings müssen allerdings in diesem Device enthalten sein]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Hier wird E_07_eBus_bai_Status01+Status02_HWC gewählt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Bild:MQTT2_5statustemplate.png|400px|thumb|left|Das Template hat die gewünschte Konfiguration in FHEM durchgeführt]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:MQTT2_6status1template.png|400px|thumb|left|Ergebnis des Template, Heizkurve und Warmwassertemperatur]]&lt;br /&gt;
Hier das Ergebnis von HC1HeatCurve+HWCTempDesired&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Muster Templates ====&lt;br /&gt;
&lt;br /&gt;
Es sind auch noch einige Mustertemplates vorhanden die auf Basis von readingsGroup erstellt wurden und ein farbiges Design besitzen. Diese Templates werden nicht im Device, sondern im Room „eBus“ angelegt.&lt;br /&gt;
Der Kreativität der Anwender sind hier fast keine Grenzen gesetzt, die Werkzeuge sind vorhanden.&lt;br /&gt;
&lt;br /&gt;
Achtung: die hier gewählte Nummerierung kann sich im Laufe der Zeit ändern, da die Templates öfters erweitert/geändert werden.&lt;br /&gt;
&lt;br /&gt;
Template: E_05_eBus_bai_readingsgroup_Set_Hcurve_Hotwater&lt;br /&gt;
[[Bild:MQTT2_ebusset.png|250px|thumb|left|Set hcurve und HWCtemdesired]]&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Template: E_01_eBus_bai_readingsgroup_Status01&lt;br /&gt;
[[Bild:MQTT2_ebustemp.png|250px|thumb|left|Statusmeldung als Readingsgroup]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Template: E_02_eBus_bai_readingsgroup_Status01_Balken&lt;br /&gt;
[[Bild:MQTT2_ebustempbalken.png|400px|thumb|left|EStatusmeldung als Readingsgroup mit Balkenanzeige]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Template: E_03_eBus_bai_readingsgroup_Status02&lt;br /&gt;
[[Bild:MQTT2_ebuswarmwasser.png|250px|thumb|left|Statusmeldung als Readingsgroup]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Template: E_04_eBus_bai_readingsgroup_Status02_Balken&lt;br /&gt;
[[Bild:MQTT2_ebuswarmwasserbalken.png|400px|thumb|left|Statusmeldung als Readingsgroup mit Balkenanzeige]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Template: hier noch einige Beispiel Templates die mit devStateIcon erzeugt wurden.&lt;br /&gt;
[[Bild:MQTT2_devStateIcon.png|400px|thumb|left|Templates auf Basis devStateIcon]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Templates erweitern ====&lt;br /&gt;
&lt;br /&gt;
Die Templates können vom User selbst leicht erweitert werden. Dies kann entweder im fertigen &amp;quot;define/defmod&amp;quot; oder aber auch im Template vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Als Beispiel erweitern wir hier die readingsgroup &amp;quot;eBusset&amp;quot; um die Temperatur zur Nachtabsenkung.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;&amp;gt;,&amp;lt;Name&amp;gt;,&amp;lt;&amp;amp;nbsp;Ist&amp;gt;,&amp;lt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Soll&amp;gt;&lt;br /&gt;
 MQTT2_ebusd_430:&amp;lt;%message_tendency_steady&amp;gt;,&amp;lt;Heizkurve&amp;gt;,Hc1HeatCurve_curve_value,&amp;lt;sollcurve&amp;gt;&lt;br /&gt;
 MQTT2_ebusd_430:&amp;lt;%sani_water_hot&amp;gt;,&amp;lt;Warmwasser&amp;gt;,HwcTempDesired_temp1_value,&amp;lt;sollwater&amp;gt;&lt;br /&gt;
 MQTT2_ebusd_430:&amp;lt;%temp_temperature_min&amp;gt;,&amp;lt;Nachtabsenkung&amp;gt;,Hc1NightTemp_temp1_value,&amp;lt;sollnight&amp;gt;&lt;br /&gt;
Dazu erweitern wir als erstes hier die letzte Zeile der Definition&lt;br /&gt;
&lt;br /&gt;
 {&#039;eBusSet.sollcurve&#039;=&amp;gt;&#039;Hc1HeatCurve_curve_value:uzsuDropDown,0.20,0.70,0.90,1.00,1.10,1.20,1.30,1.40,1.50,1.60,1.70&#039;,&lt;br /&gt;
 &#039;eBusSet.sollwater&#039;=&amp;gt;&#039;HwcTempDesired_temp1_value:uzsuDropDown,50.0,51.0,52.0,53.0,54.0,55.0,56.0,57.0,58.0,59.0,60.0&#039;,&lt;br /&gt;
 &#039;eBusSet.sollnight&#039;=&amp;gt;&#039;Hc1NightTemp_temp1_value:uzsuDropDown,10.0,11.0,12.0,13.0,14.0,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0&#039;}&lt;br /&gt;
dann die Sollwertvorgabe um die Hc1NightTemp_temp1_value mit den Vorgaben&lt;br /&gt;
&lt;br /&gt;
 {&#039;Hc1HeatCurve_curve_value&#039; =&amp;gt; &#039;{&amp;quot;style=\&amp;quot;color:\x23&amp;quot;.substr(Color::pahColor(5,10,15,$VALUE*10,0),0,6).&amp;quot;\&amp;quot;&amp;quot;}&#039;, &lt;br /&gt;
 &#039;HwcTempDesired_temp1_value&#039; =&amp;gt; &#039;{&amp;quot;style=\&amp;quot;color:\x23&amp;quot;.substr(Color::pahColor(20,40,60,$VALUE,0),0,6).&amp;quot;\&amp;quot;&amp;quot;}&#039;,&lt;br /&gt;
 &#039;Hc1NightTemp_temp1_value&#039; =&amp;gt; &#039;{&amp;quot;style=\&amp;quot;color:\x23&amp;quot;.substr(Color::pahColor(10,15,20,$VALUE,0),0,6).&amp;quot;\&amp;quot;&amp;quot;}&#039;}&lt;br /&gt;
und schließlich wird noch die dynamische Farbgebung des Sollwertes angepasst.&lt;br /&gt;
&lt;br /&gt;
 set ebusMQTT publish ebusd/430/Hc1NightTemp/get;&lt;br /&gt;
damit auch der Messwert abgefragt wird, muss noch ein Eintrag im EBUS.TIMER dazu gehängt werden.&lt;br /&gt;
[[Bild:MQTT2_Nighttemp.png|400px|thumb|left|Nachtabsenkung Sollwert über readingsgroup]]&lt;br /&gt;
Nach Erweiterung der 3 Zeilen sieht das dann so aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Weiterführende Links=&lt;br /&gt;
Diskussionsthread aus dem Forum:&lt;br /&gt;
*{{Link2Forum|Topic=97989|LinkText=ebusd.mqtt2.template: Fragen, Anregungen}}&lt;br /&gt;
*{{Link2Forum|Topic=79600|LinkText=Läuft: MQTT2 Teil3 Realisierung mit MQTT2_Client mit oder ohne Mosquitto}}&lt;br /&gt;
*{{Link2Forum|Topic=91394|LinkText=zigbee2mqtt mit MQTT2_SERVER und MQTT2_DEVICE}}&lt;br /&gt;
*{{Link2Forum|Topic=97989|LinkText=ebusd.mqtt2.template: Fragen, Anregungen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=31060</id>
		<title>AutoShuttersControl</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=31060"/>
		<updated>2019-07-29T20:13:52Z</updated>

		<summary type="html">&lt;p&gt;TomLee: /* readingsGroup für die Beschattung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Rollläden&lt;br /&gt;
|ModCategory=Automatisierung&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=73_AutoShuttersControl.pm&lt;br /&gt;
|ModOwner=CoolTux ({{Link2FU|13684|Forum}}/[[Benutzer Diskussion:CoolTux|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Mit [[AutoShuttersControl]] oder kurz ASC können typische Aufgabenstellungen im Zusammenhang mit Rollläden u.ä. automatisiert werden, wie zum Beispiel das Öffnen bei Sonnenaufgang, Schließen bei Sonnenuntergang oder das Anfahren von Lüftungspositionen beim Öffnen des zugehörigen Fensters. &lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
{{Hinweis|Das Modul befindet sich derzeit noch in der Entwicklung; der jeweils aktuelle Stand ist  diesem {{Link2Forum|Topic=90751|LinkText=&amp;quot;Thread im Forum&amp;quot;}} zu entnehmen.}}&lt;br /&gt;
Zur Nutzung des Moduls sollten folgende andere FHEM-Devices vorhanden sein:&lt;br /&gt;
* Rollläden&lt;br /&gt;
* Fensterkontakte und &lt;br /&gt;
* Bewohnerstatus auf Basis von Residents/Roomates in englisch. Ersatzweise andere Devices, z.B. Dummys, welche als &#039;&#039;state&#039;&#039; &#039;&#039;home&#039;&#039;, &#039;&#039;asleep&#039;&#039;, &#039;&#039;gotosleep&#039;&#039; und &#039;&#039;awoken&#039;&#039; setzen sowie ein Reading &#039;&#039;lastState&#039;&#039;.&lt;br /&gt;
* Optional:&lt;br /&gt;
** Ein Helligkeitssensor (Steuerung nach Helligkeit und Beschattung)&lt;br /&gt;
** Ein Device zur Bestimmung des Sonnenstands (nur für Beschattung). Unterstützt werden derzeit [[Modul Astro|Astro]] und [[Twilight]]&amp;lt;ref&amp;gt;Dabei müssen ggf. in [[Global|global]] auch Angaben zu &#039;&#039;longitude&#039;&#039; und &#039;&#039;latitude&#039;&#039; vorhanden sein&amp;lt;/ref&amp;gt;. &lt;br /&gt;
** Wenn Feiertage berücksichtigt werden sollen: Ein oder mehrere {{Link2CmdRef|Anker=holiday2we|Lang=en|Label=holiday2we}}-Angaben in [[Global|global]] samt entsprechender [[Wochenende, Feiertage und Schulferien#Feiertage mittels holiday-Datei|holiday]]-Dateien&amp;lt;ref&amp;gt;Es kann auch z.B. ein Dummy-Device verwendet werden, dieses sollte dann aber neben dem eigentlichen Feiertags-&#039;&#039;state&#039;&#039; auch in einem Reading &#039;&#039;tomorrow&#039;&#039; Angaben zu anstehenden Feiertagen enthalten.&amp;lt;/ref&amp;gt; &amp;lt;ref&amp;gt;Bitte verfahren Sie entsprechend, wenn Urlaubs- oder Ferientage wie Feiertage behandelt werden sollen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung des Moduls bzw. dessen Funktionalität erfolgt in mehreren Schritten:&lt;br /&gt;
* Definition des ASC-Devices&lt;br /&gt;
* Einstellung zentraler Vorgaben am ASC-Device&lt;br /&gt;
* Markieren der zukünftig zu steuernden Rollladen-Devices&lt;br /&gt;
* Einbinden der Rollladen-Devices in das ASC-Device&lt;br /&gt;
* Einstellen der individuellen Vorgaben je Rollladen (am Rollladen-Device)&lt;br /&gt;
Dabei geht man am einfachsten schrittweise vor und erweitert die Funktionalität nach und nach um die gewünschten Funktionen. Dann benötigt man jeweils nur einen kleinen Teil der vielen per Attribut einstellbaren Optionen, und kann die Auswirkungen der jeweiligen Änderung besser nachvollziehen. &lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
{{Hinweis|ASC kann auch verwendet werden, um lediglich Teilaufgaben der Rollladensteuerung zu erfüllen, also z.B. nur das morgendliche Öffnen der Rollläden. Allerdings geht dabei ein erheblicher Teil des Komforts verloren, der dadurch entsteht, dass die Steuerung innerhalb der vollintegrierten Lösung jeweils nachvollzieht, aus welchem Grund eine Fahrt erfolgt war und dies ggf. bei der nächsten Aktion berücksichtigt.}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung ===&lt;br /&gt;
Zunächst sollten die in den [[#Basics|Basics]] beschriebenen Geräte vorhanden und funktionsfähig sein. &lt;br /&gt;
&lt;br /&gt;
=== Define des ASC-Devices ===&lt;br /&gt;
Es genügt ein einfaches define ohne weitere Parameter.&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Dies bewirkt neben der Anlage des Devices selbst auch, dass als weiteres globales Attribut &#039;&#039;ASC&#039;&#039; verfügbar wird.&lt;br /&gt;
&lt;br /&gt;
=== Einstellung zentraler Vorgaben ===&lt;br /&gt;
Es stehen am ASC-Device einige Attribute zur Verfügung, über die sich das Verhalten des ASC-Devices insgesamt steuern lässt, z.B. zur Vermeidung von morgendlichen oder abendlichen Fahrten sowie bei Gefahr von Schäden an den Rollläden durch Frost oder zur Reaktion auf Fensterkontakte. Details sind der Commandref zu entnehmen.&lt;br /&gt;
Diese Attribute können auch nachträglich noch geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Markieren zu steuernder Rollladen-Devices ===&lt;br /&gt;
Um einen oder mehrere Rollläden durch das ASC-Device zu steuern, wird für jeden Rollladen jeweils das neue globale Attribut &#039;&#039;ASC&#039;&#039; gesetzt. Der Wert ist mit 1 oder 2 festzulegen, wobei &#039;&#039;&#039;1&#039;&#039;&#039; bedeutet, dass &lt;br /&gt;
* die Offen-Position kleiner ist als die Geschlossen-Position, also typischerweise 0 &#039;&#039;offen&#039;&#039; bedeutet und 100 für &#039;&#039;geschlossen&#039;&#039; steht&lt;br /&gt;
* eine bestimmte Position mit &#039;&#039;&#039;position&#039;&#039;&#039; angefahren wird, also z.B. &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; position 70&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dies ist z.B. die  passende Wahl für ROLLO-Devices&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;2&#039;&#039;&#039; steht für ein umgekehrtes Verhalten und den Befehlsteil &#039;&#039;pct&#039;&#039;, also &#039;&#039;offen&#039;&#039; für &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; pct 100&amp;lt;/code&amp;gt;. Typischer Vertreter dieses Typs sind HomeMatic (CUL_HM-) Geräte oder die Shelly2-Aktoren.&lt;br /&gt;
&lt;br /&gt;
Aus dieser Vorgabe leitet das Modul dann jeweils bestimmte Voreinstellungen (&#039;&#039;defaults&#039;&#039;) für den Rolladen ab, ohne dass die betreffenden, dafür vorgesehenen Attribute ausdrücklich gesetzt werden müssen. Es genügt daher, nur jeweils die Einstellungen zu verändern, die anders gewünscht werden oder für den Rollladenaktortyp anders sein müssen (z.B. &#039;&#039;dim 99&#039;&#039; für vollständiges Öffnen eines ZWave-Aktors).&lt;br /&gt;
{{Hinweis|Das Vorstehende gilt jeweils für den nicht-invertierten Modus! Wer z.B. ein HomeMatic-Gerät mit &#039;&#039;levelinverse&#039;&#039; betreibt, sollte &#039;&#039;ASC&#039;&#039; auf &amp;quot;1&amp;quot; setzen usw.. Maßgeblich ist letztlich nur die Frage, ob die Offen-Positionsangabe nummerisch kleiner oder größer als die Geschlossen-Positionsangabe ist; die konkreten Zahlenwerte spielen dabei keine Rolle, die Angabe &#039;&#039;position&#039;&#039; oder &#039;&#039;pct&#039;&#039; kann auch später über ein weiteres Attribut passend eingestellt werden.}}&lt;br /&gt;
&lt;br /&gt;
=== Einbinden in das ASC-Device ===&lt;br /&gt;
Nachdem man das obige Attribut bei einem oder mehreren Rollladen-Devices gesetzt hat, kann mit &lt;br /&gt;
&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; scanForShutters&amp;lt;/code&amp;gt; ein Suchlauf gestartet werden, mit dem dann diese Rollläden durch das Modul gefunden und in die Steuerungslogik eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellen der individuellen Vorgaben ===&lt;br /&gt;
Nach der Einbindung sind an den Rollladen-Devices weitere Attribute verfügbar, mit denen die für den jeweiligen Rollladen geltenden Einstellungen vorgenommen werden können. &lt;br /&gt;
Die Beschreibung der Attribute ist in der commandref enthalten.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
===Readings im ASC-Device selbst ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR/&amp;gt;Wertebereich !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|..._nextAstroTimeEvent || ||Uhrzeit des nächsten Astro-Events, Sonnenauf- oder Sonnenuntergang oder feste Zeit pro Rollonamen &lt;br /&gt;
|-&lt;br /&gt;
|..._lastPosValue || ||zuletzt abgesetzter Fahrbefehl pro Rollonamen&lt;br /&gt;
|-&lt;br /&gt;
|..._lastDelayPosValue || ||zuletzt abgesetzter Fahrbefehl, welcher beim nächsten zulässigen Event ausgeführt wird&lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off || aktiviert den globalen Partymodus. Alle Rollläden, welche das Attribut &#039;&#039;AutoShuttersControl_Partymode&#039;&#039; bei sich auf &#039;&#039;on&#039;&#039; gestellt haben, werden nicht mehr gesteuert. Der letzte Schaltbefehl, welcher durch ein Fensterevent oder Bewohnerstatus an die Rollläden gesendet wurde, wird erst beim off-setzen (set &amp;lt;ASC-Device&amp;gt; partyMode off) ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|lockOut || on, off ||für das Aktivieren des Aussperrschutzes gemäß des entsprechenden Attributs &#039;&#039;AutoShuttersControl_lock-out&#039;&#039; im jeweiligen Rolladen (siehe Beschreibung bei den Attributen für die Rolladendevices)&lt;br /&gt;
|-&lt;br /&gt;
|room_... || ||Auflistung aller Rollläden, welche in den jeweiligen Räumen gefunden wurden, Bsp.: room_Schlafzimmer,Terrasse&lt;br /&gt;
|-&lt;br /&gt;
|state || ||Status des &amp;lt;ASC-Device&amp;gt; active, enabled, disabled&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday|| on,off ||legt fest, ob das Rolladendevice das Attribut &#039;&#039;AutoShuttersControl_Time_Up_WE_Holiday&#039;&#039; beachtet oder nicht&lt;br /&gt;
|-&lt;br /&gt;
|userAttrList || rolled out ||Status der UserAttribute, welche an die Rollläden gesendet werden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings in den Rolllädendevices ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveUp ||Sonnenaufgangszeit für das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveDown ||Sonnenuntergangszeit für das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersLastDrive ||Grund des letzten Fahrens vom Rolladen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==set- und get-Befehle für das ASC-Device==&lt;br /&gt;
&lt;br /&gt;
=== set-Anweisungen ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR/&amp;gt;Wertebereich !! Beschreibung  &lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off ||aktiviert den globalen Partymodus. Siehe Reading &#039;&#039;partyMode&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|lockOut ||on, off ||aktiviert den globalen Aussperrschutz. Siehe Reading &#039;&#039;lockOut&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|renewSetSunriseSunsetTimer || || erneuert bei allen Rollläden die Zeiten für Sunset und Sunrise und setzt die internen Timer neu.&lt;br /&gt;
|-&lt;br /&gt;
|scanForShutters || ||sucht alle FHEM Devices mit dem Attribut &#039;&#039;AutoShuttersControl&#039;&#039; &#039;&#039;1&#039;&#039; oder &#039;&#039;2&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday || on,off ||aktiviert/deaktiviert die Beachtung des Attributes &#039;&#039;AutoShuttersControl_Time_Up_WE_Holiday&#039;&#039; für Rollladen-Devices&lt;br /&gt;
|-&lt;br /&gt;
|createNewNotifyDev || ||Legt die interne Struktur für NOTIFYDEV neu an&lt;br /&gt;
|-&lt;br /&gt;
|selfDefence ||on, off||aktiviert/deaktiviert den Selbstschutz: wenn das Residents-Device &#039;&#039;absent&#039;&#039; meldet, &#039;&#039;selfDefence&#039;&#039; aktiv ist und ein Fenster im Haus noch offen steht, wird an diesem Fenster das Rollo runtergefahren&lt;br /&gt;
|-&lt;br /&gt;
|wiggle ||||bewegt einen Rollladen oder alle Rollläden (für Abschreckungszwecke bei der Alarmierung) um &#039;&#039;ASC_WiggleValue&#039;&#039;-%, und nach 1 Minute wieder zurück zur Ursprungsposition&lt;br /&gt;
|-&lt;br /&gt;
|||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get-Anweisungen ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| showShuttersInformations ||zeigt eine Übersicht der Automatik-Fahrzeiten&lt;br /&gt;
|-&lt;br /&gt;
| showNotifyDevsInformations ||zeigt eine Übersicht der abgelegten NOTIFYDEV Struktur. Dient zur Kontrolle&lt;br /&gt;
|}&lt;br /&gt;
== Attribute ==&lt;br /&gt;
{{Hinweis|Die Attributnamen haben sich teilweise geändert, nachfolgend ist noch ein Stand vor Modulversion 0.6.5.x wiedergegeben. Die aktuellen Benennungen sind der Commandref zu entnehmen.}}&lt;br /&gt;
{{Hinweis|In der commandref findet sich häufig die Schreibweise &amp;lt;code&amp;gt;ASC_BrightnessSensor Sensorname[:brightness [400:800]]&amp;lt;/code&amp;gt;. Dabei sind die Angaben in den eckigen Klammern optional. Dies müssen also nicht angegeben werden, stattdessen verwendet das Modul dann Standardwerte (siehe cref), die in der cref zu findenden Angaben entsprechen dabei den defaults. Werden Werte angegeben, sind die eckigen Klammern &#039;&#039;&#039;wegzulassen&#039;&#039;&#039;! Beispiel: &amp;lt;code&amp;gt;ASC_BrightnessSensor hm_motion_1 70:100&amp;lt;/code&amp;gt; würde das brightness-Reading des Sensors hm_motion_1 verwenden und einen morgendlichen Schwellenwert von 70 bzw. 100 für abends.}}&lt;br /&gt;
===Attribute direkt am ASC-Device ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR/&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_antifreezeTemp || || ||Temperatur, ab welcher der Frostschutz greift und das Rollo nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEvening ||aktuell REAL, CIVIL, NAUTIC, ASTRONOMIC, HORIZON || || (in genau dieser Schreibweise)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEveningHorizon || || || Höhe über Horizont, wenn beim Attribut &#039;&#039;AutoShuttersControl_autoAstroModeEvening&#039;&#039; &#039;&#039;HORIZON&#039;&#039; ausgewählt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorning ||aktuell REAL, CIVIL, NAUTIC, ASTRONOMIC, HORIZON || ||(in genau dieser Schreibweise)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorningHorizon || || ||Höhe über Horizont, wenn beim Attribut &#039;&#039;AutoShuttersControl_autoAstroModeMorning&#039;&#039; &#039;&#039;HORIZON&#039;&#039; ausgewählt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlComfort ||on, off || ||aktiviert die Komfortfunktion. Bedeutet, dass ein Rollladen mit einem threestate (Drehgriff-) Sensor am Fenster beim Öffnen in die &amp;quot;Komfortposition&amp;quot; fährt. Diese wird beim Rollladendevice über das Attribut &#039;&#039;AutoShuttersControl_Pos_after_ComfortOpen&#039;&#039; eingestellt.&lt;br /&gt;
|- &lt;br /&gt;
|ASC_autoShuttersControlEvening ||on, off || ||ob Abends die Rollläden automatisch zeitgesteuert werden sollen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlMorning ||on, off || ||ob Morgens die Rollläden automatisch zeitgesteuert werden sollen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_temperatureReading || || ||Reading für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_temperatureSensor || || ||Device für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_timeUpHolidayDevice || || ||Device zur Urlaubserkennung oder Sonstiges / muss &#039;&#039;0&#039;&#039; oder &#039;&#039;1&#039;&#039; im Reading &#039;&#039;state&#039;&#039; beinhalten.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_residentsDevice|| || ||Devicenamen des Residents-Device der obersten Ebene&lt;br /&gt;
|-&lt;br /&gt;
|ASC_residentsDeviceReading|| || ||Status Reading des Residents-Device der obersten Ebene&lt;br /&gt;
|-&lt;br /&gt;
|ASC_brightnessMinVal|| || ||minimaler Lichtwert, bei dem Schaltbedingungen noch geprüft werden sollen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_brightnessMaxVal || || ||maximaler Lichtwert, bei dem Schaltbedingungen noch geprüft werden sollen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_rainSensorDevice || || ||Device, welches bei Regen getriggert wird&lt;br /&gt;
|-&lt;br /&gt;
|ASC_rainSensorReading || || ||das ensprechende Reading zum Regendevice&lt;br /&gt;
|-&lt;br /&gt;
|ASC_rainSensorShuttersClosedPos || || ||Position in pct, welche der Rollladen bei Regen anfahren soll &lt;br /&gt;
|-&lt;br /&gt;
|ASC_shuttersDriveOffset  || || ||maximale zufällige Verzögerung in Sekunden bei der Berechnung der Fahrzeiten, &#039;&#039;0&#039;&#039; bedeutet keine Verzögerung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_twilightDevice || || ||Device, welches Informationen zum Sonnenstand liefert, wird unter anderem für die Beschattung verwendet.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_expert || || ||bei &#039;&#039;1&#039;&#039; werden erweiterte Informationen bezüglich des NotifyDevs unter &#039;&#039;set&#039;&#039; und &#039;&#039;get&#039;&#039; angezeigt&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Attribute in den Rolllädendevices===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR/&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC || 0, 1, 2|| ||0 = &amp;quot;kein Anlegen der Attribute beim ersten Scan bzw. keine Beachtung eines Fahrbefehles&amp;quot;,1 = &amp;quot;Inverse oder Rollo - Bsp.: Rollo Oben 0, Rollo Unten 100 und der Befehl zum prozentualen Fahren ist position&amp;quot;,2 = &amp;quot;Homematic Style - Bsp.: Rollo Oben 100, Rollo Unten 0 und der Befehl zum prozentualen Fahren ist pct&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze || soft, am, pm, hard, off|| ||Frostschutz, wenn &#039;&#039;soft&#039;&#039; fährt der Rollladen in die &#039;&#039;ASC_Antifreeze_Pos&#039;&#039;, bei &#039;&#039;hard/am/pm&#039;&#039; wird gar nicht oder innerhalb der entsprechenden Tageszeit nicht gefahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze_Pos || || ||Position, die angefahren werden soll, wenn der Fahrbefehl komplett schließen lautet, aber der Frostschutz aktiv ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_AutoAstroModeEvening ||REAL, CIVIL, NAUTIC, ASTRONOMIC, HORIZON || ||aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC&lt;br /&gt;
|-&lt;br /&gt;
|ASC_AutoAstroModeEveningHorizon || || ||Höhe über Horizont, wenn beim Attribut &#039;&#039;ASC_autoAstroModeEvening&#039;&#039; &#039;&#039;HORIZON&#039;&#039; ausgewählt ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_AutoAstroModeMorning ||REAL, CIVIL, NAUTIC, ASTRONOMIC, HORIZON || ||aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC&lt;br /&gt;
|-&lt;br /&gt;
|ASC_AutoAstroModeMorningHorizon || || ||Höhe über Horizont, wenn beim Attribut &#039;&#039;ASC_autoAstroModeMorning&#039;&#039; &#039;&#039;HORIZON&#039;&#039; ausgewählt ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Closed_Pos || || ||in 10er Schritten von 0 bis 100,default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Down || astro, time, brightness || ||bei &#039;&#039;astro&#039;&#039; wird Sonnenuntergang berechnet, bei &#039;&#039;time&#039;&#039; wird der Wert aus &#039;&#039;ASC_Time_Down_Early&#039;&#039; als Fahrzeit verwendet und bei &#039;&#039;brightness&#039;&#039; muss &#039;&#039;ASC_Time_Down_Early&#039;&#039; und &#039;&#039;ASC_Time_Down_Late&#039;&#039; korrekt gesetzt werden. Der Timer läuft dann nach &#039;&#039;ASC_Time_Down_Late&#039;&#039;-Zeit,es wird aber in der Zeit zwischen &#039;&#039;ASC_Time_Down_Early&#039;&#039; und &#039;&#039;ASC_Time_Down_Late&#039;&#039; geschaut, ob die als Attribut im Moduldevice hinterlegte &#039;&#039;ASC_brightnessMinVal&#039;&#039; erreicht wurde. Wenn ja, wird der Rolladen runter gefahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Down ||always, home, absent, off || ||wann darf die Automatik herunterfahren. immer, niemals oder bei Abwesenheit des Roommate (ist kein Roommate und &#039;&#039;absent&#039;&#039; eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Up ||always, home, absent, off || ||wann darf die Automatik hochfahren. immer, niemals oder bei Abwesenheit des Roommate (ist kein Roommate und &#039;&#039;absent&#039;&#039; eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Drive_Offset || || ||maximale zufällige Verzögerung in Sekunden bei der Berechnung der Fahrzeiten, &#039;&#039;0&#039;&#039; bedeutet sofort, &#039;&#039;-1&#039;&#039; bedeutet, dass das gleichwertige Attribut aus dem ASC-Device ausgewertet werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Open_Pos || || ||in 10er-Schritten von 0 bis 100, default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Partymode || on, off || ||schaltet den Partymodus an oder aus. Wird dann am ASC Device &#039;&#039;set &amp;lt;ASC-DEVICE&amp;gt; partyMode on&#039;&#039; geschaltet, werden alle Fahrbefehle an den Rollläden, welche das Attribut auf &#039;&#039;on&#039;&#039; haben, zwischengespeichert und erst später ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Pos_Reading || || ||Name des Readings, welches die Position des Rollladen in Prozent angibt. Wird bei unbekannten Device-Typen auch als &#039;&#039;set&#039;&#039; Befehl zum Fahren verwendet&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Pos_after_ComfortOpen || || ||in 10er-Schritten von 0 bis 100, default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Reading || || ||Reading des Roommate-Device, welches den Status wieder gibt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Device || || ||mit Komma getrennte Namen des/der Roommate-Device/s welche den/die Bewohner des Rollladen-Raumes wiedergibt. Macht nur Sinn in Schlaf- oder Kinderzimmern&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Early || || ||Sunset früheste Zeit zum Runterfahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Late || || ||Sunset späteste Zeit zum Runterfahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Early || || ||Sunrise früheste Zeit zum Hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Late || || ||Sunrise späteste Zeit zum Hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_WE_Holiday || || ||Sunrise früheste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet).&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Up || astro, time, brightness || ||bei &#039;&#039;astro&#039;&#039; wird Sonnenaufgang berechnet, bei &#039;&#039;time&#039;&#039; wird der Wert aus &#039;&#039;ASC_Time_Up_Early&#039;&#039; als Fahrzeit verwendet und bei &#039;&#039;brightness&#039;&#039; müssen &#039;&#039;ASC_Time_Up_Early&#039;&#039; und &#039;&#039;ASC_Time_Up_Late&#039;&#039; korrekt gesetzt werden. Der Timer läuft dann nach &#039;&#039;ASC_Time_Up_Late&#039;&#039;-Zeit, es wird aber in der Zeit zwischen &#039;&#039;ASC_Time_Up_Early&#039;&#039; und &#039;&#039;ASC_Time_Up_Late&#039;&#039; geschaut, ob die als Attribut im Moduldevice hinterlegte &#039;&#039;ASC_brightnessMinVal&#039;&#039; erreicht wurde. Wenn ja, wird der Rolladen runter gefahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Ventilate_Pos || || ||in 10er-Schritten von 0 bis 100, default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Ventilate_Window_Open || || ||auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec || || ||Name des Fensterkontakts, an welchen Fenster der Rollladen angebracht ist. Sein Reading &#039;&#039;state&#039;&#039; muss die Werte &#039;&#039;open&#039;&#039;, &#039;&#039;closed&#039;&#039; oder &#039;&#039;tilted&#039;&#039; enthalten.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec_subType || || ||Typ des verwendeten Fensterkontakts: &#039;&#039;twostate&#039;&#039; (optisch oder magnetisch) oder &#039;&#039;threestate&#039;&#039; (Drehgriffkontakt)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_LockOut || soft, hard || ||stellt entsprechend den Aussperrschutz ein. Bei global aktiven Aussperrschutz (&#039;&#039;set ASC-Device lockOut soft&#039;&#039;) und einem Fensterkontakt &#039;&#039;open&#039;&#039; bleibt dann der Rolladen oben. Dies gilt nur bei Steuerbefehle über das ASC-Modul. Stellt man global auf &#039;&#039;hard&#039;&#039;, wird bei entsprechender Möglichkeit versucht, den Rollladen hardwareseitig zu blockieren. Dann ist auch ein Fahren über die Taster nicht mehr möglich.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_LockOutCmd || inhibit, blocked || ||set Befehl für das Rolladen-Device zum Sperren per Hardware. Der Befehl wird verwendet, wenn &#039;&#039;ASC_LockOut&#039;&#039; auf &#039;&#039;hard&#039;&#039; gesetzt ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Self_Defense_Exclude || on, off || ||bei &#039;&#039;on&#039;&#039; wird dieser Rolladen bei aktiven &#039;&#039;selfDefence&#039;&#039; und offenen Fenster nicht runter gefahren, wenn Residents absent ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Brightness_Sensor || || ||Sensor-Device, welches für die Lichtwerte verwendet wird. ACHTUNG! Findet auch Verwendung bei ASC_Down - brightness&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BrightnessMinVal || || ||minimaler Lichtwert, bei dem Schaltbedingungen noch geprüft werden sollen / wird der Wert von &#039;&#039;-1&#039;&#039; nicht geändert, so wird automatisch der Wert aus dem Moduldevice genommen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BrightnessMaxVal || || ||maximaler Lichtwert, bei dem Schaltbedingungen noch geprüft werden sollen / wird der Wert von &#039;&#039;-1&#039;&#039; nicht geändert, so wird automatisch der Wert aus dem Moduldevice genommen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersPlace || window, terrace || ||wenn dieses Attribut auf &#039;&#039;terrace&#039;&#039; gesetzt ist und das Residents-Device in den Status &#039;&#039;gone&#039;&#039; geht und &#039;&#039;selfDefence&#039;&#039; aktiv ist, wird das Rollo geschlossen&lt;br /&gt;
|-  &lt;br /&gt;
|ASC_WiggleValue || || ||Wert, um welchen sich die Position des Rollladens bei &#039;&#039;Wiggle&#039;&#039; ändern soll &lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_afterManual || || ||Wartezeit in Sekunden, die die Automatik nach einer manuellen Fahrt aussetzen soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforNightClose || || ||Vorgabezeit in Sekunden, innerhalb derer vor dem nächtlichen Schließen keine Öffnen-Fahrt mehr ausgeführt werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforDayOpen || || ||Vorgabezeit in Sekunden, innerhalb derer vor dem morgendlichen Öffnen keine Schließen-Fahrt mehr ausgeführt werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Direction || || ||Position in Grad, auf der das Fenster liegt - genau Osten wäre 90, Süden 180 und Westen 270&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Pos || || ||Position des Rollladens für die Beschattung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Angle_Left || || ||Vorlaufwinkel im Bezug zum Fenster, ab wann abgeschattet wird. Beispiel: Fenster 180° - 85° ==&amp;gt; ab Sonnenpos. 95° wird abgeschattet&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Angle_Right || || ||Nachlaufwinkel im Bezug zum Fenster, bis wann abgeschattet wird. Beispiel: Fenster 180° + 85° ==&amp;gt; bis Sonnenpos. 265° wird abgeschattet&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Mode || || ||absent,always,off,home / Vorgabe, wann Beschattungsaktionen durchzuführen sind&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_StateChange_Sunny || || ||Brightness Wert ab welchen Beschattung statt finden soll, immer in Abhängikkeit der anderen einbezogenden Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_StateChange_Cloudy || || ||Brightness Wert ab welchen die Beschattung aufgehoben werden soll, immer in Abhängikkeit der anderen einbezogenden Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Min_Elevation || || ||ab welcher Höhe des Sonnenstandes soll beschattet werden, immer in Abhängikkeit der anderen einbezogenden Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Min_OutsideTemperature || || ||ab welcher Temperatur soll Beschattet werden, immer in Abhängikkeit der anderen einbezogenden Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_WaitingPeriod || || ||wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung statt finden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDownTime_beforNightClose || || ||wie viele Sekunden vor dem abendlichen schlie&amp;amp;zlig;en soll der Rollladen in die Sichtschutzposition fahren, -1 bedeutet das diese Funktion unbeachtet bleiben soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDown_Pos || || ||Position den Rollladens für den Sichtschutz&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||    &lt;br /&gt;
|-  &lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||        &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hilfsmittel ==&lt;br /&gt;
{{Hinweis|Die Device-Namen sind auf die eigene Installation anzupassen.}}&lt;br /&gt;
&lt;br /&gt;
=== Interne Übersicht ===&lt;br /&gt;
[[Bild:ASC Overview.JPG|thumb|right|weblink - Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt;&lt;br /&gt;
 define ASC_Jalousie_Info weblink htmlCode {AutoShuttersControl::GetShuttersInformation($defs{&#039;JalousieControl&#039;})}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Codezeilen sind im [[Import von Code Snippets|RAW]]-Format.}}&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Level ===&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText= Stand 2019-05-03&lt;br /&gt;
* Erfolgreich getestet mit Homematic Devices, Beta-User&lt;br /&gt;
* Die Farbgebung entspricht dem Standard, wenn unter dem Style f18 der Farbpreset &#039;&#039;light&#039;&#039; gewählt wird.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Schliessen bis&amp;gt;,&amp;lt;Öffnen auf&amp;gt;,&amp;lt;Beschattung&amp;gt;,&amp;lt;Komfort&amp;gt;,&amp;lt;Lüften&amp;gt;,&amp;lt;Privacy&amp;gt; (Rollladen_.*|Jalousie_.*)..:level,!?ASC_Closed_Pos,!?ASC_Open_Pos,!?ASC_Shading_Pos,!?ASC_ComfortOpen_Pos,!?ASC_Ventilate_Pos,!?ASC_PrivacyDown_Pos&lt;br /&gt;
attr rg_ASC_Rolllaeden_Level commands {level =&amp;gt; &#039;pct:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_ComfortOpen_Pos =&amp;gt; &#039;ASC_ComfortOpen_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_PrivacyDown_Pos =&amp;gt; &#039;ASC_PrivacyDown_Pos:selectnumbers,0,5,100,0,lin&#039;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Zeiten ===&lt;br /&gt;
[[Bild:ReadingsGroup ASC times.png|thumb|right|ReadingsGroup - Zeitenbeispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Position&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Up_WE/Hol&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt; \&lt;br /&gt;
 (.*Rollo.*|.*Rollladen|Jalousie_.*):level,!?ASC_Time_Up_Early,!?ASC_Time_Up_Late,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times commands {level =&amp;gt; &#039;pct:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100&#039;, \&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, \&lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;, \&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,\&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:55,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,  \&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt; &#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;, \&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;, \&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039; }&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times room Rollladen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC RG Zeiten HM ZWave Siro.png|thumb|right|ReadingsGroup - CUL_HM+ZWave+Siro mit widgets]]Neue Version mit time-Widgets und pct/dim/position-widget (5-er Schritte), passend für CUL_HM, ZWave und Siro-Geräte:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Time_Up_Early  &amp;gt;,&amp;lt;Time_Up_WE  &amp;gt;,&amp;lt;Time_Up_Late  &amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt; (Rollo_.*|Jalousie_.*)..:(level|dim|position),!?ASC_Time_Up_Early,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Up_Late,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times commands {level =&amp;gt; &#039;pct:selectnumbers,0,5,100,0,lin&#039;, \&lt;br /&gt;
dim =&amp;gt; &#039;dim:selectnumbers,0,5,99,0,lin&#039;,\&lt;br /&gt;
position =&amp;gt; &#039;pct:selectnumbers,0,5,99,0,lin&#039;,\&lt;br /&gt;
ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;,\&lt;br /&gt;
ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039;,\&lt;br /&gt;
ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:time&#039;, \&lt;br /&gt;
ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:time&#039;,\&lt;br /&gt;
ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:time&#039;, \&lt;br /&gt;
ASC_Time_Up_Late =&amp;gt;&#039;ASC_Time_Up_Late:time&#039;,\&lt;br /&gt;
ASC_Time_Up_WE_Holiday =&amp;gt;&#039;ASC_Time_Up_WE_Holiday:time&#039;}&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times room Rollladen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  readingsGroup für die Beschattung ===&lt;br /&gt;
[[Bild:ReadingsGroup ASC shading.png|thumb|right|ReadingsGroup - Beschattungsbeispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;&lt;br /&gt;
defmod rg_ASC_Rolllaeden_Shading readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Modus&amp;gt;,&amp;lt;Position&amp;gt;,&amp;lt;Richtung&amp;gt;,&amp;lt;°links&amp;gt;,&amp;lt;°rechts&amp;gt;,&amp;lt;Elevation&amp;gt;,&amp;lt;Sunny&amp;gt;,&amp;lt;Cloudy&amp;gt;,&amp;lt;Min Temp&amp;gt; (Rollo|Jalousie)_.*..:!?ASC_Shading_Mode,!?ASC_Shading_Pos,!?ASC_Shading_Direction,!?ASC_Shading_Angle_Left,!?ASC_Shading_Angle_Right,!?ASC_Shading_MinMax_Elevation,!?ASC_Shading_StateChange_Sunny,!?ASC_Shading_StateChange_Cloudy,!?ASC_Shading_Min_OutsideTemperature&lt;br /&gt;
attr rg_ASC_Rolllaeden_Shading alias Rollläden: Beschattung&lt;br /&gt;
attr rg_ASC_Rolllaeden_Shading commands {ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:knob,min:0,max:100,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:5,lineCap:round&#039;,\&lt;br /&gt;
ASC_Shading_Mode =&amp;gt; &#039;ASC_Shading_Mode:always,home,absent,off&#039;,\&lt;br /&gt;
ASC_Shading_Direction =&amp;gt; &#039;ASC_Shading_Direction:knob,min:0,max:360,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:1,cursor:true,lineCap:round&#039;,\&lt;br /&gt;
ASC_Shading_Angle_Left =&amp;gt; &#039;ASC_Shading_Angle_Left:knob,min:0,max:85,angleArc:85,rotation:anticlockwise,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:5,lineCap:round,angleOffset:270&#039;,\&lt;br /&gt;
ASC_Shading_Angle_Right =&amp;gt; &#039;ASC_Shading_Angle_Right:knob,min:0,max:85,angleArc:85,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:5,lineCap:round,&#039;,\&lt;br /&gt;
ASC_Shading_MinMax_Elevation =&amp;gt; &#039;ASC_Shading_MinMax_Elevation:knob,min:0,max:35,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:1,lineCap:round,angleArc:120,angleOffset:270&#039;,\&lt;br /&gt;
ASC_Shading_StateChange_Sunny =&amp;gt; &#039;ASC_Shading_StateChange_Sunny:knob,min:100,max:40000,angleArc:85,rotation:anticlockwise,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:20,lineCap:round,angleOffset:270&#039;,\&lt;br /&gt;
ASC_Shading_StateChange_Cloudy =&amp;gt; &#039;ASC_Shading_StateChange_Cloudy:knob,min:100,max:40000,angleArc:85,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:20,lineCap:round,&#039;,\&lt;br /&gt;
ASC_Shading_Min_OutsideTemperature =&amp;gt; &#039;ASC_Shading_Min_OutsideTemperature:knob,min:5,max:30,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:0.5,lineCap:round,angleArc:120,angleOffset:270&#039;}&lt;br /&gt;
attr rg_ASC_Rolllaeden_Shading room Rollladen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Anderes {{Link2Forum|Topic=99980|Message=946357|LinkText=Foren-Beispiel}} für eine RG zu Beschattung (für V. 0.6.x):&lt;br /&gt;
[[Bild:ReadingsGroup ASC shading2.png|thumb|right|ReadingsGroup - Beschattungsbeispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;&lt;br /&gt;
defmod rg_ASC_Shading readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Grad&amp;gt;,&amp;lt;Position&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Links&amp;gt;,&amp;lt;Rechts&amp;gt;,&amp;lt;Wait&amp;gt;,&amp;lt;ShadeIn&amp;gt;,&amp;lt;ShadeOut&amp;gt;,&amp;lt;Elevation&amp;gt;,&amp;lt;Temperature&amp;gt;,&amp;lt;Device&amp;gt;\&lt;br /&gt;
(Rollo_.*|Jalousie.*):!?ASC_Shading_Direction,!?ASC_Shading_Pos,!?ASC_Shading_Mode,!?ASC_Shading_Angle_Left,!?ASC_Shading_Angle_Right,!?ASC_Shading_WaitingPeriod,!?ASC_Shading_StateChange_Sunny,!?ASC_Shading_StateChange_Cloudy,!?ASC_Shading_MinMax_Elevation,!?ASC_Shading_Min_OutsideTemperature,!?ASC_BrightnessSensor\&lt;br /&gt;
&lt;br /&gt;
attr rg_ASC_Shading commands {ASC_Shading_Direction =&amp;gt; &#039;ASC_Shading_Direction:129,255,309&#039;,\&lt;br /&gt;
ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_Mode =&amp;gt; &#039;ASC_Shading_Mode:absent,always,off,home&#039;,\&lt;br /&gt;
ASC_Shading_Angle_Left =&amp;gt; &#039;ASC_Shading_Angle_Left:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_Angle_Right =&amp;gt; &#039;ASC_Shading_Angle_Right:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_WaitingPeriod =&amp;gt; &#039;ASC_Shading_WaitingPeriod:selectnumbers,0,60,1200,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_StateChange_Sunny =&amp;gt; &#039;ASC_Shading_StateChange_Sunny:selectnumbers,0,20,1000,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_StateChange_Cloudy =&amp;gt; &#039;ASC_Shading_StateChange_Cloudy:selectnumbers,0,20,1000,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_MinMax_Elevation =&amp;gt;\&lt;br /&gt;
&#039;ASC_Shading_Min_Elevation:selectnumbers,0,1,40,0,lin&#039; ,\&lt;br /&gt;
ASC_Shading_Min_OutsideTemperature =&amp;gt;\&lt;br /&gt;
&#039;ASC_Shading_Min_OutsideTemperature:selectnumbers,0,1,30,0,lin&#039;}&lt;br /&gt;
attr rg_ASC_Shading room Rollladen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  readingsGroup für FIBARO Roller Shutter FGR-222 Devices ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Getestet von majestro84, Stand 2019-01-28.&lt;br /&gt;
* https://forum.fhem.de/index.php/topic,92628.msg897099.html#msg897099&lt;br /&gt;
* Die Farbgebung entspricht dem Standard, wenn unter dem Style f18 der Farbpreset &#039;&#039;dark&#039;&#039; gewählt wird}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC Jalousien Times.JPG|thumb|right|Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt;define ASC_Jalousien_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_WE&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt;,&amp;lt;PartyMode&amp;gt;,&amp;lt;LockOut&amp;gt; (.*_Jalousie.*):position,!?ASC_Time_Up_Early,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Up_Late,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up,!?ASC_Partymode,!?ASC_LockOut&lt;br /&gt;
&lt;br /&gt;
 attr ASC_Jalousien_Times commands {position =&amp;gt; &#039;dim:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;,&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039;,&lt;br /&gt;
 ASC_Partymode =&amp;gt; &#039;ASC_Partymode:on,off&#039;,&lt;br /&gt;
 ASC_LockOut =&amp;gt; &#039;ASC_LockOut:soft,hard,off&#039;,&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, &lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;,&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:45,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt;&#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;}&lt;br /&gt;
 attr ASC_Jalousien_Times room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC Jalousien Level.JPG|thumb|right|Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt; define Jalousien_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Closed_Pos&amp;gt;,&amp;lt;Open_Pos&amp;gt;,&amp;lt;Comfort_Pos&amp;gt;,&amp;lt;Ventilate_Pos&amp;gt;,&amp;lt;PrivacyDown_Pos&amp;gt;,&amp;lt;Shading_Pos&amp;gt; (.*_Jalousie.*):!?ASC_Closed_Pos,!?ASC_Open_Pos,!?ASC_ComfortOpen_Pos,!?ASC_Ventilate_Pos,!?ASC_PrivacyDown_Pos,!?ASC_Shading_Pos&lt;br /&gt;
 attr Jalousien_Level commands { ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_ComfortOpen_Pos =&amp;gt; &#039;ASC_ComfortOpen_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_PrivacyDown_Pos =&amp;gt; &#039;ASC_PrivacyDown_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;}&lt;br /&gt;
 attr Jalousien_Level room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einrichtungsbeispiel ==&lt;br /&gt;
=== Zielsetzung und Vorgaben ===&lt;br /&gt;
Es sollen alle Rollläden und Jalousien in einem Haus innerhalb bestimmter zeitlicher Grenzen Morgens und Abends sonnenstandsabhängig gefahren werden, an den Wochenenden und an Ferientagen soll etwas später geöffnet werden. Es sind Tür- und Fensterkontakte vorhanden (Türkontakte: twoState, Fensterkontakte: threeState), wobei bei jeder Öffnung ein eventuell geschlossener Rollladen geöffnet werden soll. Bei allen Rollladenaktoren, Tür- und Fensterkontakten handelt es sich um CUL_HM-Geräte.&lt;br /&gt;
&lt;br /&gt;
=== Vorarbeiten ===&lt;br /&gt;
Im global-Device sind Angaben zu latitude und longitude vorhanden, holiday2we wie folgt&amp;lt;ref&amp;gt;&#039;&#039;ferien&#039;&#039; ist eine automatisiert erstellte holiday-Datei nach diesem {{Link2Forum|Topic=85759|Message=885883|LinkText=Foren-Beitrag}}.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr global holiday2we bw,ferien&lt;br /&gt;
Weitere Angaben benötigen wir zunächst nicht, die Festlegung eines Astro-Devices erfolgt hier erst im Rahmen der Beschattung. &lt;br /&gt;
Dann erfolgt das &#039;&#039;Define des ASC-Devices&#039;&#039; wie oben beschrieben:&lt;br /&gt;
&amp;lt;code&amp;gt;define Rollladenautomatik AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Folgen die einzubindenden Rollladenaktoren einem einheitlichen Namensschema, können diese sodann z.B. mit &lt;br /&gt;
 attr (Jalousie|Rollladen)_.* ASC 2&lt;br /&gt;
auf einen Rutsch mit dem passenden ASC-Typ gekennzeichnet werden. Dann verteilen wir mir &lt;br /&gt;
 set Rollladenautomatik scanForShutters&lt;br /&gt;
die nachfolgend weiter zu bearbeitenden Attribute.&lt;br /&gt;
=== Schließen morgens und abends ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Alternative: Fahren nach brightness:&lt;br /&gt;
Will man insgesamt oder nur an einzelnen Rollläden stattdessen helligkeitsgesteuert fahren, muß für jeden Rollladen ein Helligkeitssensor definiert und entweder zentral oder am einzelnen Rollladen jeweils ein Höchst- bzw. Mindestwert festgelegt werden (&#039;&#039;ASC_BrightnessMinVal&#039;&#039; etc.), bei dessen Überschreitung geöffnet bzw. Unterschreitung geschlossen werden soll.}}&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Da wir sonnenstandsabhängig Fahrzeiten wollen, legen wir erst einmal fest, dass dies morgens und abends berücksichtigt werden soll:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeEvening CIVIL&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeMorning CIVIL&lt;br /&gt;
attr Rollladenautomatik ASC_autoShuttersControlEvening on&lt;br /&gt;
attr Rollladenautomatik ASC_autoShuttersControlMorning on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aus der Angabe &#039;&#039;CIVIL&#039;&#039; und den Vorgaben in den einzelnen Rollladen wird dabei mit Hilfe von [[SUNRISE_EL]] die effektive Fahrzeit berechnet, dort finden sich auch weitere Hinweise, zu den meisten anderen Optionen für die ersten beiden Attribute.&lt;br /&gt;
Bei allen Fensteröffnungen soll auf eine Lüften-Position gefahren werden, also schalten wir diese Funktion ebenfalls zentral an&amp;lt;ref&amp;gt;Sonst wird bei threeState-Sensoren nur bei &#039;&#039;tilted&#039;&#039; auf die in &#039;&#039;ASC_Ventilate_Pos&#039;&#039; gefahren.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr Rollladenautomatik ASC_autoShuttersControlComfort on &lt;br /&gt;
Zuletzt legen wir noch einen Temperatur-Sensor fest. Dieser wird beim Frostschutz sowie bei der Beschattung berücksichtigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_temperatureSensor Aussentemperatur_Nord&lt;br /&gt;
attr Rollladenautomatik ASC_temperatureReading temperature&lt;br /&gt;
attr Rollladenautomatik ASC_freezeTemp 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tbd: &lt;br /&gt;
* Rain&lt;br /&gt;
* Wind&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
===== Fahrzeiten =====&lt;br /&gt;
Zur Konfiguration der Fahrzeiten bietet es sich an, eine ReadingsGroup zu nutzen, wie unter [[#Hilfsmittel|Hilfsmittel]] dargestellt. Alternativ kann man die Zeiten auch manuell in den einzelnen Rollläden hinterlegen.&lt;br /&gt;
===== Bewohner =====&lt;br /&gt;
Wird ein Raum von einer oder mehreren bestimmten Person/en bewohnt oder gibt es ein Sammel-Gerät für mehrere Bewohner, kann dies mit den Attributen &#039;&#039;ASC_Roommate_Device&#039;&#039; und &#039;&#039;ASC_Roommate_Reading&#039;&#039; einem Rollladen zugeordnet werden. Ist einer der Bewohner &#039;&#039;asleep&#039;&#039;, wird morgens erst geöffnet, wenn auch der letzte Roommate nicht mehr &#039;&#039;asleep&#039;&#039; ist.&lt;br /&gt;
===== Fensterkontakte  =====&lt;br /&gt;
Dann werden ggf. vorhandene Fensterkontakte zugeordnet und der Typ festgelegt, wobei im Falle von threeState-Sensoren das übergreifende &#039;&#039;ASC_autoShuttersControlComfort&#039;&#039; beachtet wird, wobei dann bei vollstäniger Öffnung des Fensters auf den in &#039;&#039;ASC_ComfortOpen_Pos&#039;&#039; festgelegten Wert gefahren wird.&lt;br /&gt;
===== Frostschutz =====&lt;br /&gt;
Zuletzt können die Attribute &#039;&#039;ASC_Antifreeze&#039;&#039; und &#039;&#039;ASC_Antifreeze_Pos&#039;&#039; festgelegt werden, wenn die Frostschutzfunktion aktiviert werden soll.&lt;br /&gt;
=== Beschattung ===&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Benötigt werden Informationen zum Sonnenstand. Hierfür wird ein astro- oder twilight-Device benötigt. Ist ein solches definiert, wird dies - ggf. auch nach einem Neustart vom Modul automatisch erkannt und in das Attribut &#039;&#039;ASC_twilightDevice&#039;&#039; eingetragen. Wir legen daher zunächst ein entsprechendes Device an bzw. passen die Angabe ggf. an, wenn ein anderes als das eingetragene genutzt werden soll.&lt;br /&gt;
Weiter ist ein Temperatursensor für die Beschattung festzulegen (&#039;&#039;ASC_temperatureSensor.*&#039;&#039;-Attribute) wie bereits oben beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
Zum einen legt man einen Helligkeitssensor fest (&#039;&#039;ASC_Brightness_Sensor&#039;&#039; und &#039;&#039;ASC_Brightness_Reading&#039;&#039;). Dieser ist der eigentliche Trigger. Nur, wenn sich der Brightness Wert ändert, werden Azimut, Elevation, Temperatur und die Ein- und Ausfallswinkel ausgelesen und/oder berechnet und basierend auf diesen Werten entschieden ob shading in oder shading out stattfinden soll, die Schwellwerte werden in &#039;&#039;ASC_Shading_StateChange_Sunny&#039;&#039; (Beschattung soll eingeschaltet werden) und &#039;&#039;ASC_Shading_StateChange_Cloudy&#039;&#039; (Beschattung soll beendet werden) festgelegt, wobei immer nur gefahren wird, wenn auch alles andere - insbesondere die Mindesthöhe des Sonnenstands (&#039;&#039;ASC_Shading_Min_Elevation&#039;&#039;) und die Mindesttemperatur &#039;&#039;ASC_Shading_Min_OutsideTemperature&#039;&#039; - passt.&lt;br /&gt;
Dann sind die Winkelangaben festzulegen, ggf. kann ein Kompass zu Hilfe genommen werden (&#039;&#039;ASC_Shading_Direction&#039;&#039; ist die Richtung des Fensters, 90 Grad entspricht Ost, 180 Grad Süden, &#039;&#039;ASC_Shading_Angle_Left&#039;&#039; ist der Sonneneintritt ins Zimmer, wird von -Direction abgezogen, &#039;&#039;ASC_Shading_Angle_Right&#039;&#039; hat diesselbe Funktion für den Austrittswinkel.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Funktionen ===&lt;br /&gt;
==== Privacy ====&lt;br /&gt;
Werden hierfür Werte festgelegt, werden die betreffenden Rollläden die festgelegte Zeit vor dem abendlichen Schließen vorab teilweise geschlossen. Dies kann z.B. gewünscht sein, um Rollläden zur Straße hin mit viel Fußgängerverkehr zwar nicht vollständig abzudunkeln, aber gleichzeitig zu verhindern, dass von außen in Wohnräume geschaut werden kann, sobald dort das Licht angeschaltet wird&lt;br /&gt;
==== BlockingTime====&lt;br /&gt;
Bewirkt, dass nach einer manuellen Fahrt wird eine vom ASC Modul initiierte Fahrt zunächst ausgesetzt wird, bis die im Attribute angegebene Zeit überschritten ist. Erst dann wird eine dann vom ASC Modul initiierte Fahrt tatsächlich durchgeführt.&lt;br /&gt;
Genau so wird ein hochfahren eines Rollos durch das ASC Modul nicht mehr ausgeführt wenn es innerhalb der Zeit von ASC_BlockingTime_beforNightClose und das runterfahren wird nicht mehr erfolgen wenn es innerhalb von ASC_BlockingTime_beforDayOpen ist.&lt;br /&gt;
Beispiel: Meine Tochter geht früh aus Haus und Ihre Rollos sind nicht hoch gefahren. Diese fahren auch nicht mehr hoch da die ausschließlich bei home (anwesend) fahren sollen. Nun kommt sie am Nachmittag um 16:23 Uhr nach Hause, eigentlich sollten nun die Rollos fahren. Doch die Sonnenuntergangsfahrt (schließen) wäre schon 16:51 Uhr und damit innerhalb der 3600 ASC_BlockingTime_beforNightClose. Die Rollos bleiben also unten. Es lohnt sich für die paar Minuten einfach nicht mehr.&lt;br /&gt;
==== wiggle====&lt;br /&gt;
Mit einem &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; wiggle&amp;lt;/code&amp;gt; können alle Rollladen mit einem entsprechenden Attribut zu einer kurzen Fahrt veranlasst werden, nach Ablauf von einer Minute wieder um denselben Wert zurück. Dabei wird jeweils in die Richtung gefahren, die den weiteren Weg ermöglicht. Wenn also zu 70% geschlossen ist, wird der Rollladen hoch fahren.&lt;br /&gt;
==== Partymode ====&lt;br /&gt;
Dieser wird am ASC-Device selbst aktiviert mittels &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; partyMode on&amp;lt;/code&amp;gt;. Alle Rollladen-Devices, welche das Attribut &#039;&#039;ASC_Partymode&#039;&#039; auf &#039;&#039;on&#039;&#039; gestellt haben, werden nicht mehr gesteuert. Der letzte Schaltbefehl, der durch ein Fensterevent oder Bewohnerstatus an die Rollläden gesendet wurde, beim Beenden des Modus durch &amp;lt;code&amp;gt;set ASC-Device partyMode off&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
==== lock-out ====&lt;br /&gt;
(tbd auch hier: Doku ist etwas verteilt, könnte man im Wiki jeweils unter einem eigenen Unterabschnitt im Zusammenhang darstellen)&lt;br /&gt;
&lt;br /&gt;
==== SelfDefense ====&lt;br /&gt;
Das bei einem absent nur da die Rollläden geschlossen werden wo das Fenster vergessen wurde zu schließen.&lt;br /&gt;
Beim wechsel in gone wird nur an den makierten Terassentüren (&#039;&#039;ASC_ShuttersPlace terrace&#039;&#039;) der Rollladen runter gefahren.&lt;br /&gt;
Weitere Attribute dazu: &#039;&#039;ASC_Self_Defense_Exclude&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sonstige Hinweise ==&lt;br /&gt;
* Werden Attribute geändert, kann es vereinzelt vorkommen, dass das ASC-Modul dies nicht mitbekommt und das tatsächliche Verhalten nicht den Erwartungen entspricht. In so einem Fall empfielt es sich, das NOTIFYDEV nochmals aufbauen zu lassen. Dazu werden zunächst mit &amp;lt;code&amp;gt;set &amp;lt;ASC-Modul&amp;gt; expert 1&amp;lt;/code&amp;gt; erweiterte Informationen bezüglich des NotifyDevs unter set und get aktiviert und anschließend ein &amp;lt;code&amp;gt;set &amp;lt;ASC-Modul&amp;gt; createNewNotifyDev&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Link2Forum|Topic=92628|LinkText=&amp;quot;Thread zum Modul im Forum&amp;quot;}}&lt;br /&gt;
* {{Link2Forum|Topic=90751|LinkText=&amp;quot;Thread zur Entwicklung im Forum&amp;quot;}} &lt;br /&gt;
* {{Link2Forum|Topic=73964|LinkText=&amp;quot;Thread zu den Scripten von user cluni&amp;quot;}}, die der Entwicklung des Moduls zugrunde liegen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>TomLee</name></author>
	</entry>
</feed>