<?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=KernSani</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=KernSani"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/KernSani"/>
	<updated>2026-04-30T18:39:11Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29177</id>
		<title>ROLLO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29177"/>
		<updated>2019-01-20T15:33:16Z</updated>

		<summary type="html">&lt;p&gt;KernSani: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:ROLLO}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Rollo-Steuerung zur einfachen Anzeige/Programmierung&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModFTopic=95832&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= ---- noch nicht Teil von FHEM ----&amp;gt;&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModTechName=44_ROLLO.pm&lt;br /&gt;
|ModOwner=KernSani}}&lt;br /&gt;
Das Modul [[ROLLO]] bietet eine einfache Möglichkeit, mit ein bis zwei Relais den Hoch-/Runterlauf eines Rolladen zu steuern und punktgenau anzuhalten. Außerdem wird die aktuelle Position in fhem abgebildet.&lt;br /&gt;
Über welche Hardware/Module die Ausgänge angesprochen werden ist dabei egal.&lt;br /&gt;
__TOC__&lt;br /&gt;
Das Modul unterstützt beliebige Konfigurationen welche Befehle ausgeführt werden müssen um die Hardware des Rollos zu steuern.&lt;br /&gt;
&lt;br /&gt;
* Die Rollo-Position wird in 10%-Schritten von 0% (offen) bis 100% (geschlossen) zwischengespeichert um auf der Oberfläche für jede Position ein Icon festlegen zu können. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Rolladen Eintrag.PNG|right|thumb|400px|Verschiedene Ansichten des Rollo:offen, fährt gerade herunter, position 50, fährt gerade hoch, geschlossen]]&lt;br /&gt;
Vorteil dieses Moduls:&lt;br /&gt;
&lt;br /&gt;
Ist ein Rollo mit diesem Modul definiert kann man auf der Oberfläche per Klick das Rollo hoch/runter oder auf eine bestimmte Position fahren. Der aktuelle Status des Rollo (fährt hoch/runter,offen,geschlossen,etc.) wird angezeigt.&lt;br /&gt;
Die Oberflächenicons werden per devStateIcon gesteuert, Icons und Farben können für jeden Status individuell formatiert werden, die Standard Kommandos auf der Oberfläche (hier: offen, geschlossen, schlitz, Position) können ebenfalls per Attribut angepasst werden. Das Status-Icon ist anklickbar.&lt;br /&gt;
Beim Anlegen des Moduls werden die Attribute zur Darstellung in fhem mit Standardwerten angelegt, so dass man sich einiges an Tipparbeit sparen kann, aber trotzdem die Möglichkeit hat die Darstellung individuell anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Das eigentliche ansteuern des Rollo muss mit FHEM Befehlen ausführbar sein, diese Modul ist &amp;quot;nur&amp;quot; eine Oberfläche/Bedienmodul, kein Hardwaremodul.&lt;br /&gt;
&lt;br /&gt;
Wenn ROLLO installiert wurde, bevor es Bestandteil von FHEM wurde und lange kein Update gemacht wurde, wirst du die &amp;quot;position&amp;quot; readings und das entsprechende set Kommando vermissen. &amp;quot;position&amp;quot; wurde durch &amp;quot;pct&amp;quot; ersetzt, um Kompatibilität mit anderen Modulen [https://fhem.de/commandref_DE.html#AutoShuttersControl Automatic Shutter Control - ASC] sicher zu stellen. Bitte passe deine notifies/DOIFs entsprechend an.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Dieses Modul ist in der offiziellen FHEM-Auslieferung enthalten.}}&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
 define &amp;lt;name&amp;gt; ROLLO&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&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;
|rl_type ||attr &amp;lt;Rollo-Device&amp;gt; rl_type [normal|HomeKit] ||||Typunterscheidung zur unterstützung verschiedener Hardware. Abhängig vom gewählten Typ wird die Richtung von der die pct gerechnet wird festgelegt:&lt;br /&gt;
&lt;br /&gt;
    normal = pct 0 ist offen, pct 100 ist geschlossen&lt;br /&gt;
    HomeKit = pct 100 ist offen, pct 0 ist geschlossen&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsDown||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsDown &amp;lt;number&amp;gt; ||||Sekunden zum hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsUp &amp;lt;number&amp;gt; ||||Sekunden zum herunterfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessTop ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessTop &amp;lt;number&amp;gt; ||||Zeit die mein Rollo Fahren muss ohne das sich die Rollo-pct ändert (bei mir fährt der Rollo noch in die Wand, ohne das man es am Fenster sieht, die pct ist also schon bei 0%)&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessBottom ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessBottom &amp;lt;number&amp;gt; ||||(siehe excessTop)&lt;br /&gt;
|-&lt;br /&gt;
|rl_switchTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_switchTime &amp;lt;number&amp;gt; ||||Zeit die zwischen 2 gegensätzlichen Laufbefehlen pausiert werden soll, also wenn der Rollo z.B. gerade runter fährt und ich den Befehl gebe hoch zu fahren, dann soll 1 sekunde gewartet werden bis der Motor wirklich zum stillstand kommt, bevor es wieder in die andere Richtung weiter geht. Dies ist die einzige Zeit die nichts mit der eigentlichen Laufzeit des Motors zu tun hat, sondern ein timer zwischen den Laufzeiten.&lt;br /&gt;
|-&lt;br /&gt;
|rl_resetTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_resetTime &amp;lt;number&amp;gt; ||||Zeit die beim Anfahren von Endpositionen (offen,geschlossen) der Motor zusätzlich an bleiben soll um sicherzustellen das die Endposition wirklich angefahren wurde. Dadurch können Differenzen in der Positionsberechnung korrigiert werden.&lt;br /&gt;
|-&lt;br /&gt;
|rl_reactionTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_reactionTime &amp;lt;number&amp;gt; ||||Zeit für den Motor zum reagieren&lt;br /&gt;
|-&lt;br /&gt;
|rl_autoStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_autoStop [0|1] ||||Es muss kein Stop-Befehl ausgeführt werden, das Rollo stoppt von selbst.&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandUp &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum hochfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandDown &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum runterfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStop &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird, sofern nicht commandStopDown bzw. commandStopUp definiert sind&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopDown &amp;lt;string&amp;gt; ||||Befehl der zum stoppen ausgeführt wird, wenn der Rollo gerade herunterfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopUp &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird,wenn der Rollo gerade hochfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_blockMode ||attr &amp;lt;Rollo-Device&amp;gt; rl_blockMode [blocked|force-open|force-closed|only-up|only-down|half-up|half-down|none] ||||wenn ich den Befehl blocked ausführe, dann wird aufgrund der blockMode-Art festgelegt wie mein Rollo reagieren soll:&lt;br /&gt;
&lt;br /&gt;
    blocked = Rollo lässt sich nicht mehr bewegen&lt;br /&gt;
    force-open = bei einem beliebigen Fahrbefehl wird Rollo hochgefahren&lt;br /&gt;
    force-closed = bei einem beliebigen Fahrbefehl wird Rollo runtergefahren&lt;br /&gt;
    only-up = Befehle zum runterfahren werden ignoriert&lt;br /&gt;
    only-down = Befehle zum hochfahren werden ignoriert&lt;br /&gt;
    half-up = es werden nur die Positionen 50-100 angefahren, bei pct &amp;lt;50 wird pct 50% angefahren,&lt;br /&gt;
    half-down = es werden nur die Positionen 0-50 angefahren, bei pct &amp;gt;50 wird pct 50 angefahren&lt;br /&gt;
    none = block-Modus ist deaktiviert&lt;br /&gt;
|-&lt;br /&gt;
|automatic-enabled ||attr &amp;lt;Rollo-Device&amp;gt; automatic-enabled [on|off] ||||Wenn auf off gestellt, haben Befehle über Modul ROLLO_Automatic keine Auswirkungen auf diesen Rollo&lt;br /&gt;
|-&lt;br /&gt;
|automatic-delay ||attr &amp;lt;Rollo-Device&amp;gt; automatic-delay &amp;lt;number&amp;gt; ||||Dieses Attribut wird nur fuer die Modulerweiterung ROLLADEN_Automatic benoetigt.&lt;br /&gt;
Hiermit kann einge Zeitverzoegerund fuer den Rolladen eingestellt werden, werden die Rolladen per Automatic heruntergefahren, so wird dieser um die angegebenen minuten spaeter heruntergefahren.&lt;br /&gt;
|-&lt;br /&gt;
|rl_forceDrive ||attr &amp;lt;Rollo-Device&amp;gt; rl_forceDrive [0|1] ||||open/closed wird ausgeführt, auch wenn das ROLLO bereits in der Zielposition ist&lt;br /&gt;
|-&lt;br /&gt;
|rl_noSetPosBlocked ||attr &amp;lt;Rollo-Device&amp;gt; rl_noSetPosBlocked [0|1] ||||Wenn deaktiviert, können Positionsn (pct) auch gesetzt werden, wenn der ROLLO geblockt ist. Nach dem unblocken wird die entsprechende Position angefahren.&lt;br /&gt;
|-&lt;br /&gt;
|||disableattr &amp;lt;Rollo-Device&amp;gt; disable [0|1] ||||Wenn deaktiviert, können keine set oder get commandos für den ROLLO ausgeführt werden.&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;
=== Set ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|open ||set &amp;lt;Rollo-Device&amp;gt; open ||Faehrt das Rollo komplett auf (pct 0)&lt;br /&gt;
|-&lt;br /&gt;
|closed ||set &amp;lt;Rollo-Device&amp;gt; closed||Faehrt das Rollo komplett zu (pct 100)&lt;br /&gt;
|-&lt;br /&gt;
|up ||set &amp;lt;Rollo-Device&amp;gt; up ||Faehrt das Rollo um 10 auf (pct +10)&lt;br /&gt;
|-&lt;br /&gt;
|down ||set &amp;lt;Rollo-Device&amp;gt; down ||Faehrt das Rollo um 10 zu (pct -10)&lt;br /&gt;
|-&lt;br /&gt;
|half || set &amp;lt;Rollo-Device&amp;gt; half ||Faehrt das Rollo zur haelfte runter bzw. hoch (pct 50)&lt;br /&gt;
|-&lt;br /&gt;
|stop ||set &amp;lt;Rollo-Device&amp;gt; stop ||Stoppt das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|drive ||set &amp;lt;Rollo-Device&amp;gt; drive up 5||Fährt das Rollo in die angegebene Richtung für die angegebene Zeit (in Sekunden)&lt;br /&gt;
|-&lt;br /&gt;
|blocked ||set &amp;lt;Rollo-Device&amp;gt; blocked ||wenn aktiviert, kann der ROLLO nur noch eingeschränkt gesteuert werden. Siehe Attribut block_mode für Details.&lt;br /&gt;
|-&lt;br /&gt;
|unblocked ||set &amp;lt;Rollo-Device&amp;gt; unblocked ||Aktiviert einen geblockten ROLLO wieder für die normale Benutzung&lt;br /&gt;
|-&lt;br /&gt;
|pct ||set &amp;lt;Rollo-Device&amp;gt; pct &amp;lt;value&amp;gt; ||Faehrt das Rollo auf eine beliebige pct zwischen 0 (offen) - 100 (geschlossen)&lt;br /&gt;
|-&lt;br /&gt;
|reset ||set &amp;lt;Rollo-Device&amp;gt; reset &amp;lt;value&amp;gt; ||Sagt dem Modul in welcher pct sich der Rollo befindet&lt;br /&gt;
|-&lt;br /&gt;
|extern ||set &amp;lt;Rollo-Device&amp;gt; extern &amp;lt;value&amp;gt; ||Der Software mitteilen dass gerade Befehl X bereits ausgeführt wurde und nun z.B,. das berechnen der aktuellen pct gestartet werden soll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|version ||get &amp;lt;Rollo-Device&amp;gt; version ||Gibt die version des Modul Rollos aus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!Wert !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|command||open,stop,closed||&lt;br /&gt;
|-&lt;br /&gt;
|desired_pct||0-100||Zielposition die angefahren werden soll (nur sinnvoll während das Rollo fährt)&lt;br /&gt;
|-&lt;br /&gt;
|drive-type||modul,extern||bei dem Befehl &amp;quot;set rollo extern ..&amp;quot; wird dieses attribut auf &amp;quot;extern&amp;quot; gestellt, sonst immer &amp;quot;modul&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|last_drive||drive-up,drive-down||die zuletzt benutzte Fahrtrichtung&lt;br /&gt;
|-&lt;br /&gt;
|pct||0-100||exakte Position des Rollo&lt;br /&gt;
|-&lt;br /&gt;
|state||open,closed,position-[0-100]||die Position gerundet auf ganze 10% Schritte, identisch mit dem Internal STATE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
===Set===&lt;br /&gt;
 set RolladenWohnzimmer pct 50&lt;br /&gt;
 set RolladenWohnzimmer geschlossen&lt;br /&gt;
 set RolladenWohnzimmer offen &lt;br /&gt;
Drei Beispiele das Rollo-Modul anzuweisen verschiedene Positionen anzufahren.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer extern stop&lt;br /&gt;
Das Rollo-Modul wird angewiesen den status auf &amp;quot;nicht fahren&amp;quot; zu setzen, die aktuelle Rollo-Position zu berechnen und als neue Position abzuspeichern. Der eigentliche Rollo-Stop-Befehl wird dabei aber nicht gesendet.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer reset closed&lt;br /&gt;
In der Oberfläche von fhem wird für das Rollo die Position &amp;quot;geschlossen&amp;quot; gespeichert, ohne Berechnungen durchzuführen oder Hardware zu steuern. Wird evtl. benötigt wenn der Ist-Status von den Soll-Werten aus fhem abweicht.&lt;br /&gt;
&lt;br /&gt;
===Zusammenspiel mit externem Taster===&lt;br /&gt;
In einem Anwendungszenario hat ein Nutzer zusätzliche Taster an seinem Rollo-Motor über die er ihn ebenfalls steuern kann. &lt;br /&gt;
Die Taster selber senden keine Events an fhem, nur der Rollo-Motor.&lt;br /&gt;
Hier ein Beispiel wie das ganze für aussehen könnte und diese Taster in das ROLLO-Modul integriert werden:&lt;br /&gt;
&lt;br /&gt;
 define rollo_manuell_auf DOIF ([meinRollo_Kanal1] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern open) DOELSEIF ([meinRollo_Kanal1] eq &amp;quot;off&amp;quot; and [?meinRolloModul] eq &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
 define rollo_manuell_ab  DOIF ([meinRollo_Kanal2] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern closed) DOELSEIF ([meinRollo_Kanal2] eq &amp;quot;off&amp;quot; and [?meinRolloModul] eq &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
&lt;br /&gt;
meinRollo_Kanal1 und meinRollo_Kanal2 sind die Hardwarekanäle die in dem Rollo-Modul zum hochfahren/runterfahren benutzt werden. &lt;br /&gt;
Das erste DOIF prüft ob das Rollo hoch fährt, ohne das das Rollo-Modul davon etwas weis. Ist dem so wird dem Rollo Modul mithilfe des set &amp;lt;extern&amp;gt; mitgeteilt das das Rollo bereits gestartet wurde. Das Modul fängt an die Zeit zu zählen und aktualisiert den Status der Oberfläche auf &amp;quot;fahre hoch&amp;quot;.&lt;br /&gt;
IM DOELSEIF wird abgefragt ob das Rollo steht, obwohl das Modul denkt das Rollo würde noch fahren. Ist dem so wird wieder mithilfe des set &amp;lt;extern&amp;gt; dem Modul mitgeteilt das das Rollo gestoppt wurde. Das Modul berechnet nun aufgrund der gefahrenen Zeit die aktuelle Position und aktualisiert den Status der Oberfläche auf die Position.&lt;br /&gt;
&lt;br /&gt;
Das gleiche wird dann im zweiten DOIF nochmal für das herunterfahren gemacht.&lt;br /&gt;
&lt;br /&gt;
Man kann nun das Rollo sowohl über die Oberfläche als auch per Taster bedienen und fhem und der reale Ist-Status sind synchron. Ach eine gleichzeitige Bedienung ist möglich, Das Rollo startet z.B. aufgrund einer Automatisierung morgens zum hochfahren und man klickt schnell auf den Taster neben dem Bett und stoppt das ganze wieder.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=95832|LinkText=Forum}} seit das Modul Bestandteil der offiziellen FHEM Auslieferung ist&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=47202|LinkText=Forum}} bevor das Modul Bestandteil von FHEM war&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29176</id>
		<title>ROLLO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29176"/>
		<updated>2019-01-20T15:33:00Z</updated>

		<summary type="html">&lt;p&gt;KernSani: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:ROLLO}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Rollo-Steuerung zur einfachen Anzeige/Programmierung&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModFTopic=95832&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= ---- noch nicht Teil von FHEM ----&amp;gt;&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModTechName=44_ROLLO.pm&lt;br /&gt;
|ModOwner=KernSani}}&lt;br /&gt;
Das Modul [[ROLLO]] bietet eine einfache Möglichkeit, mit ein bis zwei Relais den Hoch-/Runterlauf eines Rolladen zu steuern und punktgenau anzuhalten. Außerdem wird die aktuelle Position in fhem abgebildet.&lt;br /&gt;
Über welche Hardware/Module die Ausgänge angesprochen werden ist dabei egal.&lt;br /&gt;
__TOC__&lt;br /&gt;
Das Modul unterstützt beliebige Konfigurationen welche Befehle ausgeführt werden müssen um die Hardware des Rollos zu steuern.&lt;br /&gt;
&lt;br /&gt;
* Die Rollo-Position wird in 10%-Schritten von 0% (offen) bis 100% (geschlossen) zwischengespeichert um auf der Oberfläche für jede Position ein Icon festlegen zu können. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Rolladen Eintrag.PNG|right|thumb|400px|Verschiedene Ansichten des Rollo:offen, fährt gerade herunter, position 50, fährt gerade hoch, geschlossen]]&lt;br /&gt;
Vorteil dieses Moduls:&lt;br /&gt;
&lt;br /&gt;
Ist ein Rollo mit diesem Modul definiert kann man auf der Oberfläche per Klick das Rollo hoch/runter oder auf eine bestimmte Position fahren. Der aktuelle Status des Rollo (fährt hoch/runter,offen,geschlossen,etc.) wird angezeigt.&lt;br /&gt;
Die Oberflächenicons werden per devStateIcon gesteuert, Icons und Farben können für jeden Status individuell formatiert werden, die Standard Kommandos auf der Oberfläche (hier: offen, geschlossen, schlitz, Position) können ebenfalls per Attribut angepasst werden. Das Status-Icon ist anklickbar.&lt;br /&gt;
Beim Anlegen des Moduls werden die Attribute zur Darstellung in fhem mit Standardwerten angelegt, so dass man sich einiges an Tipparbeit sparen kann, aber trotzdem die Möglichkeit hat die Darstellung individuell anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Das eigentliche ansteuern des Rollo muss mit FHEM Befehlen ausführbar sein, diese Modul ist &amp;quot;nur&amp;quot; eine Oberfläche/Bedienmodul, kein Hardwaremodul.&lt;br /&gt;
&lt;br /&gt;
Wenn ROLLO installiert wurde, bevor es Bestandteil von FHEM wurde und lange kein Update gemacht wurde, wirst du die &amp;quot;position&amp;quot; readings und das entsprechende set Kommando vermissen. &amp;quot;position&amp;quot; wurde durch &amp;quot;pct&amp;quot; ersetzt, um Kompatibilität mit anderen Modulen [https://fhem.de/commandref_DE.html#AutoShuttersControl Automatic Shutter Control - ASC] sicher zu stellen. Bitte passe deine notifies/DOIFs entsprechend an.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Dieses Modul ist in der offiziellen FHEM-Auslieferung enthalten.}}&lt;br /&gt;
&lt;br /&gt;
und FHEM neu starten&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
 define &amp;lt;name&amp;gt; ROLLO&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&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;
|rl_type ||attr &amp;lt;Rollo-Device&amp;gt; rl_type [normal|HomeKit] ||||Typunterscheidung zur unterstützung verschiedener Hardware. Abhängig vom gewählten Typ wird die Richtung von der die pct gerechnet wird festgelegt:&lt;br /&gt;
&lt;br /&gt;
    normal = pct 0 ist offen, pct 100 ist geschlossen&lt;br /&gt;
    HomeKit = pct 100 ist offen, pct 0 ist geschlossen&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsDown||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsDown &amp;lt;number&amp;gt; ||||Sekunden zum hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsUp &amp;lt;number&amp;gt; ||||Sekunden zum herunterfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessTop ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessTop &amp;lt;number&amp;gt; ||||Zeit die mein Rollo Fahren muss ohne das sich die Rollo-pct ändert (bei mir fährt der Rollo noch in die Wand, ohne das man es am Fenster sieht, die pct ist also schon bei 0%)&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessBottom ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessBottom &amp;lt;number&amp;gt; ||||(siehe excessTop)&lt;br /&gt;
|-&lt;br /&gt;
|rl_switchTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_switchTime &amp;lt;number&amp;gt; ||||Zeit die zwischen 2 gegensätzlichen Laufbefehlen pausiert werden soll, also wenn der Rollo z.B. gerade runter fährt und ich den Befehl gebe hoch zu fahren, dann soll 1 sekunde gewartet werden bis der Motor wirklich zum stillstand kommt, bevor es wieder in die andere Richtung weiter geht. Dies ist die einzige Zeit die nichts mit der eigentlichen Laufzeit des Motors zu tun hat, sondern ein timer zwischen den Laufzeiten.&lt;br /&gt;
|-&lt;br /&gt;
|rl_resetTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_resetTime &amp;lt;number&amp;gt; ||||Zeit die beim Anfahren von Endpositionen (offen,geschlossen) der Motor zusätzlich an bleiben soll um sicherzustellen das die Endposition wirklich angefahren wurde. Dadurch können Differenzen in der Positionsberechnung korrigiert werden.&lt;br /&gt;
|-&lt;br /&gt;
|rl_reactionTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_reactionTime &amp;lt;number&amp;gt; ||||Zeit für den Motor zum reagieren&lt;br /&gt;
|-&lt;br /&gt;
|rl_autoStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_autoStop [0|1] ||||Es muss kein Stop-Befehl ausgeführt werden, das Rollo stoppt von selbst.&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandUp &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum hochfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandDown &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum runterfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStop &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird, sofern nicht commandStopDown bzw. commandStopUp definiert sind&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopDown &amp;lt;string&amp;gt; ||||Befehl der zum stoppen ausgeführt wird, wenn der Rollo gerade herunterfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopUp &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird,wenn der Rollo gerade hochfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_blockMode ||attr &amp;lt;Rollo-Device&amp;gt; rl_blockMode [blocked|force-open|force-closed|only-up|only-down|half-up|half-down|none] ||||wenn ich den Befehl blocked ausführe, dann wird aufgrund der blockMode-Art festgelegt wie mein Rollo reagieren soll:&lt;br /&gt;
&lt;br /&gt;
    blocked = Rollo lässt sich nicht mehr bewegen&lt;br /&gt;
    force-open = bei einem beliebigen Fahrbefehl wird Rollo hochgefahren&lt;br /&gt;
    force-closed = bei einem beliebigen Fahrbefehl wird Rollo runtergefahren&lt;br /&gt;
    only-up = Befehle zum runterfahren werden ignoriert&lt;br /&gt;
    only-down = Befehle zum hochfahren werden ignoriert&lt;br /&gt;
    half-up = es werden nur die Positionen 50-100 angefahren, bei pct &amp;lt;50 wird pct 50% angefahren,&lt;br /&gt;
    half-down = es werden nur die Positionen 0-50 angefahren, bei pct &amp;gt;50 wird pct 50 angefahren&lt;br /&gt;
    none = block-Modus ist deaktiviert&lt;br /&gt;
|-&lt;br /&gt;
|automatic-enabled ||attr &amp;lt;Rollo-Device&amp;gt; automatic-enabled [on|off] ||||Wenn auf off gestellt, haben Befehle über Modul ROLLO_Automatic keine Auswirkungen auf diesen Rollo&lt;br /&gt;
|-&lt;br /&gt;
|automatic-delay ||attr &amp;lt;Rollo-Device&amp;gt; automatic-delay &amp;lt;number&amp;gt; ||||Dieses Attribut wird nur fuer die Modulerweiterung ROLLADEN_Automatic benoetigt.&lt;br /&gt;
Hiermit kann einge Zeitverzoegerund fuer den Rolladen eingestellt werden, werden die Rolladen per Automatic heruntergefahren, so wird dieser um die angegebenen minuten spaeter heruntergefahren.&lt;br /&gt;
|-&lt;br /&gt;
|rl_forceDrive ||attr &amp;lt;Rollo-Device&amp;gt; rl_forceDrive [0|1] ||||open/closed wird ausgeführt, auch wenn das ROLLO bereits in der Zielposition ist&lt;br /&gt;
|-&lt;br /&gt;
|rl_noSetPosBlocked ||attr &amp;lt;Rollo-Device&amp;gt; rl_noSetPosBlocked [0|1] ||||Wenn deaktiviert, können Positionsn (pct) auch gesetzt werden, wenn der ROLLO geblockt ist. Nach dem unblocken wird die entsprechende Position angefahren.&lt;br /&gt;
|-&lt;br /&gt;
|||disableattr &amp;lt;Rollo-Device&amp;gt; disable [0|1] ||||Wenn deaktiviert, können keine set oder get commandos für den ROLLO ausgeführt werden.&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;
=== Set ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|open ||set &amp;lt;Rollo-Device&amp;gt; open ||Faehrt das Rollo komplett auf (pct 0)&lt;br /&gt;
|-&lt;br /&gt;
|closed ||set &amp;lt;Rollo-Device&amp;gt; closed||Faehrt das Rollo komplett zu (pct 100)&lt;br /&gt;
|-&lt;br /&gt;
|up ||set &amp;lt;Rollo-Device&amp;gt; up ||Faehrt das Rollo um 10 auf (pct +10)&lt;br /&gt;
|-&lt;br /&gt;
|down ||set &amp;lt;Rollo-Device&amp;gt; down ||Faehrt das Rollo um 10 zu (pct -10)&lt;br /&gt;
|-&lt;br /&gt;
|half || set &amp;lt;Rollo-Device&amp;gt; half ||Faehrt das Rollo zur haelfte runter bzw. hoch (pct 50)&lt;br /&gt;
|-&lt;br /&gt;
|stop ||set &amp;lt;Rollo-Device&amp;gt; stop ||Stoppt das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|drive ||set &amp;lt;Rollo-Device&amp;gt; drive up 5||Fährt das Rollo in die angegebene Richtung für die angegebene Zeit (in Sekunden)&lt;br /&gt;
|-&lt;br /&gt;
|blocked ||set &amp;lt;Rollo-Device&amp;gt; blocked ||wenn aktiviert, kann der ROLLO nur noch eingeschränkt gesteuert werden. Siehe Attribut block_mode für Details.&lt;br /&gt;
|-&lt;br /&gt;
|unblocked ||set &amp;lt;Rollo-Device&amp;gt; unblocked ||Aktiviert einen geblockten ROLLO wieder für die normale Benutzung&lt;br /&gt;
|-&lt;br /&gt;
|pct ||set &amp;lt;Rollo-Device&amp;gt; pct &amp;lt;value&amp;gt; ||Faehrt das Rollo auf eine beliebige pct zwischen 0 (offen) - 100 (geschlossen)&lt;br /&gt;
|-&lt;br /&gt;
|reset ||set &amp;lt;Rollo-Device&amp;gt; reset &amp;lt;value&amp;gt; ||Sagt dem Modul in welcher pct sich der Rollo befindet&lt;br /&gt;
|-&lt;br /&gt;
|extern ||set &amp;lt;Rollo-Device&amp;gt; extern &amp;lt;value&amp;gt; ||Der Software mitteilen dass gerade Befehl X bereits ausgeführt wurde und nun z.B,. das berechnen der aktuellen pct gestartet werden soll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|version ||get &amp;lt;Rollo-Device&amp;gt; version ||Gibt die version des Modul Rollos aus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!Wert !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|command||open,stop,closed||&lt;br /&gt;
|-&lt;br /&gt;
|desired_pct||0-100||Zielposition die angefahren werden soll (nur sinnvoll während das Rollo fährt)&lt;br /&gt;
|-&lt;br /&gt;
|drive-type||modul,extern||bei dem Befehl &amp;quot;set rollo extern ..&amp;quot; wird dieses attribut auf &amp;quot;extern&amp;quot; gestellt, sonst immer &amp;quot;modul&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|last_drive||drive-up,drive-down||die zuletzt benutzte Fahrtrichtung&lt;br /&gt;
|-&lt;br /&gt;
|pct||0-100||exakte Position des Rollo&lt;br /&gt;
|-&lt;br /&gt;
|state||open,closed,position-[0-100]||die Position gerundet auf ganze 10% Schritte, identisch mit dem Internal STATE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
===Set===&lt;br /&gt;
 set RolladenWohnzimmer pct 50&lt;br /&gt;
 set RolladenWohnzimmer geschlossen&lt;br /&gt;
 set RolladenWohnzimmer offen &lt;br /&gt;
Drei Beispiele das Rollo-Modul anzuweisen verschiedene Positionen anzufahren.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer extern stop&lt;br /&gt;
Das Rollo-Modul wird angewiesen den status auf &amp;quot;nicht fahren&amp;quot; zu setzen, die aktuelle Rollo-Position zu berechnen und als neue Position abzuspeichern. Der eigentliche Rollo-Stop-Befehl wird dabei aber nicht gesendet.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer reset closed&lt;br /&gt;
In der Oberfläche von fhem wird für das Rollo die Position &amp;quot;geschlossen&amp;quot; gespeichert, ohne Berechnungen durchzuführen oder Hardware zu steuern. Wird evtl. benötigt wenn der Ist-Status von den Soll-Werten aus fhem abweicht.&lt;br /&gt;
&lt;br /&gt;
===Zusammenspiel mit externem Taster===&lt;br /&gt;
In einem Anwendungszenario hat ein Nutzer zusätzliche Taster an seinem Rollo-Motor über die er ihn ebenfalls steuern kann. &lt;br /&gt;
Die Taster selber senden keine Events an fhem, nur der Rollo-Motor.&lt;br /&gt;
Hier ein Beispiel wie das ganze für aussehen könnte und diese Taster in das ROLLO-Modul integriert werden:&lt;br /&gt;
&lt;br /&gt;
 define rollo_manuell_auf DOIF ([meinRollo_Kanal1] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern open) DOELSEIF ([meinRollo_Kanal1] eq &amp;quot;off&amp;quot; and [?meinRolloModul] eq &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
 define rollo_manuell_ab  DOIF ([meinRollo_Kanal2] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern closed) DOELSEIF ([meinRollo_Kanal2] eq &amp;quot;off&amp;quot; and [?meinRolloModul] eq &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
&lt;br /&gt;
meinRollo_Kanal1 und meinRollo_Kanal2 sind die Hardwarekanäle die in dem Rollo-Modul zum hochfahren/runterfahren benutzt werden. &lt;br /&gt;
Das erste DOIF prüft ob das Rollo hoch fährt, ohne das das Rollo-Modul davon etwas weis. Ist dem so wird dem Rollo Modul mithilfe des set &amp;lt;extern&amp;gt; mitgeteilt das das Rollo bereits gestartet wurde. Das Modul fängt an die Zeit zu zählen und aktualisiert den Status der Oberfläche auf &amp;quot;fahre hoch&amp;quot;.&lt;br /&gt;
IM DOELSEIF wird abgefragt ob das Rollo steht, obwohl das Modul denkt das Rollo würde noch fahren. Ist dem so wird wieder mithilfe des set &amp;lt;extern&amp;gt; dem Modul mitgeteilt das das Rollo gestoppt wurde. Das Modul berechnet nun aufgrund der gefahrenen Zeit die aktuelle Position und aktualisiert den Status der Oberfläche auf die Position.&lt;br /&gt;
&lt;br /&gt;
Das gleiche wird dann im zweiten DOIF nochmal für das herunterfahren gemacht.&lt;br /&gt;
&lt;br /&gt;
Man kann nun das Rollo sowohl über die Oberfläche als auch per Taster bedienen und fhem und der reale Ist-Status sind synchron. Ach eine gleichzeitige Bedienung ist möglich, Das Rollo startet z.B. aufgrund einer Automatisierung morgens zum hochfahren und man klickt schnell auf den Taster neben dem Bett und stoppt das ganze wieder.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=95832|LinkText=Forum}} seit das Modul Bestandteil der offiziellen FHEM Auslieferung ist&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=47202|LinkText=Forum}} bevor das Modul Bestandteil von FHEM war&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29175</id>
		<title>ROLLO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29175"/>
		<updated>2019-01-20T15:32:27Z</updated>

		<summary type="html">&lt;p&gt;KernSani: /* Voraussetzungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:ROLLO}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Rollo-Steuerung zur einfachen Anzeige/Programmierung&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModFTopic=95832&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= ---- noch nicht Teil von FHEM ----&amp;gt;&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModTechName=44_ROLLO.pm&lt;br /&gt;
|ModOwner=KernSani}}&lt;br /&gt;
Das Modul [[ROLLO]] bietet eine einfache Möglichkeit, mit ein bis zwei Relais den Hoch-/Runterlauf eines Rolladen zu steuern und punktgenau anzuhalten. Außerdem wird die aktuelle Position in fhem abgebildet.&lt;br /&gt;
Über welche Hardware/Module die Ausgänge angesprochen werden ist dabei egal.&lt;br /&gt;
__TOC__&lt;br /&gt;
Das Modul unterstützt beliebige Konfigurationen welche Befehle ausgeführt werden müssen um die Hardware des Rollos zu steuern.&lt;br /&gt;
&lt;br /&gt;
* Die Rollo-Position wird in 10%-Schritten von 0% (offen) bis 100% (geschlossen) zwischengespeichert um auf der Oberfläche für jede Position ein Icon festlegen zu können. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Rolladen Eintrag.PNG|right|thumb|400px|Verschiedene Ansichten des Rollo:offen, fährt gerade herunter, position 50, fährt gerade hoch, geschlossen]]&lt;br /&gt;
Vorteil dieses Moduls:&lt;br /&gt;
&lt;br /&gt;
Ist ein Rollo mit diesem Modul definiert kann man auf der Oberfläche per Klick das Rollo hoch/runter oder auf eine bestimmte Position fahren. Der aktuelle Status des Rollo (fährt hoch/runter,offen,geschlossen,etc.) wird angezeigt.&lt;br /&gt;
Die Oberflächenicons werden per devStateIcon gesteuert, Icons und Farben können für jeden Status individuell formatiert werden, die Standard Kommandos auf der Oberfläche (hier: offen, geschlossen, schlitz, Position) können ebenfalls per Attribut angepasst werden. Das Status-Icon ist anklickbar.&lt;br /&gt;
Beim Anlegen des Moduls werden die Attribute zur Darstellung in fhem mit Standardwerten angelegt, so dass man sich einiges an Tipparbeit sparen kann, aber trotzdem die Möglichkeit hat die Darstellung individuell anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Das eigentliche ansteuern des Rollo muss mit FHEM Befehlen ausführbar sein, diese Modul ist &amp;quot;nur&amp;quot; eine Oberfläche/Bedienmodul, kein Hardwaremodul.&lt;br /&gt;
&lt;br /&gt;
Wenn ROLLO installiert wurde, bevor es Bestandteil von FHEM wurde und lange kein Update gemacht wurde, wirst du die &amp;quot;position&amp;quot; readings und das entsprechende set Kommando vermissen. &amp;quot;position&amp;quot; wurde durch &amp;quot;pct&amp;quot; ersetzt, um Kompatibilität mit anderen Modulen [https://fhem.de/commandref_DE.html#AutoShuttersControl Automatic Shutter Control - ASC] sicher zu stellen. Bitte passe deine notifies/DOIFs entsprechend an.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Dieses Modul ist in der offiziellen FHEM-Auslieferung enthalten.}}&lt;br /&gt;
&lt;br /&gt;
Rollo Modula auf Github: upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO.pm upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO_Automatik.pm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
und FHEM neu starten&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
 define &amp;lt;name&amp;gt; ROLLO&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&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;
|rl_type ||attr &amp;lt;Rollo-Device&amp;gt; rl_type [normal|HomeKit] ||||Typunterscheidung zur unterstützung verschiedener Hardware. Abhängig vom gewählten Typ wird die Richtung von der die pct gerechnet wird festgelegt:&lt;br /&gt;
&lt;br /&gt;
    normal = pct 0 ist offen, pct 100 ist geschlossen&lt;br /&gt;
    HomeKit = pct 100 ist offen, pct 0 ist geschlossen&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsDown||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsDown &amp;lt;number&amp;gt; ||||Sekunden zum hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsUp &amp;lt;number&amp;gt; ||||Sekunden zum herunterfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessTop ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessTop &amp;lt;number&amp;gt; ||||Zeit die mein Rollo Fahren muss ohne das sich die Rollo-pct ändert (bei mir fährt der Rollo noch in die Wand, ohne das man es am Fenster sieht, die pct ist also schon bei 0%)&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessBottom ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessBottom &amp;lt;number&amp;gt; ||||(siehe excessTop)&lt;br /&gt;
|-&lt;br /&gt;
|rl_switchTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_switchTime &amp;lt;number&amp;gt; ||||Zeit die zwischen 2 gegensätzlichen Laufbefehlen pausiert werden soll, also wenn der Rollo z.B. gerade runter fährt und ich den Befehl gebe hoch zu fahren, dann soll 1 sekunde gewartet werden bis der Motor wirklich zum stillstand kommt, bevor es wieder in die andere Richtung weiter geht. Dies ist die einzige Zeit die nichts mit der eigentlichen Laufzeit des Motors zu tun hat, sondern ein timer zwischen den Laufzeiten.&lt;br /&gt;
|-&lt;br /&gt;
|rl_resetTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_resetTime &amp;lt;number&amp;gt; ||||Zeit die beim Anfahren von Endpositionen (offen,geschlossen) der Motor zusätzlich an bleiben soll um sicherzustellen das die Endposition wirklich angefahren wurde. Dadurch können Differenzen in der Positionsberechnung korrigiert werden.&lt;br /&gt;
|-&lt;br /&gt;
|rl_reactionTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_reactionTime &amp;lt;number&amp;gt; ||||Zeit für den Motor zum reagieren&lt;br /&gt;
|-&lt;br /&gt;
|rl_autoStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_autoStop [0|1] ||||Es muss kein Stop-Befehl ausgeführt werden, das Rollo stoppt von selbst.&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandUp &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum hochfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandDown &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum runterfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStop &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird, sofern nicht commandStopDown bzw. commandStopUp definiert sind&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopDown &amp;lt;string&amp;gt; ||||Befehl der zum stoppen ausgeführt wird, wenn der Rollo gerade herunterfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopUp &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird,wenn der Rollo gerade hochfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_blockMode ||attr &amp;lt;Rollo-Device&amp;gt; rl_blockMode [blocked|force-open|force-closed|only-up|only-down|half-up|half-down|none] ||||wenn ich den Befehl blocked ausführe, dann wird aufgrund der blockMode-Art festgelegt wie mein Rollo reagieren soll:&lt;br /&gt;
&lt;br /&gt;
    blocked = Rollo lässt sich nicht mehr bewegen&lt;br /&gt;
    force-open = bei einem beliebigen Fahrbefehl wird Rollo hochgefahren&lt;br /&gt;
    force-closed = bei einem beliebigen Fahrbefehl wird Rollo runtergefahren&lt;br /&gt;
    only-up = Befehle zum runterfahren werden ignoriert&lt;br /&gt;
    only-down = Befehle zum hochfahren werden ignoriert&lt;br /&gt;
    half-up = es werden nur die Positionen 50-100 angefahren, bei pct &amp;lt;50 wird pct 50% angefahren,&lt;br /&gt;
    half-down = es werden nur die Positionen 0-50 angefahren, bei pct &amp;gt;50 wird pct 50 angefahren&lt;br /&gt;
    none = block-Modus ist deaktiviert&lt;br /&gt;
|-&lt;br /&gt;
|automatic-enabled ||attr &amp;lt;Rollo-Device&amp;gt; automatic-enabled [on|off] ||||Wenn auf off gestellt, haben Befehle über Modul ROLLO_Automatic keine Auswirkungen auf diesen Rollo&lt;br /&gt;
|-&lt;br /&gt;
|automatic-delay ||attr &amp;lt;Rollo-Device&amp;gt; automatic-delay &amp;lt;number&amp;gt; ||||Dieses Attribut wird nur fuer die Modulerweiterung ROLLADEN_Automatic benoetigt.&lt;br /&gt;
Hiermit kann einge Zeitverzoegerund fuer den Rolladen eingestellt werden, werden die Rolladen per Automatic heruntergefahren, so wird dieser um die angegebenen minuten spaeter heruntergefahren.&lt;br /&gt;
|-&lt;br /&gt;
|rl_forceDrive ||attr &amp;lt;Rollo-Device&amp;gt; rl_forceDrive [0|1] ||||open/closed wird ausgeführt, auch wenn das ROLLO bereits in der Zielposition ist&lt;br /&gt;
|-&lt;br /&gt;
|rl_noSetPosBlocked ||attr &amp;lt;Rollo-Device&amp;gt; rl_noSetPosBlocked [0|1] ||||Wenn deaktiviert, können Positionsn (pct) auch gesetzt werden, wenn der ROLLO geblockt ist. Nach dem unblocken wird die entsprechende Position angefahren.&lt;br /&gt;
|-&lt;br /&gt;
|||disableattr &amp;lt;Rollo-Device&amp;gt; disable [0|1] ||||Wenn deaktiviert, können keine set oder get commandos für den ROLLO ausgeführt werden.&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;
=== Set ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|open ||set &amp;lt;Rollo-Device&amp;gt; open ||Faehrt das Rollo komplett auf (pct 0)&lt;br /&gt;
|-&lt;br /&gt;
|closed ||set &amp;lt;Rollo-Device&amp;gt; closed||Faehrt das Rollo komplett zu (pct 100)&lt;br /&gt;
|-&lt;br /&gt;
|up ||set &amp;lt;Rollo-Device&amp;gt; up ||Faehrt das Rollo um 10 auf (pct +10)&lt;br /&gt;
|-&lt;br /&gt;
|down ||set &amp;lt;Rollo-Device&amp;gt; down ||Faehrt das Rollo um 10 zu (pct -10)&lt;br /&gt;
|-&lt;br /&gt;
|half || set &amp;lt;Rollo-Device&amp;gt; half ||Faehrt das Rollo zur haelfte runter bzw. hoch (pct 50)&lt;br /&gt;
|-&lt;br /&gt;
|stop ||set &amp;lt;Rollo-Device&amp;gt; stop ||Stoppt das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|drive ||set &amp;lt;Rollo-Device&amp;gt; drive up 5||Fährt das Rollo in die angegebene Richtung für die angegebene Zeit (in Sekunden)&lt;br /&gt;
|-&lt;br /&gt;
|blocked ||set &amp;lt;Rollo-Device&amp;gt; blocked ||wenn aktiviert, kann der ROLLO nur noch eingeschränkt gesteuert werden. Siehe Attribut block_mode für Details.&lt;br /&gt;
|-&lt;br /&gt;
|unblocked ||set &amp;lt;Rollo-Device&amp;gt; unblocked ||Aktiviert einen geblockten ROLLO wieder für die normale Benutzung&lt;br /&gt;
|-&lt;br /&gt;
|pct ||set &amp;lt;Rollo-Device&amp;gt; pct &amp;lt;value&amp;gt; ||Faehrt das Rollo auf eine beliebige pct zwischen 0 (offen) - 100 (geschlossen)&lt;br /&gt;
|-&lt;br /&gt;
|reset ||set &amp;lt;Rollo-Device&amp;gt; reset &amp;lt;value&amp;gt; ||Sagt dem Modul in welcher pct sich der Rollo befindet&lt;br /&gt;
|-&lt;br /&gt;
|extern ||set &amp;lt;Rollo-Device&amp;gt; extern &amp;lt;value&amp;gt; ||Der Software mitteilen dass gerade Befehl X bereits ausgeführt wurde und nun z.B,. das berechnen der aktuellen pct gestartet werden soll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|version ||get &amp;lt;Rollo-Device&amp;gt; version ||Gibt die version des Modul Rollos aus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!Wert !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|command||open,stop,closed||&lt;br /&gt;
|-&lt;br /&gt;
|desired_pct||0-100||Zielposition die angefahren werden soll (nur sinnvoll während das Rollo fährt)&lt;br /&gt;
|-&lt;br /&gt;
|drive-type||modul,extern||bei dem Befehl &amp;quot;set rollo extern ..&amp;quot; wird dieses attribut auf &amp;quot;extern&amp;quot; gestellt, sonst immer &amp;quot;modul&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|last_drive||drive-up,drive-down||die zuletzt benutzte Fahrtrichtung&lt;br /&gt;
|-&lt;br /&gt;
|pct||0-100||exakte Position des Rollo&lt;br /&gt;
|-&lt;br /&gt;
|state||open,closed,position-[0-100]||die Position gerundet auf ganze 10% Schritte, identisch mit dem Internal STATE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
===Set===&lt;br /&gt;
 set RolladenWohnzimmer pct 50&lt;br /&gt;
 set RolladenWohnzimmer geschlossen&lt;br /&gt;
 set RolladenWohnzimmer offen &lt;br /&gt;
Drei Beispiele das Rollo-Modul anzuweisen verschiedene Positionen anzufahren.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer extern stop&lt;br /&gt;
Das Rollo-Modul wird angewiesen den status auf &amp;quot;nicht fahren&amp;quot; zu setzen, die aktuelle Rollo-Position zu berechnen und als neue Position abzuspeichern. Der eigentliche Rollo-Stop-Befehl wird dabei aber nicht gesendet.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer reset closed&lt;br /&gt;
In der Oberfläche von fhem wird für das Rollo die Position &amp;quot;geschlossen&amp;quot; gespeichert, ohne Berechnungen durchzuführen oder Hardware zu steuern. Wird evtl. benötigt wenn der Ist-Status von den Soll-Werten aus fhem abweicht.&lt;br /&gt;
&lt;br /&gt;
===Zusammenspiel mit externem Taster===&lt;br /&gt;
In einem Anwendungszenario hat ein Nutzer zusätzliche Taster an seinem Rollo-Motor über die er ihn ebenfalls steuern kann. &lt;br /&gt;
Die Taster selber senden keine Events an fhem, nur der Rollo-Motor.&lt;br /&gt;
Hier ein Beispiel wie das ganze für aussehen könnte und diese Taster in das ROLLO-Modul integriert werden:&lt;br /&gt;
&lt;br /&gt;
 define rollo_manuell_auf DOIF ([meinRollo_Kanal1] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern open) DOELSEIF ([meinRollo_Kanal1] eq &amp;quot;off&amp;quot; and [?meinRolloModul] eq &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
 define rollo_manuell_ab  DOIF ([meinRollo_Kanal2] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern closed) DOELSEIF ([meinRollo_Kanal2] eq &amp;quot;off&amp;quot; and [?meinRolloModul] eq &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
&lt;br /&gt;
meinRollo_Kanal1 und meinRollo_Kanal2 sind die Hardwarekanäle die in dem Rollo-Modul zum hochfahren/runterfahren benutzt werden. &lt;br /&gt;
Das erste DOIF prüft ob das Rollo hoch fährt, ohne das das Rollo-Modul davon etwas weis. Ist dem so wird dem Rollo Modul mithilfe des set &amp;lt;extern&amp;gt; mitgeteilt das das Rollo bereits gestartet wurde. Das Modul fängt an die Zeit zu zählen und aktualisiert den Status der Oberfläche auf &amp;quot;fahre hoch&amp;quot;.&lt;br /&gt;
IM DOELSEIF wird abgefragt ob das Rollo steht, obwohl das Modul denkt das Rollo würde noch fahren. Ist dem so wird wieder mithilfe des set &amp;lt;extern&amp;gt; dem Modul mitgeteilt das das Rollo gestoppt wurde. Das Modul berechnet nun aufgrund der gefahrenen Zeit die aktuelle Position und aktualisiert den Status der Oberfläche auf die Position.&lt;br /&gt;
&lt;br /&gt;
Das gleiche wird dann im zweiten DOIF nochmal für das herunterfahren gemacht.&lt;br /&gt;
&lt;br /&gt;
Man kann nun das Rollo sowohl über die Oberfläche als auch per Taster bedienen und fhem und der reale Ist-Status sind synchron. Ach eine gleichzeitige Bedienung ist möglich, Das Rollo startet z.B. aufgrund einer Automatisierung morgens zum hochfahren und man klickt schnell auf den Taster neben dem Bett und stoppt das ganze wieder.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=95832|LinkText=Forum}} seit das Modul Bestandteil der offiziellen FHEM Auslieferung ist&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=47202|LinkText=Forum}} bevor das Modul Bestandteil von FHEM war&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29174</id>
		<title>ROLLO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29174"/>
		<updated>2019-01-20T15:31:20Z</updated>

		<summary type="html">&lt;p&gt;KernSani: /* Voraussetzungen */ Hinweis wegen &amp;quot;position&amp;quot; eingefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:ROLLO}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Rollo-Steuerung zur einfachen Anzeige/Programmierung&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModFTopic=95832&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= ---- noch nicht Teil von FHEM ----&amp;gt;&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModTechName=44_ROLLO.pm&lt;br /&gt;
|ModOwner=KernSani}}&lt;br /&gt;
Das Modul [[ROLLO]] bietet eine einfache Möglichkeit, mit ein bis zwei Relais den Hoch-/Runterlauf eines Rolladen zu steuern und punktgenau anzuhalten. Außerdem wird die aktuelle Position in fhem abgebildet.&lt;br /&gt;
Über welche Hardware/Module die Ausgänge angesprochen werden ist dabei egal.&lt;br /&gt;
__TOC__&lt;br /&gt;
Das Modul unterstützt beliebige Konfigurationen welche Befehle ausgeführt werden müssen um die Hardware des Rollos zu steuern.&lt;br /&gt;
&lt;br /&gt;
* Die Rollo-Position wird in 10%-Schritten von 0% (offen) bis 100% (geschlossen) zwischengespeichert um auf der Oberfläche für jede Position ein Icon festlegen zu können. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Rolladen Eintrag.PNG|right|thumb|400px|Verschiedene Ansichten des Rollo:offen, fährt gerade herunter, position 50, fährt gerade hoch, geschlossen]]&lt;br /&gt;
Vorteil dieses Moduls:&lt;br /&gt;
&lt;br /&gt;
Ist ein Rollo mit diesem Modul definiert kann man auf der Oberfläche per Klick das Rollo hoch/runter oder auf eine bestimmte Position fahren. Der aktuelle Status des Rollo (fährt hoch/runter,offen,geschlossen,etc.) wird angezeigt.&lt;br /&gt;
Die Oberflächenicons werden per devStateIcon gesteuert, Icons und Farben können für jeden Status individuell formatiert werden, die Standard Kommandos auf der Oberfläche (hier: offen, geschlossen, schlitz, Position) können ebenfalls per Attribut angepasst werden. Das Status-Icon ist anklickbar.&lt;br /&gt;
Beim Anlegen des Moduls werden die Attribute zur Darstellung in fhem mit Standardwerten angelegt, so dass man sich einiges an Tipparbeit sparen kann, aber trotzdem die Möglichkeit hat die Darstellung individuell anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Das eigentliche ansteuern des Rollo muss mit FHEM Befehlen ausführbar sein, diese Modul ist &amp;quot;nur&amp;quot; eine Oberfläche/Bedienmodul, kein Hardwaremodul.&lt;br /&gt;
&lt;br /&gt;
Wenn ROLLO installiert wurde, bevor es Bestandteil von FHEM wurde und lange kein Update gemacht wurde, wirst du die &amp;quot;position&amp;quot; readings und das entsprechende set Kommando vermissen. &amp;quot;position&amp;quot; wurde durch &amp;quot;pct&amp;quot; ersetzt, um Kompatibilität mit anderen Modulen (wie &amp;lt;a href=&amp;quot;https://fhem.de/commandref_DE.html#AutoShuttersControl&amp;quot;&amp;gt;Automatic shutter control - ASC&amp;lt;/a&amp;gt;) sicher zu stellen. Bitte passe deine notifies/DOIFs entsprechend an.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Dieses Modul ist in der offiziellen FHEM-Auslieferung enthalten.}}&lt;br /&gt;
&lt;br /&gt;
Rollo Modula auf Github: upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO.pm upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO_Automatik.pm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
und FHEM neu starten&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
 define &amp;lt;name&amp;gt; ROLLO&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&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;
|rl_type ||attr &amp;lt;Rollo-Device&amp;gt; rl_type [normal|HomeKit] ||||Typunterscheidung zur unterstützung verschiedener Hardware. Abhängig vom gewählten Typ wird die Richtung von der die pct gerechnet wird festgelegt:&lt;br /&gt;
&lt;br /&gt;
    normal = pct 0 ist offen, pct 100 ist geschlossen&lt;br /&gt;
    HomeKit = pct 100 ist offen, pct 0 ist geschlossen&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsDown||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsDown &amp;lt;number&amp;gt; ||||Sekunden zum hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsUp &amp;lt;number&amp;gt; ||||Sekunden zum herunterfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessTop ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessTop &amp;lt;number&amp;gt; ||||Zeit die mein Rollo Fahren muss ohne das sich die Rollo-pct ändert (bei mir fährt der Rollo noch in die Wand, ohne das man es am Fenster sieht, die pct ist also schon bei 0%)&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessBottom ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessBottom &amp;lt;number&amp;gt; ||||(siehe excessTop)&lt;br /&gt;
|-&lt;br /&gt;
|rl_switchTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_switchTime &amp;lt;number&amp;gt; ||||Zeit die zwischen 2 gegensätzlichen Laufbefehlen pausiert werden soll, also wenn der Rollo z.B. gerade runter fährt und ich den Befehl gebe hoch zu fahren, dann soll 1 sekunde gewartet werden bis der Motor wirklich zum stillstand kommt, bevor es wieder in die andere Richtung weiter geht. Dies ist die einzige Zeit die nichts mit der eigentlichen Laufzeit des Motors zu tun hat, sondern ein timer zwischen den Laufzeiten.&lt;br /&gt;
|-&lt;br /&gt;
|rl_resetTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_resetTime &amp;lt;number&amp;gt; ||||Zeit die beim Anfahren von Endpositionen (offen,geschlossen) der Motor zusätzlich an bleiben soll um sicherzustellen das die Endposition wirklich angefahren wurde. Dadurch können Differenzen in der Positionsberechnung korrigiert werden.&lt;br /&gt;
|-&lt;br /&gt;
|rl_reactionTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_reactionTime &amp;lt;number&amp;gt; ||||Zeit für den Motor zum reagieren&lt;br /&gt;
|-&lt;br /&gt;
|rl_autoStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_autoStop [0|1] ||||Es muss kein Stop-Befehl ausgeführt werden, das Rollo stoppt von selbst.&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandUp &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum hochfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandDown &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum runterfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStop &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird, sofern nicht commandStopDown bzw. commandStopUp definiert sind&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopDown &amp;lt;string&amp;gt; ||||Befehl der zum stoppen ausgeführt wird, wenn der Rollo gerade herunterfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopUp &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird,wenn der Rollo gerade hochfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_blockMode ||attr &amp;lt;Rollo-Device&amp;gt; rl_blockMode [blocked|force-open|force-closed|only-up|only-down|half-up|half-down|none] ||||wenn ich den Befehl blocked ausführe, dann wird aufgrund der blockMode-Art festgelegt wie mein Rollo reagieren soll:&lt;br /&gt;
&lt;br /&gt;
    blocked = Rollo lässt sich nicht mehr bewegen&lt;br /&gt;
    force-open = bei einem beliebigen Fahrbefehl wird Rollo hochgefahren&lt;br /&gt;
    force-closed = bei einem beliebigen Fahrbefehl wird Rollo runtergefahren&lt;br /&gt;
    only-up = Befehle zum runterfahren werden ignoriert&lt;br /&gt;
    only-down = Befehle zum hochfahren werden ignoriert&lt;br /&gt;
    half-up = es werden nur die Positionen 50-100 angefahren, bei pct &amp;lt;50 wird pct 50% angefahren,&lt;br /&gt;
    half-down = es werden nur die Positionen 0-50 angefahren, bei pct &amp;gt;50 wird pct 50 angefahren&lt;br /&gt;
    none = block-Modus ist deaktiviert&lt;br /&gt;
|-&lt;br /&gt;
|automatic-enabled ||attr &amp;lt;Rollo-Device&amp;gt; automatic-enabled [on|off] ||||Wenn auf off gestellt, haben Befehle über Modul ROLLO_Automatic keine Auswirkungen auf diesen Rollo&lt;br /&gt;
|-&lt;br /&gt;
|automatic-delay ||attr &amp;lt;Rollo-Device&amp;gt; automatic-delay &amp;lt;number&amp;gt; ||||Dieses Attribut wird nur fuer die Modulerweiterung ROLLADEN_Automatic benoetigt.&lt;br /&gt;
Hiermit kann einge Zeitverzoegerund fuer den Rolladen eingestellt werden, werden die Rolladen per Automatic heruntergefahren, so wird dieser um die angegebenen minuten spaeter heruntergefahren.&lt;br /&gt;
|-&lt;br /&gt;
|rl_forceDrive ||attr &amp;lt;Rollo-Device&amp;gt; rl_forceDrive [0|1] ||||open/closed wird ausgeführt, auch wenn das ROLLO bereits in der Zielposition ist&lt;br /&gt;
|-&lt;br /&gt;
|rl_noSetPosBlocked ||attr &amp;lt;Rollo-Device&amp;gt; rl_noSetPosBlocked [0|1] ||||Wenn deaktiviert, können Positionsn (pct) auch gesetzt werden, wenn der ROLLO geblockt ist. Nach dem unblocken wird die entsprechende Position angefahren.&lt;br /&gt;
|-&lt;br /&gt;
|||disableattr &amp;lt;Rollo-Device&amp;gt; disable [0|1] ||||Wenn deaktiviert, können keine set oder get commandos für den ROLLO ausgeführt werden.&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;
=== Set ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|open ||set &amp;lt;Rollo-Device&amp;gt; open ||Faehrt das Rollo komplett auf (pct 0)&lt;br /&gt;
|-&lt;br /&gt;
|closed ||set &amp;lt;Rollo-Device&amp;gt; closed||Faehrt das Rollo komplett zu (pct 100)&lt;br /&gt;
|-&lt;br /&gt;
|up ||set &amp;lt;Rollo-Device&amp;gt; up ||Faehrt das Rollo um 10 auf (pct +10)&lt;br /&gt;
|-&lt;br /&gt;
|down ||set &amp;lt;Rollo-Device&amp;gt; down ||Faehrt das Rollo um 10 zu (pct -10)&lt;br /&gt;
|-&lt;br /&gt;
|half || set &amp;lt;Rollo-Device&amp;gt; half ||Faehrt das Rollo zur haelfte runter bzw. hoch (pct 50)&lt;br /&gt;
|-&lt;br /&gt;
|stop ||set &amp;lt;Rollo-Device&amp;gt; stop ||Stoppt das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|drive ||set &amp;lt;Rollo-Device&amp;gt; drive up 5||Fährt das Rollo in die angegebene Richtung für die angegebene Zeit (in Sekunden)&lt;br /&gt;
|-&lt;br /&gt;
|blocked ||set &amp;lt;Rollo-Device&amp;gt; blocked ||wenn aktiviert, kann der ROLLO nur noch eingeschränkt gesteuert werden. Siehe Attribut block_mode für Details.&lt;br /&gt;
|-&lt;br /&gt;
|unblocked ||set &amp;lt;Rollo-Device&amp;gt; unblocked ||Aktiviert einen geblockten ROLLO wieder für die normale Benutzung&lt;br /&gt;
|-&lt;br /&gt;
|pct ||set &amp;lt;Rollo-Device&amp;gt; pct &amp;lt;value&amp;gt; ||Faehrt das Rollo auf eine beliebige pct zwischen 0 (offen) - 100 (geschlossen)&lt;br /&gt;
|-&lt;br /&gt;
|reset ||set &amp;lt;Rollo-Device&amp;gt; reset &amp;lt;value&amp;gt; ||Sagt dem Modul in welcher pct sich der Rollo befindet&lt;br /&gt;
|-&lt;br /&gt;
|extern ||set &amp;lt;Rollo-Device&amp;gt; extern &amp;lt;value&amp;gt; ||Der Software mitteilen dass gerade Befehl X bereits ausgeführt wurde und nun z.B,. das berechnen der aktuellen pct gestartet werden soll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|version ||get &amp;lt;Rollo-Device&amp;gt; version ||Gibt die version des Modul Rollos aus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!Wert !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|command||open,stop,closed||&lt;br /&gt;
|-&lt;br /&gt;
|desired_pct||0-100||Zielposition die angefahren werden soll (nur sinnvoll während das Rollo fährt)&lt;br /&gt;
|-&lt;br /&gt;
|drive-type||modul,extern||bei dem Befehl &amp;quot;set rollo extern ..&amp;quot; wird dieses attribut auf &amp;quot;extern&amp;quot; gestellt, sonst immer &amp;quot;modul&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|last_drive||drive-up,drive-down||die zuletzt benutzte Fahrtrichtung&lt;br /&gt;
|-&lt;br /&gt;
|pct||0-100||exakte Position des Rollo&lt;br /&gt;
|-&lt;br /&gt;
|state||open,closed,position-[0-100]||die Position gerundet auf ganze 10% Schritte, identisch mit dem Internal STATE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
===Set===&lt;br /&gt;
 set RolladenWohnzimmer pct 50&lt;br /&gt;
 set RolladenWohnzimmer geschlossen&lt;br /&gt;
 set RolladenWohnzimmer offen &lt;br /&gt;
Drei Beispiele das Rollo-Modul anzuweisen verschiedene Positionen anzufahren.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer extern stop&lt;br /&gt;
Das Rollo-Modul wird angewiesen den status auf &amp;quot;nicht fahren&amp;quot; zu setzen, die aktuelle Rollo-Position zu berechnen und als neue Position abzuspeichern. Der eigentliche Rollo-Stop-Befehl wird dabei aber nicht gesendet.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer reset closed&lt;br /&gt;
In der Oberfläche von fhem wird für das Rollo die Position &amp;quot;geschlossen&amp;quot; gespeichert, ohne Berechnungen durchzuführen oder Hardware zu steuern. Wird evtl. benötigt wenn der Ist-Status von den Soll-Werten aus fhem abweicht.&lt;br /&gt;
&lt;br /&gt;
===Zusammenspiel mit externem Taster===&lt;br /&gt;
In einem Anwendungszenario hat ein Nutzer zusätzliche Taster an seinem Rollo-Motor über die er ihn ebenfalls steuern kann. &lt;br /&gt;
Die Taster selber senden keine Events an fhem, nur der Rollo-Motor.&lt;br /&gt;
Hier ein Beispiel wie das ganze für aussehen könnte und diese Taster in das ROLLO-Modul integriert werden:&lt;br /&gt;
&lt;br /&gt;
 define rollo_manuell_auf DOIF ([meinRollo_Kanal1] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern open) DOELSEIF ([meinRollo_Kanal1] eq &amp;quot;off&amp;quot; and [?meinRolloModul] eq &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
 define rollo_manuell_ab  DOIF ([meinRollo_Kanal2] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern closed) DOELSEIF ([meinRollo_Kanal2] eq &amp;quot;off&amp;quot; and [?meinRolloModul] eq &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
&lt;br /&gt;
meinRollo_Kanal1 und meinRollo_Kanal2 sind die Hardwarekanäle die in dem Rollo-Modul zum hochfahren/runterfahren benutzt werden. &lt;br /&gt;
Das erste DOIF prüft ob das Rollo hoch fährt, ohne das das Rollo-Modul davon etwas weis. Ist dem so wird dem Rollo Modul mithilfe des set &amp;lt;extern&amp;gt; mitgeteilt das das Rollo bereits gestartet wurde. Das Modul fängt an die Zeit zu zählen und aktualisiert den Status der Oberfläche auf &amp;quot;fahre hoch&amp;quot;.&lt;br /&gt;
IM DOELSEIF wird abgefragt ob das Rollo steht, obwohl das Modul denkt das Rollo würde noch fahren. Ist dem so wird wieder mithilfe des set &amp;lt;extern&amp;gt; dem Modul mitgeteilt das das Rollo gestoppt wurde. Das Modul berechnet nun aufgrund der gefahrenen Zeit die aktuelle Position und aktualisiert den Status der Oberfläche auf die Position.&lt;br /&gt;
&lt;br /&gt;
Das gleiche wird dann im zweiten DOIF nochmal für das herunterfahren gemacht.&lt;br /&gt;
&lt;br /&gt;
Man kann nun das Rollo sowohl über die Oberfläche als auch per Taster bedienen und fhem und der reale Ist-Status sind synchron. Ach eine gleichzeitige Bedienung ist möglich, Das Rollo startet z.B. aufgrund einer Automatisierung morgens zum hochfahren und man klickt schnell auf den Taster neben dem Bett und stoppt das ganze wieder.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=95832|LinkText=Forum}} seit das Modul Bestandteil der offiziellen FHEM Auslieferung ist&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=47202|LinkText=Forum}} bevor das Modul Bestandteil von FHEM war&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29173</id>
		<title>ROLLO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29173"/>
		<updated>2019-01-20T15:28:37Z</updated>

		<summary type="html">&lt;p&gt;KernSani: /* Zusammenspiel mit externem Taster */ noch zwei Fragezeichen nachgepflegt ;-)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:ROLLO}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Rollo-Steuerung zur einfachen Anzeige/Programmierung&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModFTopic=95832&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= ---- noch nicht Teil von FHEM ----&amp;gt;&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModTechName=44_ROLLO.pm&lt;br /&gt;
|ModOwner=KernSani}}&lt;br /&gt;
Das Modul [[ROLLO]] bietet eine einfache Möglichkeit, mit ein bis zwei Relais den Hoch-/Runterlauf eines Rolladen zu steuern und punktgenau anzuhalten. Außerdem wird die aktuelle Position in fhem abgebildet.&lt;br /&gt;
Über welche Hardware/Module die Ausgänge angesprochen werden ist dabei egal.&lt;br /&gt;
__TOC__&lt;br /&gt;
Das Modul unterstützt beliebige Konfigurationen welche Befehle ausgeführt werden müssen um die Hardware des Rollos zu steuern.&lt;br /&gt;
&lt;br /&gt;
* Die Rollo-Position wird in 10%-Schritten von 0% (offen) bis 100% (geschlossen) zwischengespeichert um auf der Oberfläche für jede Position ein Icon festlegen zu können. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Rolladen Eintrag.PNG|right|thumb|400px|Verschiedene Ansichten des Rollo:offen, fährt gerade herunter, position 50, fährt gerade hoch, geschlossen]]&lt;br /&gt;
Vorteil dieses Moduls:&lt;br /&gt;
&lt;br /&gt;
Ist ein Rollo mit diesem Modul definiert kann man auf der Oberfläche per Klick das Rollo hoch/runter oder auf eine bestimmte Position fahren. Der aktuelle Status des Rollo (fährt hoch/runter,offen,geschlossen,etc.) wird angezeigt.&lt;br /&gt;
Die Oberflächenicons werden per devStateIcon gesteuert, Icons und Farben können für jeden Status individuell formatiert werden, die Standard Kommandos auf der Oberfläche (hier: offen, geschlossen, schlitz, Position) können ebenfalls per Attribut angepasst werden. Das Status-Icon ist anklickbar.&lt;br /&gt;
Beim Anlegen des Moduls werden die Attribute zur Darstellung in fhem mit Standardwerten angelegt, so dass man sich einiges an Tipparbeit sparen kann, aber trotzdem die Möglichkeit hat die Darstellung individuell anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Das eigentliche ansteuern des Rollo muss mit FHEM Befehlen ausführbar sein, diese Modul ist &amp;quot;nur&amp;quot; eine Oberfläche/Bedienmodul, kein Hardwaremodul.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Dieses Modul ist in der offiziellen FHEM-Auslieferung enthalten.}}&lt;br /&gt;
&lt;br /&gt;
Rollo Modula auf Github: upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO.pm upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO_Automatik.pm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
und FHEM neu starten&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
 define &amp;lt;name&amp;gt; ROLLO&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&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;
|rl_type ||attr &amp;lt;Rollo-Device&amp;gt; rl_type [normal|HomeKit] ||||Typunterscheidung zur unterstützung verschiedener Hardware. Abhängig vom gewählten Typ wird die Richtung von der die pct gerechnet wird festgelegt:&lt;br /&gt;
&lt;br /&gt;
    normal = pct 0 ist offen, pct 100 ist geschlossen&lt;br /&gt;
    HomeKit = pct 100 ist offen, pct 0 ist geschlossen&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsDown||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsDown &amp;lt;number&amp;gt; ||||Sekunden zum hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsUp &amp;lt;number&amp;gt; ||||Sekunden zum herunterfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessTop ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessTop &amp;lt;number&amp;gt; ||||Zeit die mein Rollo Fahren muss ohne das sich die Rollo-pct ändert (bei mir fährt der Rollo noch in die Wand, ohne das man es am Fenster sieht, die pct ist also schon bei 0%)&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessBottom ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessBottom &amp;lt;number&amp;gt; ||||(siehe excessTop)&lt;br /&gt;
|-&lt;br /&gt;
|rl_switchTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_switchTime &amp;lt;number&amp;gt; ||||Zeit die zwischen 2 gegensätzlichen Laufbefehlen pausiert werden soll, also wenn der Rollo z.B. gerade runter fährt und ich den Befehl gebe hoch zu fahren, dann soll 1 sekunde gewartet werden bis der Motor wirklich zum stillstand kommt, bevor es wieder in die andere Richtung weiter geht. Dies ist die einzige Zeit die nichts mit der eigentlichen Laufzeit des Motors zu tun hat, sondern ein timer zwischen den Laufzeiten.&lt;br /&gt;
|-&lt;br /&gt;
|rl_resetTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_resetTime &amp;lt;number&amp;gt; ||||Zeit die beim Anfahren von Endpositionen (offen,geschlossen) der Motor zusätzlich an bleiben soll um sicherzustellen das die Endposition wirklich angefahren wurde. Dadurch können Differenzen in der Positionsberechnung korrigiert werden.&lt;br /&gt;
|-&lt;br /&gt;
|rl_reactionTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_reactionTime &amp;lt;number&amp;gt; ||||Zeit für den Motor zum reagieren&lt;br /&gt;
|-&lt;br /&gt;
|rl_autoStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_autoStop [0|1] ||||Es muss kein Stop-Befehl ausgeführt werden, das Rollo stoppt von selbst.&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandUp &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum hochfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandDown &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum runterfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStop &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird, sofern nicht commandStopDown bzw. commandStopUp definiert sind&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopDown &amp;lt;string&amp;gt; ||||Befehl der zum stoppen ausgeführt wird, wenn der Rollo gerade herunterfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopUp &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird,wenn der Rollo gerade hochfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_blockMode ||attr &amp;lt;Rollo-Device&amp;gt; rl_blockMode [blocked|force-open|force-closed|only-up|only-down|half-up|half-down|none] ||||wenn ich den Befehl blocked ausführe, dann wird aufgrund der blockMode-Art festgelegt wie mein Rollo reagieren soll:&lt;br /&gt;
&lt;br /&gt;
    blocked = Rollo lässt sich nicht mehr bewegen&lt;br /&gt;
    force-open = bei einem beliebigen Fahrbefehl wird Rollo hochgefahren&lt;br /&gt;
    force-closed = bei einem beliebigen Fahrbefehl wird Rollo runtergefahren&lt;br /&gt;
    only-up = Befehle zum runterfahren werden ignoriert&lt;br /&gt;
    only-down = Befehle zum hochfahren werden ignoriert&lt;br /&gt;
    half-up = es werden nur die Positionen 50-100 angefahren, bei pct &amp;lt;50 wird pct 50% angefahren,&lt;br /&gt;
    half-down = es werden nur die Positionen 0-50 angefahren, bei pct &amp;gt;50 wird pct 50 angefahren&lt;br /&gt;
    none = block-Modus ist deaktiviert&lt;br /&gt;
|-&lt;br /&gt;
|automatic-enabled ||attr &amp;lt;Rollo-Device&amp;gt; automatic-enabled [on|off] ||||Wenn auf off gestellt, haben Befehle über Modul ROLLO_Automatic keine Auswirkungen auf diesen Rollo&lt;br /&gt;
|-&lt;br /&gt;
|automatic-delay ||attr &amp;lt;Rollo-Device&amp;gt; automatic-delay &amp;lt;number&amp;gt; ||||Dieses Attribut wird nur fuer die Modulerweiterung ROLLADEN_Automatic benoetigt.&lt;br /&gt;
Hiermit kann einge Zeitverzoegerund fuer den Rolladen eingestellt werden, werden die Rolladen per Automatic heruntergefahren, so wird dieser um die angegebenen minuten spaeter heruntergefahren.&lt;br /&gt;
|-&lt;br /&gt;
|rl_forceDrive ||attr &amp;lt;Rollo-Device&amp;gt; rl_forceDrive [0|1] ||||open/closed wird ausgeführt, auch wenn das ROLLO bereits in der Zielposition ist&lt;br /&gt;
|-&lt;br /&gt;
|rl_noSetPosBlocked ||attr &amp;lt;Rollo-Device&amp;gt; rl_noSetPosBlocked [0|1] ||||Wenn deaktiviert, können Positionsn (pct) auch gesetzt werden, wenn der ROLLO geblockt ist. Nach dem unblocken wird die entsprechende Position angefahren.&lt;br /&gt;
|-&lt;br /&gt;
|||disableattr &amp;lt;Rollo-Device&amp;gt; disable [0|1] ||||Wenn deaktiviert, können keine set oder get commandos für den ROLLO ausgeführt werden.&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;
=== Set ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|open ||set &amp;lt;Rollo-Device&amp;gt; open ||Faehrt das Rollo komplett auf (pct 0)&lt;br /&gt;
|-&lt;br /&gt;
|closed ||set &amp;lt;Rollo-Device&amp;gt; closed||Faehrt das Rollo komplett zu (pct 100)&lt;br /&gt;
|-&lt;br /&gt;
|up ||set &amp;lt;Rollo-Device&amp;gt; up ||Faehrt das Rollo um 10 auf (pct +10)&lt;br /&gt;
|-&lt;br /&gt;
|down ||set &amp;lt;Rollo-Device&amp;gt; down ||Faehrt das Rollo um 10 zu (pct -10)&lt;br /&gt;
|-&lt;br /&gt;
|half || set &amp;lt;Rollo-Device&amp;gt; half ||Faehrt das Rollo zur haelfte runter bzw. hoch (pct 50)&lt;br /&gt;
|-&lt;br /&gt;
|stop ||set &amp;lt;Rollo-Device&amp;gt; stop ||Stoppt das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|drive ||set &amp;lt;Rollo-Device&amp;gt; drive up 5||Fährt das Rollo in die angegebene Richtung für die angegebene Zeit (in Sekunden)&lt;br /&gt;
|-&lt;br /&gt;
|blocked ||set &amp;lt;Rollo-Device&amp;gt; blocked ||wenn aktiviert, kann der ROLLO nur noch eingeschränkt gesteuert werden. Siehe Attribut block_mode für Details.&lt;br /&gt;
|-&lt;br /&gt;
|unblocked ||set &amp;lt;Rollo-Device&amp;gt; unblocked ||Aktiviert einen geblockten ROLLO wieder für die normale Benutzung&lt;br /&gt;
|-&lt;br /&gt;
|pct ||set &amp;lt;Rollo-Device&amp;gt; pct &amp;lt;value&amp;gt; ||Faehrt das Rollo auf eine beliebige pct zwischen 0 (offen) - 100 (geschlossen)&lt;br /&gt;
|-&lt;br /&gt;
|reset ||set &amp;lt;Rollo-Device&amp;gt; reset &amp;lt;value&amp;gt; ||Sagt dem Modul in welcher pct sich der Rollo befindet&lt;br /&gt;
|-&lt;br /&gt;
|extern ||set &amp;lt;Rollo-Device&amp;gt; extern &amp;lt;value&amp;gt; ||Der Software mitteilen dass gerade Befehl X bereits ausgeführt wurde und nun z.B,. das berechnen der aktuellen pct gestartet werden soll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|version ||get &amp;lt;Rollo-Device&amp;gt; version ||Gibt die version des Modul Rollos aus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!Wert !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|command||open,stop,closed||&lt;br /&gt;
|-&lt;br /&gt;
|desired_pct||0-100||Zielposition die angefahren werden soll (nur sinnvoll während das Rollo fährt)&lt;br /&gt;
|-&lt;br /&gt;
|drive-type||modul,extern||bei dem Befehl &amp;quot;set rollo extern ..&amp;quot; wird dieses attribut auf &amp;quot;extern&amp;quot; gestellt, sonst immer &amp;quot;modul&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|last_drive||drive-up,drive-down||die zuletzt benutzte Fahrtrichtung&lt;br /&gt;
|-&lt;br /&gt;
|pct||0-100||exakte Position des Rollo&lt;br /&gt;
|-&lt;br /&gt;
|state||open,closed,position-[0-100]||die Position gerundet auf ganze 10% Schritte, identisch mit dem Internal STATE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
===Set===&lt;br /&gt;
 set RolladenWohnzimmer pct 50&lt;br /&gt;
 set RolladenWohnzimmer geschlossen&lt;br /&gt;
 set RolladenWohnzimmer offen &lt;br /&gt;
Drei Beispiele das Rollo-Modul anzuweisen verschiedene Positionen anzufahren.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer extern stop&lt;br /&gt;
Das Rollo-Modul wird angewiesen den status auf &amp;quot;nicht fahren&amp;quot; zu setzen, die aktuelle Rollo-Position zu berechnen und als neue Position abzuspeichern. Der eigentliche Rollo-Stop-Befehl wird dabei aber nicht gesendet.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer reset closed&lt;br /&gt;
In der Oberfläche von fhem wird für das Rollo die Position &amp;quot;geschlossen&amp;quot; gespeichert, ohne Berechnungen durchzuführen oder Hardware zu steuern. Wird evtl. benötigt wenn der Ist-Status von den Soll-Werten aus fhem abweicht.&lt;br /&gt;
&lt;br /&gt;
===Zusammenspiel mit externem Taster===&lt;br /&gt;
In einem Anwendungszenario hat ein Nutzer zusätzliche Taster an seinem Rollo-Motor über die er ihn ebenfalls steuern kann. &lt;br /&gt;
Die Taster selber senden keine Events an fhem, nur der Rollo-Motor.&lt;br /&gt;
Hier ein Beispiel wie das ganze für aussehen könnte und diese Taster in das ROLLO-Modul integriert werden:&lt;br /&gt;
&lt;br /&gt;
 define rollo_manuell_auf DOIF ([meinRollo_Kanal1] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern open) DOELSEIF ([meinRollo_Kanal1] eq &amp;quot;off&amp;quot; and [?meinRolloModul] eq &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
 define rollo_manuell_ab  DOIF ([meinRollo_Kanal2] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern closed) DOELSEIF ([meinRollo_Kanal2] eq &amp;quot;off&amp;quot; and [?meinRolloModul] eq &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
&lt;br /&gt;
meinRollo_Kanal1 und meinRollo_Kanal2 sind die Hardwarekanäle die in dem Rollo-Modul zum hochfahren/runterfahren benutzt werden. &lt;br /&gt;
Das erste DOIF prüft ob das Rollo hoch fährt, ohne das das Rollo-Modul davon etwas weis. Ist dem so wird dem Rollo Modul mithilfe des set &amp;lt;extern&amp;gt; mitgeteilt das das Rollo bereits gestartet wurde. Das Modul fängt an die Zeit zu zählen und aktualisiert den Status der Oberfläche auf &amp;quot;fahre hoch&amp;quot;.&lt;br /&gt;
IM DOELSEIF wird abgefragt ob das Rollo steht, obwohl das Modul denkt das Rollo würde noch fahren. Ist dem so wird wieder mithilfe des set &amp;lt;extern&amp;gt; dem Modul mitgeteilt das das Rollo gestoppt wurde. Das Modul berechnet nun aufgrund der gefahrenen Zeit die aktuelle Position und aktualisiert den Status der Oberfläche auf die Position.&lt;br /&gt;
&lt;br /&gt;
Das gleiche wird dann im zweiten DOIF nochmal für das herunterfahren gemacht.&lt;br /&gt;
&lt;br /&gt;
Man kann nun das Rollo sowohl über die Oberfläche als auch per Taster bedienen und fhem und der reale Ist-Status sind synchron. Ach eine gleichzeitige Bedienung ist möglich, Das Rollo startet z.B. aufgrund einer Automatisierung morgens zum hochfahren und man klickt schnell auf den Taster neben dem Bett und stoppt das ganze wieder.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=95832|LinkText=Forum}} seit das Modul Bestandteil der offiziellen FHEM Auslieferung ist&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=47202|LinkText=Forum}} bevor das Modul Bestandteil von FHEM war&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29172</id>
		<title>ROLLO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29172"/>
		<updated>2019-01-20T10:58:36Z</updated>

		<summary type="html">&lt;p&gt;KernSani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:ROLLO}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Rollo-Steuerung zur einfachen Anzeige/Programmierung&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModFTopic=95832&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= ---- noch nicht Teil von FHEM ----&amp;gt;&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModTechName=44_ROLLO.pm&lt;br /&gt;
|ModOwner=KernSani}}&lt;br /&gt;
Das Modul [[ROLLO]] bietet eine einfache Möglichkeit, mit ein bis zwei Relais den Hoch-/Runterlauf eines Rolladen zu steuern und punktgenau anzuhalten. Außerdem wird die aktuelle Position in fhem abgebildet.&lt;br /&gt;
Über welche Hardware/Module die Ausgänge angesprochen werden ist dabei egal.&lt;br /&gt;
__TOC__&lt;br /&gt;
Das Modul unterstützt beliebige Konfigurationen welche Befehle ausgeführt werden müssen um die Hardware des Rollos zu steuern.&lt;br /&gt;
&lt;br /&gt;
* Die Rollo-Position wird in 10%-Schritten von 0% (offen) bis 100% (geschlossen) zwischengespeichert um auf der Oberfläche für jede Position ein Icon festlegen zu können. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Rolladen Eintrag.PNG|right|thumb|400px|Verschiedene Ansichten des Rollo:offen, fährt gerade herunter, position 50, fährt gerade hoch, geschlossen]]&lt;br /&gt;
Vorteil dieses Moduls:&lt;br /&gt;
&lt;br /&gt;
Ist ein Rollo mit diesem Modul definiert kann man auf der Oberfläche per Klick das Rollo hoch/runter oder auf eine bestimmte Position fahren. Der aktuelle Status des Rollo (fährt hoch/runter,offen,geschlossen,etc.) wird angezeigt.&lt;br /&gt;
Die Oberflächenicons werden per devStateIcon gesteuert, Icons und Farben können für jeden Status individuell formatiert werden, die Standard Kommandos auf der Oberfläche (hier: offen, geschlossen, schlitz, Position) können ebenfalls per Attribut angepasst werden. Das Status-Icon ist anklickbar.&lt;br /&gt;
Beim Anlegen des Moduls werden die Attribute zur Darstellung in fhem mit Standardwerten angelegt, so dass man sich einiges an Tipparbeit sparen kann, aber trotzdem die Möglichkeit hat die Darstellung individuell anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Das eigentliche ansteuern des Rollo muss mit FHEM Befehlen ausführbar sein, diese Modul ist &amp;quot;nur&amp;quot; eine Oberfläche/Bedienmodul, kein Hardwaremodul.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Dieses Modul ist in der offiziellen FHEM-Auslieferung enthalten.}}&lt;br /&gt;
&lt;br /&gt;
Rollo Modula auf Github: upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO.pm upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO_Automatik.pm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
und FHEM neu starten&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
 define &amp;lt;name&amp;gt; ROLLO&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&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;
|rl_type ||attr &amp;lt;Rollo-Device&amp;gt; rl_type [normal|HomeKit] ||||Typunterscheidung zur unterstützung verschiedener Hardware. Abhängig vom gewählten Typ wird die Richtung von der die pct gerechnet wird festgelegt:&lt;br /&gt;
&lt;br /&gt;
    normal = pct 0 ist offen, pct 100 ist geschlossen&lt;br /&gt;
    HomeKit = pct 100 ist offen, pct 0 ist geschlossen&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsDown||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsDown &amp;lt;number&amp;gt; ||||Sekunden zum hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsUp &amp;lt;number&amp;gt; ||||Sekunden zum herunterfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessTop ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessTop &amp;lt;number&amp;gt; ||||Zeit die mein Rollo Fahren muss ohne das sich die Rollo-pct ändert (bei mir fährt der Rollo noch in die Wand, ohne das man es am Fenster sieht, die pct ist also schon bei 0%)&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessBottom ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessBottom &amp;lt;number&amp;gt; ||||(siehe excessTop)&lt;br /&gt;
|-&lt;br /&gt;
|rl_switchTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_switchTime &amp;lt;number&amp;gt; ||||Zeit die zwischen 2 gegensätzlichen Laufbefehlen pausiert werden soll, also wenn der Rollo z.B. gerade runter fährt und ich den Befehl gebe hoch zu fahren, dann soll 1 sekunde gewartet werden bis der Motor wirklich zum stillstand kommt, bevor es wieder in die andere Richtung weiter geht. Dies ist die einzige Zeit die nichts mit der eigentlichen Laufzeit des Motors zu tun hat, sondern ein timer zwischen den Laufzeiten.&lt;br /&gt;
|-&lt;br /&gt;
|rl_resetTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_resetTime &amp;lt;number&amp;gt; ||||Zeit die beim Anfahren von Endpositionen (offen,geschlossen) der Motor zusätzlich an bleiben soll um sicherzustellen das die Endposition wirklich angefahren wurde. Dadurch können Differenzen in der Positionsberechnung korrigiert werden.&lt;br /&gt;
|-&lt;br /&gt;
|rl_reactionTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_reactionTime &amp;lt;number&amp;gt; ||||Zeit für den Motor zum reagieren&lt;br /&gt;
|-&lt;br /&gt;
|rl_autoStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_autoStop [0|1] ||||Es muss kein Stop-Befehl ausgeführt werden, das Rollo stoppt von selbst.&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandUp &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum hochfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandDown &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum runterfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStop &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird, sofern nicht commandStopDown bzw. commandStopUp definiert sind&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopDown &amp;lt;string&amp;gt; ||||Befehl der zum stoppen ausgeführt wird, wenn der Rollo gerade herunterfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopUp &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird,wenn der Rollo gerade hochfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_blockMode ||attr &amp;lt;Rollo-Device&amp;gt; rl_blockMode [blocked|force-open|force-closed|only-up|only-down|half-up|half-down|none] ||||wenn ich den Befehl blocked ausführe, dann wird aufgrund der blockMode-Art festgelegt wie mein Rollo reagieren soll:&lt;br /&gt;
&lt;br /&gt;
    blocked = Rollo lässt sich nicht mehr bewegen&lt;br /&gt;
    force-open = bei einem beliebigen Fahrbefehl wird Rollo hochgefahren&lt;br /&gt;
    force-closed = bei einem beliebigen Fahrbefehl wird Rollo runtergefahren&lt;br /&gt;
    only-up = Befehle zum runterfahren werden ignoriert&lt;br /&gt;
    only-down = Befehle zum hochfahren werden ignoriert&lt;br /&gt;
    half-up = es werden nur die Positionen 50-100 angefahren, bei pct &amp;lt;50 wird pct 50% angefahren,&lt;br /&gt;
    half-down = es werden nur die Positionen 0-50 angefahren, bei pct &amp;gt;50 wird pct 50 angefahren&lt;br /&gt;
    none = block-Modus ist deaktiviert&lt;br /&gt;
|-&lt;br /&gt;
|automatic-enabled ||attr &amp;lt;Rollo-Device&amp;gt; automatic-enabled [on|off] ||||Wenn auf off gestellt, haben Befehle über Modul ROLLO_Automatic keine Auswirkungen auf diesen Rollo&lt;br /&gt;
|-&lt;br /&gt;
|automatic-delay ||attr &amp;lt;Rollo-Device&amp;gt; automatic-delay &amp;lt;number&amp;gt; ||||Dieses Attribut wird nur fuer die Modulerweiterung ROLLADEN_Automatic benoetigt.&lt;br /&gt;
Hiermit kann einge Zeitverzoegerund fuer den Rolladen eingestellt werden, werden die Rolladen per Automatic heruntergefahren, so wird dieser um die angegebenen minuten spaeter heruntergefahren.&lt;br /&gt;
|-&lt;br /&gt;
|rl_forceDrive ||attr &amp;lt;Rollo-Device&amp;gt; rl_forceDrive [0|1] ||||open/closed wird ausgeführt, auch wenn das ROLLO bereits in der Zielposition ist&lt;br /&gt;
|-&lt;br /&gt;
|rl_noSetPosBlocked ||attr &amp;lt;Rollo-Device&amp;gt; rl_noSetPosBlocked [0|1] ||||Wenn deaktiviert, können Positionsn (pct) auch gesetzt werden, wenn der ROLLO geblockt ist. Nach dem unblocken wird die entsprechende Position angefahren.&lt;br /&gt;
|-&lt;br /&gt;
|||disableattr &amp;lt;Rollo-Device&amp;gt; disable [0|1] ||||Wenn deaktiviert, können keine set oder get commandos für den ROLLO ausgeführt werden.&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;
=== Set ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|open ||set &amp;lt;Rollo-Device&amp;gt; open ||Faehrt das Rollo komplett auf (pct 0)&lt;br /&gt;
|-&lt;br /&gt;
|closed ||set &amp;lt;Rollo-Device&amp;gt; closed||Faehrt das Rollo komplett zu (pct 100)&lt;br /&gt;
|-&lt;br /&gt;
|up ||set &amp;lt;Rollo-Device&amp;gt; up ||Faehrt das Rollo um 10 auf (pct +10)&lt;br /&gt;
|-&lt;br /&gt;
|down ||set &amp;lt;Rollo-Device&amp;gt; down ||Faehrt das Rollo um 10 zu (pct -10)&lt;br /&gt;
|-&lt;br /&gt;
|half || set &amp;lt;Rollo-Device&amp;gt; half ||Faehrt das Rollo zur haelfte runter bzw. hoch (pct 50)&lt;br /&gt;
|-&lt;br /&gt;
|stop ||set &amp;lt;Rollo-Device&amp;gt; stop ||Stoppt das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|drive ||set &amp;lt;Rollo-Device&amp;gt; drive up 5||Fährt das Rollo in die angegebene Richtung für die angegebene Zeit (in Sekunden)&lt;br /&gt;
|-&lt;br /&gt;
|blocked ||set &amp;lt;Rollo-Device&amp;gt; blocked ||wenn aktiviert, kann der ROLLO nur noch eingeschränkt gesteuert werden. Siehe Attribut block_mode für Details.&lt;br /&gt;
|-&lt;br /&gt;
|unblocked ||set &amp;lt;Rollo-Device&amp;gt; unblocked ||Aktiviert einen geblockten ROLLO wieder für die normale Benutzung&lt;br /&gt;
|-&lt;br /&gt;
|pct ||set &amp;lt;Rollo-Device&amp;gt; pct &amp;lt;value&amp;gt; ||Faehrt das Rollo auf eine beliebige pct zwischen 0 (offen) - 100 (geschlossen)&lt;br /&gt;
|-&lt;br /&gt;
|reset ||set &amp;lt;Rollo-Device&amp;gt; reset &amp;lt;value&amp;gt; ||Sagt dem Modul in welcher pct sich der Rollo befindet&lt;br /&gt;
|-&lt;br /&gt;
|extern ||set &amp;lt;Rollo-Device&amp;gt; extern &amp;lt;value&amp;gt; ||Der Software mitteilen dass gerade Befehl X bereits ausgeführt wurde und nun z.B,. das berechnen der aktuellen pct gestartet werden soll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|version ||get &amp;lt;Rollo-Device&amp;gt; version ||Gibt die version des Modul Rollos aus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!Wert !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|command||open,stop,closed||&lt;br /&gt;
|-&lt;br /&gt;
|desired_pct||0-100||Zielposition die angefahren werden soll (nur sinnvoll während das Rollo fährt)&lt;br /&gt;
|-&lt;br /&gt;
|drive-type||modul,extern||bei dem Befehl &amp;quot;set rollo extern ..&amp;quot; wird dieses attribut auf &amp;quot;extern&amp;quot; gestellt, sonst immer &amp;quot;modul&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|last_drive||drive-up,drive-down||die zuletzt benutzte Fahrtrichtung&lt;br /&gt;
|-&lt;br /&gt;
|pct||0-100||exakte Position des Rollo&lt;br /&gt;
|-&lt;br /&gt;
|state||open,closed,position-[0-100]||die Position gerundet auf ganze 10% Schritte, identisch mit dem Internal STATE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
===Set===&lt;br /&gt;
 set RolladenWohnzimmer pct 50&lt;br /&gt;
 set RolladenWohnzimmer geschlossen&lt;br /&gt;
 set RolladenWohnzimmer offen &lt;br /&gt;
Drei Beispiele das Rollo-Modul anzuweisen verschiedene Positionen anzufahren.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer extern stop&lt;br /&gt;
Das Rollo-Modul wird angewiesen den status auf &amp;quot;nicht fahren&amp;quot; zu setzen, die aktuelle Rollo-Position zu berechnen und als neue Position abzuspeichern. Der eigentliche Rollo-Stop-Befehl wird dabei aber nicht gesendet.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer reset closed&lt;br /&gt;
In der Oberfläche von fhem wird für das Rollo die Position &amp;quot;geschlossen&amp;quot; gespeichert, ohne Berechnungen durchzuführen oder Hardware zu steuern. Wird evtl. benötigt wenn der Ist-Status von den Soll-Werten aus fhem abweicht.&lt;br /&gt;
&lt;br /&gt;
===Zusammenspiel mit externem Taster===&lt;br /&gt;
In einem Anwendungszenario hat ein Nutzer zusätzliche Taster an seinem Rollo-Motor über die er ihn ebenfalls steuern kann. &lt;br /&gt;
Die Taster selber senden keine Events an fhem, nur der Rollo-Motor.&lt;br /&gt;
Hier ein Beispiel wie das ganze für aussehen könnte und diese Taster in das ROLLO-Modul integriert werden:&lt;br /&gt;
&lt;br /&gt;
 define rollo_manuell_auf DOIF ([meinRollo_Kanal1] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern open) DOELSEIF ([meinRollo_Kanal1] eq &amp;quot;off&amp;quot; and [meinRolloModul] eq &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
 define rollo_manuell_ab  DOIF ([meinRollo_Kanal2] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern closed) DOELSEIF ([meinRollo_Kanal2] eq &amp;quot;off&amp;quot; and [meinRolloModul] eq &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
&lt;br /&gt;
meinRollo_Kanal1 und meinRollo_Kanal2 sind die Hardwarekanäle die in dem Rollo-Modul zum hochfahren/runterfahren benutzt werden. &lt;br /&gt;
Das erste DOIF prüft ob das Rollo hoch fährt, ohne das das Rollo-Modul davon etwas weis. Ist dem so wird dem Rollo Modul mithilfe des set &amp;lt;extern&amp;gt; mitgeteilt das das Rollo bereits gestartet wurde. Das Modul fängt an die Zeit zu zählen und aktualisiert den Status der Oberfläche auf &amp;quot;fahre hoch&amp;quot;.&lt;br /&gt;
IM DOELSEIF wird abgefragt ob das Rollo steht, obwohl das Modul denkt das Rollo würde noch fahren. Ist dem so wird wieder mithilfe des set &amp;lt;extern&amp;gt; dem Modul mitgeteilt das das Rollo gestoppt wurde. Das Modul berechnet nun aufgrund der gefahrenen Zeit die aktuelle Position und aktualisiert den Status der Oberfläche auf die Position.&lt;br /&gt;
&lt;br /&gt;
Das gleiche wird dann im zweiten DOIF nochmal für das herunterfahren gemacht.&lt;br /&gt;
&lt;br /&gt;
Man kann nun das Rollo sowohl über die Oberfläche als auch per Taster bedienen und fhem und der reale Ist-Status sind synchron. Ach eine gleichzeitige Bedienung ist möglich, Das Rollo startet z.B. aufgrund einer Automatisierung morgens zum hochfahren und man klickt schnell auf den Taster neben dem Bett und stoppt das ganze wieder.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=95832|LinkText=Forum}} seit das Modul Bestandteil der offiziellen FHEM Auslieferung ist&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=47202|LinkText=Forum}} bevor das Modul Bestandteil von FHEM war&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29171</id>
		<title>ROLLO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29171"/>
		<updated>2019-01-20T10:56:00Z</updated>

		<summary type="html">&lt;p&gt;KernSani: /* Links */ präzisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:ROLLO}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Rollo-Steuerung zur einfachen Anzeige/Programmierung&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModFTopic=47202&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= ---- noch nicht Teil von FHEM ----&amp;gt;&lt;br /&gt;
|ModForumArea=Codeschnipsel&lt;br /&gt;
|ModTechName=44_ROLLO.pm&lt;br /&gt;
|ModOwner=ThomasRamm}}&lt;br /&gt;
Das Modul [[ROLLO]] bietet eine einfache Möglichkeit, mit ein bis zwei Relais den Hoch-/Runterlauf eines Rolladen zu steuern und punktgenau anzuhalten. Außerdem wird die aktuelle Position in fhem abgebildet.&lt;br /&gt;
Über welche Hardware/Module die Ausgänge angesprochen werden ist dabei egal.&lt;br /&gt;
__TOC__&lt;br /&gt;
Das Modul unterstützt beliebige Konfigurationen welche Befehle ausgeführt werden müssen um die Hardware des Rollos zu steuern.&lt;br /&gt;
&lt;br /&gt;
* Die Rollo-Position wird in 10%-Schritten von 0% (offen) bis 100% (geschlossen) zwischengespeichert um auf der Oberfläche für jede Position ein Icon festlegen zu können. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Rolladen Eintrag.PNG|right|thumb|400px|Verschiedene Ansichten des Rollo:offen, fährt gerade herunter, position 50, fährt gerade hoch, geschlossen]]&lt;br /&gt;
Vorteil dieses Moduls:&lt;br /&gt;
&lt;br /&gt;
Ist ein Rollo mit diesem Modul definiert kann man auf der Oberfläche per Klick das Rollo hoch/runter oder auf eine bestimmte Position fahren. Der aktuelle Status des Rollo (fährt hoch/runter,offen,geschlossen,etc.) wird angezeigt.&lt;br /&gt;
Die Oberflächenicons werden per devStateIcon gesteuert, Icons und Farben können für jeden Status individuell formatiert werden, die Standard Kommandos auf der Oberfläche (hier: offen, geschlossen, schlitz, Position) können ebenfalls per Attribut angepasst werden. Das Status-Icon ist anklickbar.&lt;br /&gt;
Beim Anlegen des Moduls werden die Attribute zur Darstellung in fhem mit Standardwerten angelegt, so dass man sich einiges an Tipparbeit sparen kann, aber trotzdem die Möglichkeit hat die Darstellung individuell anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Das eigentliche ansteuern des Rollo muss mit FHEM Befehlen ausführbar sein, diese Modul ist &amp;quot;nur&amp;quot; eine Oberfläche/Bedienmodul, kein Hardwaremodul.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Dieses Modul ist in der offiziellen FHEM-Auslieferung enthalten.}}&lt;br /&gt;
&lt;br /&gt;
Rollo Modula auf Github: upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO.pm upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO_Automatik.pm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
und FHEM neu starten&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
 define &amp;lt;name&amp;gt; ROLLO&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&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;
|rl_type ||attr &amp;lt;Rollo-Device&amp;gt; rl_type [normal|HomeKit] ||||Typunterscheidung zur unterstützung verschiedener Hardware. Abhängig vom gewählten Typ wird die Richtung von der die pct gerechnet wird festgelegt:&lt;br /&gt;
&lt;br /&gt;
    normal = pct 0 ist offen, pct 100 ist geschlossen&lt;br /&gt;
    HomeKit = pct 100 ist offen, pct 0 ist geschlossen&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsDown||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsDown &amp;lt;number&amp;gt; ||||Sekunden zum hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsUp &amp;lt;number&amp;gt; ||||Sekunden zum herunterfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessTop ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessTop &amp;lt;number&amp;gt; ||||Zeit die mein Rollo Fahren muss ohne das sich die Rollo-pct ändert (bei mir fährt der Rollo noch in die Wand, ohne das man es am Fenster sieht, die pct ist also schon bei 0%)&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessBottom ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessBottom &amp;lt;number&amp;gt; ||||(siehe excessTop)&lt;br /&gt;
|-&lt;br /&gt;
|rl_switchTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_switchTime &amp;lt;number&amp;gt; ||||Zeit die zwischen 2 gegensätzlichen Laufbefehlen pausiert werden soll, also wenn der Rollo z.B. gerade runter fährt und ich den Befehl gebe hoch zu fahren, dann soll 1 sekunde gewartet werden bis der Motor wirklich zum stillstand kommt, bevor es wieder in die andere Richtung weiter geht. Dies ist die einzige Zeit die nichts mit der eigentlichen Laufzeit des Motors zu tun hat, sondern ein timer zwischen den Laufzeiten.&lt;br /&gt;
|-&lt;br /&gt;
|rl_resetTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_resetTime &amp;lt;number&amp;gt; ||||Zeit die beim Anfahren von Endpositionen (offen,geschlossen) der Motor zusätzlich an bleiben soll um sicherzustellen das die Endposition wirklich angefahren wurde. Dadurch können Differenzen in der Positionsberechnung korrigiert werden.&lt;br /&gt;
|-&lt;br /&gt;
|rl_reactionTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_reactionTime &amp;lt;number&amp;gt; ||||Zeit für den Motor zum reagieren&lt;br /&gt;
|-&lt;br /&gt;
|rl_autoStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_autoStop [0|1] ||||Es muss kein Stop-Befehl ausgeführt werden, das Rollo stoppt von selbst.&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandUp &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum hochfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandDown &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum runterfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStop &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird, sofern nicht commandStopDown bzw. commandStopUp definiert sind&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopDown &amp;lt;string&amp;gt; ||||Befehl der zum stoppen ausgeführt wird, wenn der Rollo gerade herunterfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopUp &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird,wenn der Rollo gerade hochfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_blockMode ||attr &amp;lt;Rollo-Device&amp;gt; rl_blockMode [blocked|force-open|force-closed|only-up|only-down|half-up|half-down|none] ||||wenn ich den Befehl blocked ausführe, dann wird aufgrund der blockMode-Art festgelegt wie mein Rollo reagieren soll:&lt;br /&gt;
&lt;br /&gt;
    blocked = Rollo lässt sich nicht mehr bewegen&lt;br /&gt;
    force-open = bei einem beliebigen Fahrbefehl wird Rollo hochgefahren&lt;br /&gt;
    force-closed = bei einem beliebigen Fahrbefehl wird Rollo runtergefahren&lt;br /&gt;
    only-up = Befehle zum runterfahren werden ignoriert&lt;br /&gt;
    only-down = Befehle zum hochfahren werden ignoriert&lt;br /&gt;
    half-up = es werden nur die Positionen 50-100 angefahren, bei pct &amp;lt;50 wird pct 50% angefahren,&lt;br /&gt;
    half-down = es werden nur die Positionen 0-50 angefahren, bei pct &amp;gt;50 wird pct 50 angefahren&lt;br /&gt;
    none = block-Modus ist deaktiviert&lt;br /&gt;
|-&lt;br /&gt;
|automatic-enabled ||attr &amp;lt;Rollo-Device&amp;gt; automatic-enabled [on|off] ||||Wenn auf off gestellt, haben Befehle über Modul ROLLO_Automatic keine Auswirkungen auf diesen Rollo&lt;br /&gt;
|-&lt;br /&gt;
|automatic-delay ||attr &amp;lt;Rollo-Device&amp;gt; automatic-delay &amp;lt;number&amp;gt; ||||Dieses Attribut wird nur fuer die Modulerweiterung ROLLADEN_Automatic benoetigt.&lt;br /&gt;
Hiermit kann einge Zeitverzoegerund fuer den Rolladen eingestellt werden, werden die Rolladen per Automatic heruntergefahren, so wird dieser um die angegebenen minuten spaeter heruntergefahren.&lt;br /&gt;
|-&lt;br /&gt;
|rl_forceDrive ||attr &amp;lt;Rollo-Device&amp;gt; rl_forceDrive [0|1] ||||open/closed wird ausgeführt, auch wenn das ROLLO bereits in der Zielposition ist&lt;br /&gt;
|-&lt;br /&gt;
|rl_noSetPosBlocked ||attr &amp;lt;Rollo-Device&amp;gt; rl_noSetPosBlocked [0|1] ||||Wenn deaktiviert, können Positionsn (pct) auch gesetzt werden, wenn der ROLLO geblockt ist. Nach dem unblocken wird die entsprechende Position angefahren.&lt;br /&gt;
|-&lt;br /&gt;
|||disableattr &amp;lt;Rollo-Device&amp;gt; disable [0|1] ||||Wenn deaktiviert, können keine set oder get commandos für den ROLLO ausgeführt werden.&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;
=== Set ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|open ||set &amp;lt;Rollo-Device&amp;gt; open ||Faehrt das Rollo komplett auf (pct 0)&lt;br /&gt;
|-&lt;br /&gt;
|closed ||set &amp;lt;Rollo-Device&amp;gt; closed||Faehrt das Rollo komplett zu (pct 100)&lt;br /&gt;
|-&lt;br /&gt;
|up ||set &amp;lt;Rollo-Device&amp;gt; up ||Faehrt das Rollo um 10 auf (pct +10)&lt;br /&gt;
|-&lt;br /&gt;
|down ||set &amp;lt;Rollo-Device&amp;gt; down ||Faehrt das Rollo um 10 zu (pct -10)&lt;br /&gt;
|-&lt;br /&gt;
|half || set &amp;lt;Rollo-Device&amp;gt; half ||Faehrt das Rollo zur haelfte runter bzw. hoch (pct 50)&lt;br /&gt;
|-&lt;br /&gt;
|stop ||set &amp;lt;Rollo-Device&amp;gt; stop ||Stoppt das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|drive ||set &amp;lt;Rollo-Device&amp;gt; drive up 5||Fährt das Rollo in die angegebene Richtung für die angegebene Zeit (in Sekunden)&lt;br /&gt;
|-&lt;br /&gt;
|blocked ||set &amp;lt;Rollo-Device&amp;gt; blocked ||wenn aktiviert, kann der ROLLO nur noch eingeschränkt gesteuert werden. Siehe Attribut block_mode für Details.&lt;br /&gt;
|-&lt;br /&gt;
|unblocked ||set &amp;lt;Rollo-Device&amp;gt; unblocked ||Aktiviert einen geblockten ROLLO wieder für die normale Benutzung&lt;br /&gt;
|-&lt;br /&gt;
|pct ||set &amp;lt;Rollo-Device&amp;gt; pct &amp;lt;value&amp;gt; ||Faehrt das Rollo auf eine beliebige pct zwischen 0 (offen) - 100 (geschlossen)&lt;br /&gt;
|-&lt;br /&gt;
|reset ||set &amp;lt;Rollo-Device&amp;gt; reset &amp;lt;value&amp;gt; ||Sagt dem Modul in welcher pct sich der Rollo befindet&lt;br /&gt;
|-&lt;br /&gt;
|extern ||set &amp;lt;Rollo-Device&amp;gt; extern &amp;lt;value&amp;gt; ||Der Software mitteilen dass gerade Befehl X bereits ausgeführt wurde und nun z.B,. das berechnen der aktuellen pct gestartet werden soll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|version ||get &amp;lt;Rollo-Device&amp;gt; version ||Gibt die version des Modul Rollos aus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!Wert !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|command||open,stop,closed||&lt;br /&gt;
|-&lt;br /&gt;
|desired_pct||0-100||Zielposition die angefahren werden soll (nur sinnvoll während das Rollo fährt)&lt;br /&gt;
|-&lt;br /&gt;
|drive-type||modul,extern||bei dem Befehl &amp;quot;set rollo extern ..&amp;quot; wird dieses attribut auf &amp;quot;extern&amp;quot; gestellt, sonst immer &amp;quot;modul&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|last_drive||drive-up,drive-down||die zuletzt benutzte Fahrtrichtung&lt;br /&gt;
|-&lt;br /&gt;
|pct||0-100||exakte Position des Rollo&lt;br /&gt;
|-&lt;br /&gt;
|state||open,closed,position-[0-100]||die Position gerundet auf ganze 10% Schritte, identisch mit dem Internal STATE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
===Set===&lt;br /&gt;
 set RolladenWohnzimmer pct 50&lt;br /&gt;
 set RolladenWohnzimmer geschlossen&lt;br /&gt;
 set RolladenWohnzimmer offen &lt;br /&gt;
Drei Beispiele das Rollo-Modul anzuweisen verschiedene Positionen anzufahren.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer extern stop&lt;br /&gt;
Das Rollo-Modul wird angewiesen den status auf &amp;quot;nicht fahren&amp;quot; zu setzen, die aktuelle Rollo-Position zu berechnen und als neue Position abzuspeichern. Der eigentliche Rollo-Stop-Befehl wird dabei aber nicht gesendet.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer reset closed&lt;br /&gt;
In der Oberfläche von fhem wird für das Rollo die Position &amp;quot;geschlossen&amp;quot; gespeichert, ohne Berechnungen durchzuführen oder Hardware zu steuern. Wird evtl. benötigt wenn der Ist-Status von den Soll-Werten aus fhem abweicht.&lt;br /&gt;
&lt;br /&gt;
===Zusammenspiel mit externem Taster===&lt;br /&gt;
In einem Anwendungszenario hat ein Nutzer zusätzliche Taster an seinem Rollo-Motor über die er ihn ebenfalls steuern kann. &lt;br /&gt;
Die Taster selber senden keine Events an fhem, nur der Rollo-Motor.&lt;br /&gt;
Hier ein Beispiel wie das ganze für aussehen könnte und diese Taster in das ROLLO-Modul integriert werden:&lt;br /&gt;
&lt;br /&gt;
 define rollo_manuell_auf DOIF ([meinRollo_Kanal1] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern open) DOELSEIF ([meinRollo_Kanal1] eq &amp;quot;off&amp;quot; and [meinRolloModul] eq &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
 define rollo_manuell_ab  DOIF ([meinRollo_Kanal2] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern closed) DOELSEIF ([meinRollo_Kanal2] eq &amp;quot;off&amp;quot; and [meinRolloModul] eq &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
&lt;br /&gt;
meinRollo_Kanal1 und meinRollo_Kanal2 sind die Hardwarekanäle die in dem Rollo-Modul zum hochfahren/runterfahren benutzt werden. &lt;br /&gt;
Das erste DOIF prüft ob das Rollo hoch fährt, ohne das das Rollo-Modul davon etwas weis. Ist dem so wird dem Rollo Modul mithilfe des set &amp;lt;extern&amp;gt; mitgeteilt das das Rollo bereits gestartet wurde. Das Modul fängt an die Zeit zu zählen und aktualisiert den Status der Oberfläche auf &amp;quot;fahre hoch&amp;quot;.&lt;br /&gt;
IM DOELSEIF wird abgefragt ob das Rollo steht, obwohl das Modul denkt das Rollo würde noch fahren. Ist dem so wird wieder mithilfe des set &amp;lt;extern&amp;gt; dem Modul mitgeteilt das das Rollo gestoppt wurde. Das Modul berechnet nun aufgrund der gefahrenen Zeit die aktuelle Position und aktualisiert den Status der Oberfläche auf die Position.&lt;br /&gt;
&lt;br /&gt;
Das gleiche wird dann im zweiten DOIF nochmal für das herunterfahren gemacht.&lt;br /&gt;
&lt;br /&gt;
Man kann nun das Rollo sowohl über die Oberfläche als auch per Taster bedienen und fhem und der reale Ist-Status sind synchron. Ach eine gleichzeitige Bedienung ist möglich, Das Rollo startet z.B. aufgrund einer Automatisierung morgens zum hochfahren und man klickt schnell auf den Taster neben dem Bett und stoppt das ganze wieder.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=95832|LinkText=Forum}} seit das Modul Bestandteil der offiziellen FHEM Auslieferung ist&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=47202|LinkText=Forum}} bevor das Modul Bestandteil von FHEM war&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29170</id>
		<title>ROLLO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29170"/>
		<updated>2019-01-20T10:53:18Z</updated>

		<summary type="html">&lt;p&gt;KernSani: /* Readings */ desired_position-&amp;gt;desired_pct&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:ROLLO}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Rollo-Steuerung zur einfachen Anzeige/Programmierung&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModFTopic=47202&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= ---- noch nicht Teil von FHEM ----&amp;gt;&lt;br /&gt;
|ModForumArea=Codeschnipsel&lt;br /&gt;
|ModTechName=44_ROLLO.pm&lt;br /&gt;
|ModOwner=ThomasRamm}}&lt;br /&gt;
Das Modul [[ROLLO]] bietet eine einfache Möglichkeit, mit ein bis zwei Relais den Hoch-/Runterlauf eines Rolladen zu steuern und punktgenau anzuhalten. Außerdem wird die aktuelle Position in fhem abgebildet.&lt;br /&gt;
Über welche Hardware/Module die Ausgänge angesprochen werden ist dabei egal.&lt;br /&gt;
__TOC__&lt;br /&gt;
Das Modul unterstützt beliebige Konfigurationen welche Befehle ausgeführt werden müssen um die Hardware des Rollos zu steuern.&lt;br /&gt;
&lt;br /&gt;
* Die Rollo-Position wird in 10%-Schritten von 0% (offen) bis 100% (geschlossen) zwischengespeichert um auf der Oberfläche für jede Position ein Icon festlegen zu können. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Rolladen Eintrag.PNG|right|thumb|400px|Verschiedene Ansichten des Rollo:offen, fährt gerade herunter, position 50, fährt gerade hoch, geschlossen]]&lt;br /&gt;
Vorteil dieses Moduls:&lt;br /&gt;
&lt;br /&gt;
Ist ein Rollo mit diesem Modul definiert kann man auf der Oberfläche per Klick das Rollo hoch/runter oder auf eine bestimmte Position fahren. Der aktuelle Status des Rollo (fährt hoch/runter,offen,geschlossen,etc.) wird angezeigt.&lt;br /&gt;
Die Oberflächenicons werden per devStateIcon gesteuert, Icons und Farben können für jeden Status individuell formatiert werden, die Standard Kommandos auf der Oberfläche (hier: offen, geschlossen, schlitz, Position) können ebenfalls per Attribut angepasst werden. Das Status-Icon ist anklickbar.&lt;br /&gt;
Beim Anlegen des Moduls werden die Attribute zur Darstellung in fhem mit Standardwerten angelegt, so dass man sich einiges an Tipparbeit sparen kann, aber trotzdem die Möglichkeit hat die Darstellung individuell anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Das eigentliche ansteuern des Rollo muss mit FHEM Befehlen ausführbar sein, diese Modul ist &amp;quot;nur&amp;quot; eine Oberfläche/Bedienmodul, kein Hardwaremodul.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Dieses Modul ist in der offiziellen FHEM-Auslieferung enthalten.}}&lt;br /&gt;
&lt;br /&gt;
Rollo Modula auf Github: upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO.pm upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO_Automatik.pm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
und FHEM neu starten&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
 define &amp;lt;name&amp;gt; ROLLO&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&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;
|rl_type ||attr &amp;lt;Rollo-Device&amp;gt; rl_type [normal|HomeKit] ||||Typunterscheidung zur unterstützung verschiedener Hardware. Abhängig vom gewählten Typ wird die Richtung von der die pct gerechnet wird festgelegt:&lt;br /&gt;
&lt;br /&gt;
    normal = pct 0 ist offen, pct 100 ist geschlossen&lt;br /&gt;
    HomeKit = pct 100 ist offen, pct 0 ist geschlossen&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsDown||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsDown &amp;lt;number&amp;gt; ||||Sekunden zum hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsUp &amp;lt;number&amp;gt; ||||Sekunden zum herunterfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessTop ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessTop &amp;lt;number&amp;gt; ||||Zeit die mein Rollo Fahren muss ohne das sich die Rollo-pct ändert (bei mir fährt der Rollo noch in die Wand, ohne das man es am Fenster sieht, die pct ist also schon bei 0%)&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessBottom ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessBottom &amp;lt;number&amp;gt; ||||(siehe excessTop)&lt;br /&gt;
|-&lt;br /&gt;
|rl_switchTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_switchTime &amp;lt;number&amp;gt; ||||Zeit die zwischen 2 gegensätzlichen Laufbefehlen pausiert werden soll, also wenn der Rollo z.B. gerade runter fährt und ich den Befehl gebe hoch zu fahren, dann soll 1 sekunde gewartet werden bis der Motor wirklich zum stillstand kommt, bevor es wieder in die andere Richtung weiter geht. Dies ist die einzige Zeit die nichts mit der eigentlichen Laufzeit des Motors zu tun hat, sondern ein timer zwischen den Laufzeiten.&lt;br /&gt;
|-&lt;br /&gt;
|rl_resetTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_resetTime &amp;lt;number&amp;gt; ||||Zeit die beim Anfahren von Endpositionen (offen,geschlossen) der Motor zusätzlich an bleiben soll um sicherzustellen das die Endposition wirklich angefahren wurde. Dadurch können Differenzen in der Positionsberechnung korrigiert werden.&lt;br /&gt;
|-&lt;br /&gt;
|rl_reactionTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_reactionTime &amp;lt;number&amp;gt; ||||Zeit für den Motor zum reagieren&lt;br /&gt;
|-&lt;br /&gt;
|rl_autoStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_autoStop [0|1] ||||Es muss kein Stop-Befehl ausgeführt werden, das Rollo stoppt von selbst.&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandUp &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum hochfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandDown &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum runterfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStop &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird, sofern nicht commandStopDown bzw. commandStopUp definiert sind&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopDown &amp;lt;string&amp;gt; ||||Befehl der zum stoppen ausgeführt wird, wenn der Rollo gerade herunterfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopUp &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird,wenn der Rollo gerade hochfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_blockMode ||attr &amp;lt;Rollo-Device&amp;gt; rl_blockMode [blocked|force-open|force-closed|only-up|only-down|half-up|half-down|none] ||||wenn ich den Befehl blocked ausführe, dann wird aufgrund der blockMode-Art festgelegt wie mein Rollo reagieren soll:&lt;br /&gt;
&lt;br /&gt;
    blocked = Rollo lässt sich nicht mehr bewegen&lt;br /&gt;
    force-open = bei einem beliebigen Fahrbefehl wird Rollo hochgefahren&lt;br /&gt;
    force-closed = bei einem beliebigen Fahrbefehl wird Rollo runtergefahren&lt;br /&gt;
    only-up = Befehle zum runterfahren werden ignoriert&lt;br /&gt;
    only-down = Befehle zum hochfahren werden ignoriert&lt;br /&gt;
    half-up = es werden nur die Positionen 50-100 angefahren, bei pct &amp;lt;50 wird pct 50% angefahren,&lt;br /&gt;
    half-down = es werden nur die Positionen 0-50 angefahren, bei pct &amp;gt;50 wird pct 50 angefahren&lt;br /&gt;
    none = block-Modus ist deaktiviert&lt;br /&gt;
|-&lt;br /&gt;
|automatic-enabled ||attr &amp;lt;Rollo-Device&amp;gt; automatic-enabled [on|off] ||||Wenn auf off gestellt, haben Befehle über Modul ROLLO_Automatic keine Auswirkungen auf diesen Rollo&lt;br /&gt;
|-&lt;br /&gt;
|automatic-delay ||attr &amp;lt;Rollo-Device&amp;gt; automatic-delay &amp;lt;number&amp;gt; ||||Dieses Attribut wird nur fuer die Modulerweiterung ROLLADEN_Automatic benoetigt.&lt;br /&gt;
Hiermit kann einge Zeitverzoegerund fuer den Rolladen eingestellt werden, werden die Rolladen per Automatic heruntergefahren, so wird dieser um die angegebenen minuten spaeter heruntergefahren.&lt;br /&gt;
|-&lt;br /&gt;
|rl_forceDrive ||attr &amp;lt;Rollo-Device&amp;gt; rl_forceDrive [0|1] ||||open/closed wird ausgeführt, auch wenn das ROLLO bereits in der Zielposition ist&lt;br /&gt;
|-&lt;br /&gt;
|rl_noSetPosBlocked ||attr &amp;lt;Rollo-Device&amp;gt; rl_noSetPosBlocked [0|1] ||||Wenn deaktiviert, können Positionsn (pct) auch gesetzt werden, wenn der ROLLO geblockt ist. Nach dem unblocken wird die entsprechende Position angefahren.&lt;br /&gt;
|-&lt;br /&gt;
|||disableattr &amp;lt;Rollo-Device&amp;gt; disable [0|1] ||||Wenn deaktiviert, können keine set oder get commandos für den ROLLO ausgeführt werden.&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;
=== Set ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|open ||set &amp;lt;Rollo-Device&amp;gt; open ||Faehrt das Rollo komplett auf (pct 0)&lt;br /&gt;
|-&lt;br /&gt;
|closed ||set &amp;lt;Rollo-Device&amp;gt; closed||Faehrt das Rollo komplett zu (pct 100)&lt;br /&gt;
|-&lt;br /&gt;
|up ||set &amp;lt;Rollo-Device&amp;gt; up ||Faehrt das Rollo um 10 auf (pct +10)&lt;br /&gt;
|-&lt;br /&gt;
|down ||set &amp;lt;Rollo-Device&amp;gt; down ||Faehrt das Rollo um 10 zu (pct -10)&lt;br /&gt;
|-&lt;br /&gt;
|half || set &amp;lt;Rollo-Device&amp;gt; half ||Faehrt das Rollo zur haelfte runter bzw. hoch (pct 50)&lt;br /&gt;
|-&lt;br /&gt;
|stop ||set &amp;lt;Rollo-Device&amp;gt; stop ||Stoppt das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|drive ||set &amp;lt;Rollo-Device&amp;gt; drive up 5||Fährt das Rollo in die angegebene Richtung für die angegebene Zeit (in Sekunden)&lt;br /&gt;
|-&lt;br /&gt;
|blocked ||set &amp;lt;Rollo-Device&amp;gt; blocked ||wenn aktiviert, kann der ROLLO nur noch eingeschränkt gesteuert werden. Siehe Attribut block_mode für Details.&lt;br /&gt;
|-&lt;br /&gt;
|unblocked ||set &amp;lt;Rollo-Device&amp;gt; unblocked ||Aktiviert einen geblockten ROLLO wieder für die normale Benutzung&lt;br /&gt;
|-&lt;br /&gt;
|pct ||set &amp;lt;Rollo-Device&amp;gt; pct &amp;lt;value&amp;gt; ||Faehrt das Rollo auf eine beliebige pct zwischen 0 (offen) - 100 (geschlossen)&lt;br /&gt;
|-&lt;br /&gt;
|reset ||set &amp;lt;Rollo-Device&amp;gt; reset &amp;lt;value&amp;gt; ||Sagt dem Modul in welcher pct sich der Rollo befindet&lt;br /&gt;
|-&lt;br /&gt;
|extern ||set &amp;lt;Rollo-Device&amp;gt; extern &amp;lt;value&amp;gt; ||Der Software mitteilen dass gerade Befehl X bereits ausgeführt wurde und nun z.B,. das berechnen der aktuellen pct gestartet werden soll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|version ||get &amp;lt;Rollo-Device&amp;gt; version ||Gibt die version des Modul Rollos aus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!Wert !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|command||open,stop,closed||&lt;br /&gt;
|-&lt;br /&gt;
|desired_pct||0-100||Zielposition die angefahren werden soll (nur sinnvoll während das Rollo fährt)&lt;br /&gt;
|-&lt;br /&gt;
|drive-type||modul,extern||bei dem Befehl &amp;quot;set rollo extern ..&amp;quot; wird dieses attribut auf &amp;quot;extern&amp;quot; gestellt, sonst immer &amp;quot;modul&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|last_drive||drive-up,drive-down||die zuletzt benutzte Fahrtrichtung&lt;br /&gt;
|-&lt;br /&gt;
|pct||0-100||exakte Position des Rollo&lt;br /&gt;
|-&lt;br /&gt;
|state||open,closed,position-[0-100]||die Position gerundet auf ganze 10% Schritte, identisch mit dem Internal STATE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
===Set===&lt;br /&gt;
 set RolladenWohnzimmer pct 50&lt;br /&gt;
 set RolladenWohnzimmer geschlossen&lt;br /&gt;
 set RolladenWohnzimmer offen &lt;br /&gt;
Drei Beispiele das Rollo-Modul anzuweisen verschiedene Positionen anzufahren.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer extern stop&lt;br /&gt;
Das Rollo-Modul wird angewiesen den status auf &amp;quot;nicht fahren&amp;quot; zu setzen, die aktuelle Rollo-Position zu berechnen und als neue Position abzuspeichern. Der eigentliche Rollo-Stop-Befehl wird dabei aber nicht gesendet.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer reset closed&lt;br /&gt;
In der Oberfläche von fhem wird für das Rollo die Position &amp;quot;geschlossen&amp;quot; gespeichert, ohne Berechnungen durchzuführen oder Hardware zu steuern. Wird evtl. benötigt wenn der Ist-Status von den Soll-Werten aus fhem abweicht.&lt;br /&gt;
&lt;br /&gt;
===Zusammenspiel mit externem Taster===&lt;br /&gt;
In einem Anwendungszenario hat ein Nutzer zusätzliche Taster an seinem Rollo-Motor über die er ihn ebenfalls steuern kann. &lt;br /&gt;
Die Taster selber senden keine Events an fhem, nur der Rollo-Motor.&lt;br /&gt;
Hier ein Beispiel wie das ganze für aussehen könnte und diese Taster in das ROLLO-Modul integriert werden:&lt;br /&gt;
&lt;br /&gt;
 define rollo_manuell_auf DOIF ([meinRollo_Kanal1] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern open) DOELSEIF ([meinRollo_Kanal1] eq &amp;quot;off&amp;quot; and [meinRolloModul] eq &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
 define rollo_manuell_ab  DOIF ([meinRollo_Kanal2] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern closed) DOELSEIF ([meinRollo_Kanal2] eq &amp;quot;off&amp;quot; and [meinRolloModul] eq &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
&lt;br /&gt;
meinRollo_Kanal1 und meinRollo_Kanal2 sind die Hardwarekanäle die in dem Rollo-Modul zum hochfahren/runterfahren benutzt werden. &lt;br /&gt;
Das erste DOIF prüft ob das Rollo hoch fährt, ohne das das Rollo-Modul davon etwas weis. Ist dem so wird dem Rollo Modul mithilfe des set &amp;lt;extern&amp;gt; mitgeteilt das das Rollo bereits gestartet wurde. Das Modul fängt an die Zeit zu zählen und aktualisiert den Status der Oberfläche auf &amp;quot;fahre hoch&amp;quot;.&lt;br /&gt;
IM DOELSEIF wird abgefragt ob das Rollo steht, obwohl das Modul denkt das Rollo würde noch fahren. Ist dem so wird wieder mithilfe des set &amp;lt;extern&amp;gt; dem Modul mitgeteilt das das Rollo gestoppt wurde. Das Modul berechnet nun aufgrund der gefahrenen Zeit die aktuelle Position und aktualisiert den Status der Oberfläche auf die Position.&lt;br /&gt;
&lt;br /&gt;
Das gleiche wird dann im zweiten DOIF nochmal für das herunterfahren gemacht.&lt;br /&gt;
&lt;br /&gt;
Man kann nun das Rollo sowohl über die Oberfläche als auch per Taster bedienen und fhem und der reale Ist-Status sind synchron. Ach eine gleichzeitige Bedienung ist möglich, Das Rollo startet z.B. aufgrund einer Automatisierung morgens zum hochfahren und man klickt schnell auf den Taster neben dem Bett und stoppt das ganze wieder.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=95832|LinkText=Forum}}&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=47202|LinkText=Forum}} mit der jeweils aktuellen Version des Moduls als Anhang im ersten Beitrag.&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29169</id>
		<title>ROLLO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ROLLO&amp;diff=29169"/>
		<updated>2019-01-20T10:50:02Z</updated>

		<summary type="html">&lt;p&gt;KernSani: /* Zusammenspiel mit externem Taster */ meinRolloModul sollte das DOIF nicht triggern (&amp;quot;?&amp;quot; eingefügt)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:ROLLO}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Rollo-Steuerung zur einfachen Anzeige/Programmierung&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModFTopic=47202&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= ---- noch nicht Teil von FHEM ----&amp;gt;&lt;br /&gt;
|ModForumArea=Codeschnipsel&lt;br /&gt;
|ModTechName=44_ROLLO.pm&lt;br /&gt;
|ModOwner=ThomasRamm}}&lt;br /&gt;
Das Modul [[ROLLO]] bietet eine einfache Möglichkeit, mit ein bis zwei Relais den Hoch-/Runterlauf eines Rolladen zu steuern und punktgenau anzuhalten. Außerdem wird die aktuelle Position in fhem abgebildet.&lt;br /&gt;
Über welche Hardware/Module die Ausgänge angesprochen werden ist dabei egal.&lt;br /&gt;
__TOC__&lt;br /&gt;
Das Modul unterstützt beliebige Konfigurationen welche Befehle ausgeführt werden müssen um die Hardware des Rollos zu steuern.&lt;br /&gt;
&lt;br /&gt;
* Die Rollo-Position wird in 10%-Schritten von 0% (offen) bis 100% (geschlossen) zwischengespeichert um auf der Oberfläche für jede Position ein Icon festlegen zu können. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Rolladen Eintrag.PNG|right|thumb|400px|Verschiedene Ansichten des Rollo:offen, fährt gerade herunter, position 50, fährt gerade hoch, geschlossen]]&lt;br /&gt;
Vorteil dieses Moduls:&lt;br /&gt;
&lt;br /&gt;
Ist ein Rollo mit diesem Modul definiert kann man auf der Oberfläche per Klick das Rollo hoch/runter oder auf eine bestimmte Position fahren. Der aktuelle Status des Rollo (fährt hoch/runter,offen,geschlossen,etc.) wird angezeigt.&lt;br /&gt;
Die Oberflächenicons werden per devStateIcon gesteuert, Icons und Farben können für jeden Status individuell formatiert werden, die Standard Kommandos auf der Oberfläche (hier: offen, geschlossen, schlitz, Position) können ebenfalls per Attribut angepasst werden. Das Status-Icon ist anklickbar.&lt;br /&gt;
Beim Anlegen des Moduls werden die Attribute zur Darstellung in fhem mit Standardwerten angelegt, so dass man sich einiges an Tipparbeit sparen kann, aber trotzdem die Möglichkeit hat die Darstellung individuell anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Das eigentliche ansteuern des Rollo muss mit FHEM Befehlen ausführbar sein, diese Modul ist &amp;quot;nur&amp;quot; eine Oberfläche/Bedienmodul, kein Hardwaremodul.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Dieses Modul ist in der offiziellen FHEM-Auslieferung enthalten.}}&lt;br /&gt;
&lt;br /&gt;
Rollo Modula auf Github: upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO.pm upD https://github.com/RettungsTim/fhem-rollo/blob/master/FHEM/44_ROLLO_Automatik.pm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
und FHEM neu starten&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
 define &amp;lt;name&amp;gt; ROLLO&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&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;
|rl_type ||attr &amp;lt;Rollo-Device&amp;gt; rl_type [normal|HomeKit] ||||Typunterscheidung zur unterstützung verschiedener Hardware. Abhängig vom gewählten Typ wird die Richtung von der die pct gerechnet wird festgelegt:&lt;br /&gt;
&lt;br /&gt;
    normal = pct 0 ist offen, pct 100 ist geschlossen&lt;br /&gt;
    HomeKit = pct 100 ist offen, pct 0 ist geschlossen&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsDown||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsDown &amp;lt;number&amp;gt; ||||Sekunden zum hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_secondsUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_secondsUp &amp;lt;number&amp;gt; ||||Sekunden zum herunterfahren&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessTop ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessTop &amp;lt;number&amp;gt; ||||Zeit die mein Rollo Fahren muss ohne das sich die Rollo-pct ändert (bei mir fährt der Rollo noch in die Wand, ohne das man es am Fenster sieht, die pct ist also schon bei 0%)&lt;br /&gt;
|-&lt;br /&gt;
|rl_excessBottom ||attr &amp;lt;Rollo-Device&amp;gt; rl_excessBottom &amp;lt;number&amp;gt; ||||(siehe excessTop)&lt;br /&gt;
|-&lt;br /&gt;
|rl_switchTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_switchTime &amp;lt;number&amp;gt; ||||Zeit die zwischen 2 gegensätzlichen Laufbefehlen pausiert werden soll, also wenn der Rollo z.B. gerade runter fährt und ich den Befehl gebe hoch zu fahren, dann soll 1 sekunde gewartet werden bis der Motor wirklich zum stillstand kommt, bevor es wieder in die andere Richtung weiter geht. Dies ist die einzige Zeit die nichts mit der eigentlichen Laufzeit des Motors zu tun hat, sondern ein timer zwischen den Laufzeiten.&lt;br /&gt;
|-&lt;br /&gt;
|rl_resetTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_resetTime &amp;lt;number&amp;gt; ||||Zeit die beim Anfahren von Endpositionen (offen,geschlossen) der Motor zusätzlich an bleiben soll um sicherzustellen das die Endposition wirklich angefahren wurde. Dadurch können Differenzen in der Positionsberechnung korrigiert werden.&lt;br /&gt;
|-&lt;br /&gt;
|rl_reactionTime ||attr &amp;lt;Rollo-Device&amp;gt; rl_reactionTime &amp;lt;number&amp;gt; ||||Zeit für den Motor zum reagieren&lt;br /&gt;
|-&lt;br /&gt;
|rl_autoStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_autoStop [0|1] ||||Es muss kein Stop-Befehl ausgeführt werden, das Rollo stoppt von selbst.&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandUp &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum hochfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandDown &amp;lt;string&amp;gt; ||||Es werden bis zu 3 beliebige Befehle zum runterfahren ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStop ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStop &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird, sofern nicht commandStopDown bzw. commandStopUp definiert sind&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopDown ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopDown &amp;lt;string&amp;gt; ||||Befehl der zum stoppen ausgeführt wird, wenn der Rollo gerade herunterfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_commandStopUp ||attr &amp;lt;Rollo-Device&amp;gt; rl_commandStopUp &amp;lt;string&amp;gt; ||||Befehl der zum Stoppen ausgeführt wird,wenn der Rollo gerade hochfährt. Wenn nicht definiert wird commandStop ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|rl_blockMode ||attr &amp;lt;Rollo-Device&amp;gt; rl_blockMode [blocked|force-open|force-closed|only-up|only-down|half-up|half-down|none] ||||wenn ich den Befehl blocked ausführe, dann wird aufgrund der blockMode-Art festgelegt wie mein Rollo reagieren soll:&lt;br /&gt;
&lt;br /&gt;
    blocked = Rollo lässt sich nicht mehr bewegen&lt;br /&gt;
    force-open = bei einem beliebigen Fahrbefehl wird Rollo hochgefahren&lt;br /&gt;
    force-closed = bei einem beliebigen Fahrbefehl wird Rollo runtergefahren&lt;br /&gt;
    only-up = Befehle zum runterfahren werden ignoriert&lt;br /&gt;
    only-down = Befehle zum hochfahren werden ignoriert&lt;br /&gt;
    half-up = es werden nur die Positionen 50-100 angefahren, bei pct &amp;lt;50 wird pct 50% angefahren,&lt;br /&gt;
    half-down = es werden nur die Positionen 0-50 angefahren, bei pct &amp;gt;50 wird pct 50 angefahren&lt;br /&gt;
    none = block-Modus ist deaktiviert&lt;br /&gt;
|-&lt;br /&gt;
|automatic-enabled ||attr &amp;lt;Rollo-Device&amp;gt; automatic-enabled [on|off] ||||Wenn auf off gestellt, haben Befehle über Modul ROLLO_Automatic keine Auswirkungen auf diesen Rollo&lt;br /&gt;
|-&lt;br /&gt;
|automatic-delay ||attr &amp;lt;Rollo-Device&amp;gt; automatic-delay &amp;lt;number&amp;gt; ||||Dieses Attribut wird nur fuer die Modulerweiterung ROLLADEN_Automatic benoetigt.&lt;br /&gt;
Hiermit kann einge Zeitverzoegerund fuer den Rolladen eingestellt werden, werden die Rolladen per Automatic heruntergefahren, so wird dieser um die angegebenen minuten spaeter heruntergefahren.&lt;br /&gt;
|-&lt;br /&gt;
|rl_forceDrive ||attr &amp;lt;Rollo-Device&amp;gt; rl_forceDrive [0|1] ||||open/closed wird ausgeführt, auch wenn das ROLLO bereits in der Zielposition ist&lt;br /&gt;
|-&lt;br /&gt;
|rl_noSetPosBlocked ||attr &amp;lt;Rollo-Device&amp;gt; rl_noSetPosBlocked [0|1] ||||Wenn deaktiviert, können Positionsn (pct) auch gesetzt werden, wenn der ROLLO geblockt ist. Nach dem unblocken wird die entsprechende Position angefahren.&lt;br /&gt;
|-&lt;br /&gt;
|||disableattr &amp;lt;Rollo-Device&amp;gt; disable [0|1] ||||Wenn deaktiviert, können keine set oder get commandos für den ROLLO ausgeführt werden.&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;
=== Set ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|open ||set &amp;lt;Rollo-Device&amp;gt; open ||Faehrt das Rollo komplett auf (pct 0)&lt;br /&gt;
|-&lt;br /&gt;
|closed ||set &amp;lt;Rollo-Device&amp;gt; closed||Faehrt das Rollo komplett zu (pct 100)&lt;br /&gt;
|-&lt;br /&gt;
|up ||set &amp;lt;Rollo-Device&amp;gt; up ||Faehrt das Rollo um 10 auf (pct +10)&lt;br /&gt;
|-&lt;br /&gt;
|down ||set &amp;lt;Rollo-Device&amp;gt; down ||Faehrt das Rollo um 10 zu (pct -10)&lt;br /&gt;
|-&lt;br /&gt;
|half || set &amp;lt;Rollo-Device&amp;gt; half ||Faehrt das Rollo zur haelfte runter bzw. hoch (pct 50)&lt;br /&gt;
|-&lt;br /&gt;
|stop ||set &amp;lt;Rollo-Device&amp;gt; stop ||Stoppt das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|drive ||set &amp;lt;Rollo-Device&amp;gt; drive up 5||Fährt das Rollo in die angegebene Richtung für die angegebene Zeit (in Sekunden)&lt;br /&gt;
|-&lt;br /&gt;
|blocked ||set &amp;lt;Rollo-Device&amp;gt; blocked ||wenn aktiviert, kann der ROLLO nur noch eingeschränkt gesteuert werden. Siehe Attribut block_mode für Details.&lt;br /&gt;
|-&lt;br /&gt;
|unblocked ||set &amp;lt;Rollo-Device&amp;gt; unblocked ||Aktiviert einen geblockten ROLLO wieder für die normale Benutzung&lt;br /&gt;
|-&lt;br /&gt;
|pct ||set &amp;lt;Rollo-Device&amp;gt; pct &amp;lt;value&amp;gt; ||Faehrt das Rollo auf eine beliebige pct zwischen 0 (offen) - 100 (geschlossen)&lt;br /&gt;
|-&lt;br /&gt;
|reset ||set &amp;lt;Rollo-Device&amp;gt; reset &amp;lt;value&amp;gt; ||Sagt dem Modul in welcher pct sich der Rollo befindet&lt;br /&gt;
|-&lt;br /&gt;
|extern ||set &amp;lt;Rollo-Device&amp;gt; extern &amp;lt;value&amp;gt; ||Der Software mitteilen dass gerade Befehl X bereits ausgeführt wurde und nun z.B,. das berechnen der aktuellen pct gestartet werden soll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Get ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!set Befehl !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|version ||get &amp;lt;Rollo-Device&amp;gt; version ||Gibt die version des Modul Rollos aus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !!Wert !!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|command||open,stop,closed||&lt;br /&gt;
|-&lt;br /&gt;
|desired_position||0-100||Zielposition die angefahren werden soll (nur sinnvoll während das Rollo fährt)&lt;br /&gt;
|-&lt;br /&gt;
|drive-type||modul,extern||bei dem Befehl &amp;quot;set rollo extern ..&amp;quot; wird dieses attribut auf &amp;quot;extern&amp;quot; gestellt, sonst immer &amp;quot;modul&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|last_drive||drive-up,drive-down||die zuletzt benutzte Fahrtrichtung&lt;br /&gt;
|-&lt;br /&gt;
|pct||0-100||exakte Position des Rollo&lt;br /&gt;
|-&lt;br /&gt;
|state||open,closed,position-[0-100]||die Position gerundet auf ganze 10% Schritte, identisch mit dem Internal STATE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
===Set===&lt;br /&gt;
 set RolladenWohnzimmer pct 50&lt;br /&gt;
 set RolladenWohnzimmer geschlossen&lt;br /&gt;
 set RolladenWohnzimmer offen &lt;br /&gt;
Drei Beispiele das Rollo-Modul anzuweisen verschiedene Positionen anzufahren.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer extern stop&lt;br /&gt;
Das Rollo-Modul wird angewiesen den status auf &amp;quot;nicht fahren&amp;quot; zu setzen, die aktuelle Rollo-Position zu berechnen und als neue Position abzuspeichern. Der eigentliche Rollo-Stop-Befehl wird dabei aber nicht gesendet.&lt;br /&gt;
&lt;br /&gt;
 set RolladenWohnzimmer reset closed&lt;br /&gt;
In der Oberfläche von fhem wird für das Rollo die Position &amp;quot;geschlossen&amp;quot; gespeichert, ohne Berechnungen durchzuführen oder Hardware zu steuern. Wird evtl. benötigt wenn der Ist-Status von den Soll-Werten aus fhem abweicht.&lt;br /&gt;
&lt;br /&gt;
===Zusammenspiel mit externem Taster===&lt;br /&gt;
In einem Anwendungszenario hat ein Nutzer zusätzliche Taster an seinem Rollo-Motor über die er ihn ebenfalls steuern kann. &lt;br /&gt;
Die Taster selber senden keine Events an fhem, nur der Rollo-Motor.&lt;br /&gt;
Hier ein Beispiel wie das ganze für aussehen könnte und diese Taster in das ROLLO-Modul integriert werden:&lt;br /&gt;
&lt;br /&gt;
 define rollo_manuell_auf DOIF ([meinRollo_Kanal1] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern open) DOELSEIF ([meinRollo_Kanal1] eq &amp;quot;off&amp;quot; and [meinRolloModul] eq &amp;quot;drive-up&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
 define rollo_manuell_ab  DOIF ([meinRollo_Kanal2] eq &amp;quot;on&amp;quot; and [?meinRolloModul] ne &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern closed) DOELSEIF ([meinRollo_Kanal2] eq &amp;quot;off&amp;quot; and [meinRolloModul] eq &amp;quot;drive-down&amp;quot;) (set meinRolloModul extern stop)&lt;br /&gt;
&lt;br /&gt;
meinRollo_Kanal1 und meinRollo_Kanal2 sind die Hardwarekanäle die in dem Rollo-Modul zum hochfahren/runterfahren benutzt werden. &lt;br /&gt;
Das erste DOIF prüft ob das Rollo hoch fährt, ohne das das Rollo-Modul davon etwas weis. Ist dem so wird dem Rollo Modul mithilfe des set &amp;lt;extern&amp;gt; mitgeteilt das das Rollo bereits gestartet wurde. Das Modul fängt an die Zeit zu zählen und aktualisiert den Status der Oberfläche auf &amp;quot;fahre hoch&amp;quot;.&lt;br /&gt;
IM DOELSEIF wird abgefragt ob das Rollo steht, obwohl das Modul denkt das Rollo würde noch fahren. Ist dem so wird wieder mithilfe des set &amp;lt;extern&amp;gt; dem Modul mitgeteilt das das Rollo gestoppt wurde. Das Modul berechnet nun aufgrund der gefahrenen Zeit die aktuelle Position und aktualisiert den Status der Oberfläche auf die Position.&lt;br /&gt;
&lt;br /&gt;
Das gleiche wird dann im zweiten DOIF nochmal für das herunterfahren gemacht.&lt;br /&gt;
&lt;br /&gt;
Man kann nun das Rollo sowohl über die Oberfläche als auch per Taster bedienen und fhem und der reale Ist-Status sind synchron. Ach eine gleichzeitige Bedienung ist möglich, Das Rollo startet z.B. aufgrund einer Automatisierung morgens zum hochfahren und man klickt schnell auf den Taster neben dem Bett und stoppt das ganze wieder.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=95832|LinkText=Forum}}&lt;br /&gt;
&lt;br /&gt;
Thread im {{Link2Forum|Topic=47202|LinkText=Forum}} mit der jeweils aktuellen Version des Moduls als Anhang im ersten Beitrag.&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=29159</id>
		<title>HTTPS-Absicherung &amp; Authentifizierung via nginx Webserver</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=29159"/>
		<updated>2019-01-19T09:08:03Z</updated>

		<summary type="html">&lt;p&gt;KernSani: /* Installation: nginx als reverse Proxy */ Das access-log vernünftig benamst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ähnlich wie im Artikel [[Apache Authentication Proxy]] kann FHEM auch mit dem schlankeren nginx Webserver abgesichert werden. Nach diesem Artikel ist die Kommunikation zum FHEM-Server via HTTPS verschlüsselt und eine Authentifizierung nur via Benutzername und Passwort möglich. Externer Zugriff aus dem eigenen Netzwerk/Internet soll damit unterbunden werden; die Kommunikation und Authentifizierung findet verschlüsselt statt.&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Vorausgesetzt wird eine funktionierende FHEM Installation. Die dadurch erbrachten Linux Kenntnisse reichen für die Umsetzung dieses Artikels. Weiterführende Links zu Zertifikaten und dem nginx-Webserver befinden sich im Anhang des Artikels.&lt;br /&gt;
&lt;br /&gt;
Ausgegangen wird von einer FHEM-Installation, die auf Port 8083 via HTTP hört. Dieser Port wird abgesichert, indem er nur noch lokal und nicht mehr über das Netzwerk erreichbar ist. Anfragen auf Port 80 (HTTP, nginx) werden weitergeleitet zum lokalen Port 443 (HTTPS, nginx), der wiederum einen Reverse Proxy auf den Port 8083 (HTTPS, fhem) einrichtet. Mit leichten Modifizierungen könnte nginx auch auf einem separaten Server betrieben werden. Die benötigten Zertifikate für die HTTPS Verschlüsselung können eigenhändig angelegt werden. Der/die autorisierten Benutzer werden in einer verschlüsselten Datei hinterlegt, die nginx für die Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das Setup auf einem Raspberry Pi (Raspbian - basierend auf Debian 8 und 9) und fhem 5.7 bzw. fhem 5.8. Die beschriebenen Befehle sollten sich ohne weiteres auf Ubuntu oder andere Debian-Derivate übertragen lassen. Das beschriebene Konzept lässt sich aber auf jedes Unix-Derivat anwenden.&lt;br /&gt;
&lt;br /&gt;
==Unterscheidung von Browser auf PC und mobilen Endgeräten==&lt;br /&gt;
&lt;br /&gt;
Zusätzlich kann man mit nginx sehr bequem zwischen PC und mobilen Endgeräten unterscheiden und damit verschiedene FHEMWEB - Instanzen aufrufen.&lt;br /&gt;
&lt;br /&gt;
==Anpassungen: fhem-Config==&lt;br /&gt;
In der FHEM-Konfiguration muss sichergestellt werden, dass kein Client außerhalb des Servers zugreifen kann. Dazu muss das normalerweise gesetzte Flag global von jeglicher Konfiguration entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Beispielkonfiguration:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
# define telnetPort telnet 7072 global&lt;br /&gt;
&lt;br /&gt;
define WEB FHEMWEB 8083&lt;br /&gt;
attr WEB stylesheetPrefix dark&lt;br /&gt;
# attr WEB HTTPS&lt;br /&gt;
&lt;br /&gt;
define WEBphone FHEMWEB 8084&lt;br /&gt;
attr WEBphone stylesheetPrefix darksmallscreen&lt;br /&gt;
&lt;br /&gt;
# define WEBtablet FHEMWEB 8085 global&lt;br /&gt;
# attr WEBtablet stylesheetPrefix touchpad&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
fhem neustarten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; $ sudo service fhem stop &amp;amp;&amp;amp; sudo service fhem start &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation: nginx als reverse Proxy ==&lt;br /&gt;
nginx installieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo apt-get install nginx &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach im Pfad &#039;&#039;&#039;/etc/nginx/sites-available&#039;&#039;&#039; eine neue Proxy Konfiguration anlegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo touch /etc/nginx/sites-available/reverse-proxy&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Inhalt der Datei &#039;&#039;&#039;reverse-proxy&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
&lt;br /&gt;
    listen 443;&lt;br /&gt;
    server_name fhempi;&lt;br /&gt;
&lt;br /&gt;
    # check user agent&lt;br /&gt;
    if ($http_user_agent ~* &#039;(iPhone|iPod|Opera Mini|Android.*Mobile|NetFront|PSP|BlackBerry|Windows Phone)&#039;) {&lt;br /&gt;
    set $ua_type &amp;quot;@mobile&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate           /etc/nginx/cert.crt;&lt;br /&gt;
    ssl_certificate_key       /etc/nginx/cert.key;&lt;br /&gt;
&lt;br /&gt;
    ssl on;&lt;br /&gt;
    ssl_session_cache  builtin:1000  shared:SSL:10m;&lt;br /&gt;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;&lt;br /&gt;
    ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
    access_log            /var/log/nginx/fhem.access.log;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
&lt;br /&gt;
      proxy_set_header        Host $host;&lt;br /&gt;
      proxy_set_header        X-Real-IP $remote_addr;&lt;br /&gt;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
      proxy_set_header        X-Forwarded-Proto $scheme;&lt;br /&gt;
      proxy_http_version      1.1;&lt;br /&gt;
&lt;br /&gt;
      # Gehe zu FHEMWEB wenn kein mobiler Browser&lt;br /&gt;
      if ($ua_type != &amp;quot;@mobile&amp;quot;){&lt;br /&gt;
          proxy_pass          http://localhost:8083;&lt;br /&gt;
      }&lt;br /&gt;
      # Gehe zu FHEMWEB smallscreen wenn mobiler Browser&lt;br /&gt;
      if ($ua_type = &amp;quot;@mobile&amp;quot;){&lt;br /&gt;
          proxy_pass          http://localhost:8084;&lt;br /&gt;
      }&lt;br /&gt;
      proxy_read_timeout  90;&lt;br /&gt;
      #proxy_read_timeout  20736000;&lt;br /&gt;
      #proxy_buffering     off;&lt;br /&gt;
&lt;br /&gt;
      # User Sickboy&#039;s Erweiterung für verschlüsselte Websocket-Kommunikation (siehe Diskussionsseite)&lt;br /&gt;
      # Für normale Benutzer derzeit kommentiert, vom Autor Andremotz noch bisher ungetestet&lt;br /&gt;
      #  ... daher derzeit auskommentiert&lt;br /&gt;
      # Wird für &#039;longpoll&#039; benötigt (z.B. bei FTUI)&lt;br /&gt;
      #set $my_http_upgrade &amp;quot;&amp;quot;;&lt;br /&gt;
      #set $my_connection &amp;quot;Connection&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      #if ($http_upgrade = &amp;quot;websocket&amp;quot;) {&lt;br /&gt;
      #  set $my_http_upgrade $http_upgrade;&lt;br /&gt;
      #  set $my_connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
      #}&lt;br /&gt;
      &lt;br /&gt;
      #proxy_set_header Upgrade $my_http_upgrade;&lt;br /&gt;
      #proxy_set_header Connection $my_connection;&lt;br /&gt;
&lt;br /&gt;
      auth_basic &amp;quot;Restricted Content&amp;quot;;&lt;br /&gt;
      auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
      # proxy_redirect      http://localhost:8083 https://localhost;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit dieser Konfiguration werden zwei Server-Instanzen auf Port 80 und Port 443 angelegt. Surft ein Browser/eine App Port 80 an, wird er umgehend zum verschlüsselten Port 443 weitergeleitet. Die Zertifikate befinden sich im lokalen Verzeichnis unter /etc/nginx und verschlüsselt wird via TLS.&lt;br /&gt;
&lt;br /&gt;
Nginx&#039; Default-Konfiguration muss noch deaktiviert und die Reverse-Proxy-Einstellungen verlinkt werden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo unlink /etc/nginx/sites-enabled/default&lt;br /&gt;
$ sudo ln -s /etc/nginx/sites-available/reverse-proxy /etc/nginx/sites-enabled/reverse-proxy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Ein User hatte für mich nicht nachvollziehbare Probleme und empfiehlt folgende Settings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
   proxy_read_timeout  2073600;&lt;br /&gt;
   proxy_buffering off;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User anlegen für Authentifizierung ==&lt;br /&gt;
Der Username und das verschlüsselte Passwort werden mit den folgenden Kommandos in die Datei ’’ ’/etc/nginx/.htpasswd’’’ geschrieben, das nginx in der Konfiguration für die User-Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Username &#039;&#039;&#039;maxmustermann&#039;&#039;&#039; anlegen (Doppelpunkt nach Username nicht übersehen!):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo sh -c &amp;quot;echo -n &#039;maxmustermann:&#039; &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Passwort-Prompt aufrufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo sh -c &amp;quot;openssl passwd -apr1 &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zertifikatserstellung == &lt;br /&gt;
Erst durch die Zertifikate ist eine verschlüsselte Kommunikation zwischen Browser und nginx möglich&lt;br /&gt;
Beide beschriebenen Optionen sind dabei gleichermaßen sicher. Damit allerdings nicht jedes ausgestelle Zertifikat vertraut wird, gibt es das Konzept der Certificate Authorities (&#039;CA&#039;, näheres siehe Links). Jeder gängige Browser warnt den Benutzer vor einem Zertifikat, das von keiner Thrusted Authority ausgestellt wurde, bietet jedoch dem Benutzer die Möglichkeit, trotzdem fortzufahren. Durch die Tatsache, dass das Zertifikat selbst erstellt und signiert wird, kann diese Warnung im Browser später getrost umgangen werden. &lt;br /&gt;
&lt;br /&gt;
Selbst signiertes Zertifikat erstellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dabei werden für die Erstellung ein paar Angaben abgefragt. Wichtig ist dabei der Common Name, der identisch mit der später verwendeten Domain oder öffentliche IP-Adresse sein muss.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Country Name (2 letter code) [AU]:AT&lt;br /&gt;
State or Province Name (full name) [Some-State]:Vienna&lt;br /&gt;
Locality Name (eg, city) []:Vienna&lt;br /&gt;
Organization Name (eg, company) []:privat&lt;br /&gt;
Organizational Unit Name (eg, section) []:privat&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:meine_domain_oder_ip&lt;br /&gt;
Email Address []:admin@meinedomain&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nginx neustarten, um die Änderungen und das Zertifikat zu übernehmen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo service nginx reload &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der folgende Aufruf sollten bereits eingerichteten FHEM-Server via Passwort-Abfrage und HTTPS absichern:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;fhemserver&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Fehlerquellen ==&lt;br /&gt;
=== Beim Aufruf http://&amp;lt;fhempi&amp;gt; wird nur eine &amp;quot;Wilkommen bei nginx&amp;quot;-Seite angezeigt, statt der erwartete Login-Screen ===&lt;br /&gt;
Nach einer Neuinstallation dem Autor selber passiert. Fehler war, dass die nginx-Default-Konfiuguration noch aktiv war. Der Link zur Default-Konfiguration muss entfernt werden, bzw. gleich komplett gelöscht werden&lt;br /&gt;
&lt;br /&gt;
=== Wenn ich mich einlogge, bekomme ich nur einen 500 internal Server error. Ich habe garantiert alles richtig konfiguriert! ===&lt;br /&gt;
Ebenfalls dem Autor nach einer Neuinstallation passiert: Fehler war, dass das Passwort durch einen Copy &amp;amp; Paste-Fehler falsch eingetragen wurde. Der Fehlerfall kann umgangen werden, indem zuerst die .htpasswd-Datei gelöscht wird und der User und ein simples Passwort neu angelegt werden. Danach mit einer neuen Browser-Session Fhem ansurfen (am besten Firefox im Privat-Modus, damit sämtliche Cookies &amp;amp; sonstiges Buffering umgangen wird)&lt;br /&gt;
&lt;br /&gt;
== Quellen &amp;amp; weiterführende Links ==&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-nginx-for-ubuntu-14-04 How To Create an SSL Certificate on Nginx for Ubuntu 14.04]&lt;br /&gt;
* [https://linuxconfig.org/setting-up-nginx-reverse-proxy-server-on-debian-linux Setting up Nginx Reverse Proxy server on Debian Linux]&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-nginx-on-ubuntu-14-04 How To Set Up Password Authentication with Nginx on Ubuntu 14.04]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol_Secure Wikipedia: HTTPS]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Transport_Layer_Security Wikipedia: TLS]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=24462</id>
		<title>Alexa-Fhem</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=24462"/>
		<updated>2018-01-09T22:17:03Z</updated>

		<summary type="html">&lt;p&gt;KernSani: Hinweis auf neue API Version (Forumsbeitrag) eingefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Alexa-Fhem&#039;&#039;&#039; ist eine in JavaScript geschriebene und auf NodeJS basierende Software, welche es ermöglicht, der digitalen Amazon Assistentin Alexa zusätzliche Skills für die Heimautomatisierung via FHEM beizubringen. Eine erste funktionierende Version wurde von [https://forum.fhem.de/index.php?action=profile;u=430 justme1968] im {{Link2Forum|Topic=60244|LinkText=Forum}} veröffentlicht.&lt;br /&gt;
Das ist eine erste Version der Dokumentation zur Installation und Einrichtung, eine Erweiterung wird sicherlich in nächster Zeit noch folgen.&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an Amazon Assistent Alexa&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModTechName=&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModOwner=justme1968&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
===Glossar===&lt;br /&gt;
*Echo bzw. Echo Dot (im Folgenden maskulin bezeichnet) sind die derzeit verfügbaren Geräte des Alexa-Systems &#039;&#039;&#039;BILDER EINSTELLEN - Achtung Urheberrecht&#039;&#039;&#039;&lt;br /&gt;
*AVS ist der Amazon Voice Service, d.h. die Spracherkennungskomponente des Systems.{{Randnotiz|RNTyp=r|RNText=Für die Nutzung der Amazon AWS-Dienste müssen zwingend die Daten einer Kreditkarte angegeben werden. Nach gegenwärtigem Kenntnisstand sollen jedoch keine Kosten für die Nutzung der im Rahmen dieses How To beschriebenen Dienste anfallen, sofern diese in einem Rahmen genutzt werden, der selbst eine intensive private Nutzung nicht überschreitet. Der Benutzer sei an dieser Stelle auf die von Amazon veröffentlichten Preislisten verwiesen. Die Autoren dieser Anleitung und der darin beschriebenen Module übernehmen keine Haftung für eventuelle Kosten, die aus der Nutzung der AWS entstehen. }}&lt;br /&gt;
*AWS sind die Amazon Web Services, also per URL erreichbare Dienste zur Ausführung von Berechnungen etc. Im Rahmen von Alexa-Fhem wird bei AWS eine eigene JavaScript-Funktion hinterlegt, die zur Kommunikation mit dem FHEM-Server dient. Im Jargon von Amazon ist dies eine so genannte Lambda-Funktion &#039;&#039;&#039;WARUM ? Nachlesen bei Amazon&#039;&#039;&#039;.&lt;br /&gt;
*Card bezeichnet einen Eintrag in der Alexa-App, der die erkannte Sprachnachricht sowie weiter gehenden Informationen über die Reaktion von Alexa enzthält und Rückmeldung an Amazon erlaubt.&lt;br /&gt;
*Skill (engl. für Fähigkeit) ist die Bezeichnung für eine per Spracherkennung bediente Funktionalität des Alexa-Systems, z.B. zur Nachrichtenansage, zur Wettervorhersage oder zur Steuerung von FHEM&lt;br /&gt;
&lt;br /&gt;
===Arbeitsweise und Datenfluss===&lt;br /&gt;
[[Datei:2gpXyLN.jpg|200px|thumb|right|Grafische Darstellung der beteiligten Komponenten]]&lt;br /&gt;
Echo -&amp;gt; AVS -&amp;gt; AWS Lambda -&amp;gt; alexa-fhem -&amp;gt; AWS Lambda -&amp;gt; AVS -&amp;gt; Echo&lt;br /&gt;
 &lt;br /&gt;
*Der Echo (oder ein anderes Alexa/AVS fähiges Gerät)  nimmt Audiodaten auf und schickt diese an AVS  (Amazon Voice Service) zur Erkennung&lt;br /&gt;
*AVS führt die Spracherkennung durch und erzeugt ein Event mit Informationen zu den erkannten Daten&lt;br /&gt;
:*Beim Alexa SmartHome Skill sind die möglichen Sätze für die Spracherkennung relativ fest vorgegeben &lt;br /&gt;
:*Beim Alexa Custom Skill kommen die dazu nötigen Informationen aus dem &#039;&#039;Interaction Model&#039;&#039; der Alexa Skills Configuration&lt;br /&gt;
*Das Event wird an den unter &#039;&#039;Configuration&#039;&#039; in der Alexa Skills Configuration hinterlegten Endpoint geschickt&lt;br /&gt;
:*Beim Alexa SmartHome Skill ist das zwingend eine AWS Lambda Routine&lt;br /&gt;
:*Beim Alexa Custom Skill kann das im Prinzip auch ein eigener Web Service sein&lt;br /&gt;
*Das Event wird vom &amp;lt;code&amp;gt;lambda.js&amp;lt;/code&amp;gt; code an alexa-fhem weitergeleitet&lt;br /&gt;
*alexa-fhem steuert FHEM und sendet ein Antwort-Event zurück&lt;br /&gt;
*&amp;lt;code&amp;gt;lambda.js&amp;lt;/code&amp;gt; nimmt diese Antwort entgegen und gibt sie an AVS zurück&lt;br /&gt;
*AVS sogt dafür das der Echo &#039;antwortet&#039; und dass die Card in der Alexa App erscheint&lt;br /&gt;
&lt;br /&gt;
===Anmerkungen===&lt;br /&gt;
*Ein Skill hat keinen Zugriff auf die Audiodaten&lt;br /&gt;
*Mit dem Skill API kann ein Skill zu zu keiner Zeit von sich aus aktiv werden und &#039;einfach&#039; Daten an den Echo schicken oder ihn dazu bringen irgendetwas zu tun.&lt;br /&gt;
*Wenn man berücksichtigt welchen Weg die Daten insgesamt gehen, ist es erstaunlich, wie schnell die Reaktion auf einen gesprochenen Satz erfolgt.&lt;br /&gt;
&lt;br /&gt;
=== Abgrenzung des &#039;&#039;&#039;Alexa Smart Home Skills&#039;&#039;&#039; und des &#039;&#039;&#039;Alexa Custom Skills&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
Der [[Alexa-Fhem#Smart_Home|Alexa Smart Home Skill]] ist ein Amazon-Alexa-Standard-Skill, der wesentliche Basisfunktionalitäten bereitstellt. Zu diesen gehört im Wesentlichen die Funktionalität, durch Alexa-FHEM bereitgestellte Devices im Alexa-Account des Benutzers anzulegen. Der Alexa Smart Home Skill reagiert auf gesprochene Interaktion in einem beschränkten Umfang. Beispielsweise genügt ein &amp;quot;Alexa, schalte die Wohnzimmerlampe an&amp;quot; um eine Interaktion zwischen Alexa Smart Home Skill und FHEM-Alexa auszulösen. Nach erfolgreicher Einrichtung wird dieser Skill in der Alexa-App bzw. im Web in der Rubrik &amp;quot;Smart Home&amp;quot; als Skill angezeigt.&lt;br /&gt;
&lt;br /&gt;
Der [[Alexa-Fhem#Custom|Alexa Custom Skill]] ist kein Standard-Smart-Home-Skill, sondern ein individuell entwickelter Skill, so wie alle anderen Skills auch. Er wird daher auch nicht in der Alexa-App unter der Rubrik &amp;quot;Smart Home&amp;quot; angezeigt. Gesprochene Interaktion mit diesem Skill erfolgt dadurch, dass entweder der Skill explizit gestartet wird (z.B. &amp;quot;Alexa, starte [Name des Skills]&amp;quot;) oder direkt angesprochen wird (z.B. &amp;quot;Alexa, frage [Name des Skills] wie ist der Status von [Device] &amp;quot;). Der Alexa Custom Skill befindet sich in Entwicklung und wird hinsichtlich seiner Funktionalitäten laufend weiterentwickelt. Die Einrichtung dieses Skills ist grundsätzlich optional, jedoch werden anspruchsvollere Steuerungsmöglichkeiten nur mit diesem realisiert werden können.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Da die einzelnen Schritte der Anleitung an verschiedenen Stellen unterbrochen und später fortgesetzt werden müssen, empfiehlt es sich, die Anleitung einmal vollständig gelesen zu haben. Während der Konfiguration sollten alle nachfolgenden Abschnitte parallel in gleichzeitig geöffneten Browserfenstern durchgeführt werden, die jeweils bis zum Abschluss geöffnet bleiben müssen. }}&lt;br /&gt;
Grundvoraussetzung für alle folgenden Schritte ist das Vorhandensein eines Amazon-Accounts. Es wird davon ausgegangen, dass die Konten für alle im Folgenden genutzten Amazon-Dienste eingerichtet wurden.&lt;br /&gt;
&lt;br /&gt;
===node.js installieren===&lt;br /&gt;
Zunächst wird das Betriebssystem (in diesem Falle Debian oder Ubuntu) auf den aktuellen Stand gebracht:&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 update&lt;br /&gt;
sudo apt-get upgrade&lt;br /&gt;
sudo apt-get install build-essential libssl-dev&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss NodeJS installiert werden. Leider ist die Version im Debian Repository deutlich zu alt, daher wird mit den folgenden Befehlen das Node Repository hinzugefügt und NodeJS (in der LTS Version) entsprechend installiert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -&lt;br /&gt;
sudo apt-get install -y nodejs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa-Fhem installieren ===&lt;br /&gt;
&#039;&#039;&#039;Aus gegebenem Anlass: Dies ist weder eine Einführung in Linux, noch eine Anfängerdokumentation für FHEM.&#039;&#039;&#039; Also erst die Grundlagen lernen, und dann mit Alexa beginnen !&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Version ist jeweils  {{Link2Forum|Topic=60244|Message=540117|LinkText=hier}} zu finden.&lt;br /&gt;
Wer bisher noch keinen Alexa-FHEM Skill angelegt hat, bitte {{Link2Forum|Topic=81324|Message=733986|LinkText=diesen Forumsbeitrag}} beachten!&lt;br /&gt;
&lt;br /&gt;
====Erstinstallation====&lt;br /&gt;
Hier wird die Erstinstallation von Alexa-Fhem beschrieben.&lt;br /&gt;
===== Linux =====&lt;br /&gt;
# Die tgz-Datei unter Linux im Hauptverzeichnis von FHEM (typischerweise &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt;) entpacken (&#039;&#039;nicht&#039;&#039; unter Windows, das zerstört die Rechteeinstellungen).&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;tar -xvzf dateiname.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;mv package alexa-fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Durch &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd alexa-fhem&amp;lt;/syntaxhighlight&amp;gt; in das Verzeichnis wechseln&lt;br /&gt;
# Mit &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/syntaxhighlight&amp;gt; alle Abhängigkeiten installieren (kein sudo!).&lt;br /&gt;
# SSL Zertifikat erzeugen durch Aufruf von &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./createKey.sh&amp;lt;/syntaxhighlight&amp;gt; (kein sudo!). Hierbei beachten, dass ein Kennwort vergeben werden muss, das mindestens aus 4 Zeichen besteht, dieses Kennwort bitte merken.&lt;br /&gt;
# Das Verzeichnis &#039;&#039;.alexa&#039;&#039; anlegen, &#039;&#039;und zwar im Home-Verzeichnis desjenigen Benutzers, unter dem Alexa-Fhem laufen soll.&#039;&#039; Insbesondere ist zu beachten, dass dieser Nutzer u.U. im Startskript explizit gesetzt wird. Mit dem untenstehenden Skript ist das &#039;&#039;nicht&#039;&#039; der User fhem, sondern der User &#039;&#039;pi&#039;&#039;. Das Symbol &#039;&#039;~/&#039;&#039; verweist auf das Home-Verzeichnis des Benutzers, der gerade die Installation vornimmt.&lt;br /&gt;
# Die Datei &#039;&#039;config-sample.json&#039;&#039; nach &#039;&#039;.alexa/config.json&#039;&#039; kopieren. Achtung: Installiert man alexa-fhem als root-user, zeigt das Symbol &#039;&#039;~/&#039;&#039; auf &#039;&#039;/root&#039;&#039; - und die Konfigurationsdatei wird ggf. bei einem manuellen Start von Alexa-Fhem nicht gefunden.&lt;br /&gt;
# Achtung: Ggf. müssen auch die Dateien key.pem und cert.pem ins entsprechende Verzeichnis kopiert werden.&lt;br /&gt;
===== Windows =====&lt;br /&gt;
&#039;&#039;Vor&#039;&#039; der Installation von Alexa-Fhem muss man folgende Anwendungen installieren:&lt;br /&gt;
* Node.js (die aktuelle Version findet man unter https://nodejs.org/en/download/)&lt;br /&gt;
* OpenSSL (http://slproweb.com/products/Win32OpenSSL.html oder https://www.heise.de/download/product/win32-openssl-47316/download)&lt;br /&gt;
Erst dann fängt man mit Alexa-Fhem an.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Die tgz-Datei im Hauptverzeichnis von FHEM (z.B. &amp;lt;code&amp;gt;С:\Program Files (x86)\fhem&amp;lt;/code&amp;gt;) entpacken.&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen&lt;br /&gt;
# Windows-Shell (Kommandozeile, Eingabeaufforderung usw.) öffnen. &amp;quot;Start&amp;quot; -&amp;gt; &amp;quot;Ausführen&amp;quot; (oder [Windows-Taste]+[R]) -&amp;gt; cmd -&amp;gt; Ok. Durch &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd &amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; in das Verzeichnis wechseln. &amp;lt;br/&amp;gt;Dabei ist natürlich das &amp;lt;FHEM-Hauptverzeichis&amp;gt; durch den entsprechenden Pfad aus dem Schritt 1 zu ersetzen. Im o.g. Beispiel wäre es &amp;lt;code&amp;gt;cd &amp;quot;С:\Program Files (x86)\fhem\alexa-fhem&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Mit &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/syntaxhighlight&amp;gt; alle Abhängigkeiten installieren.&amp;lt;br/&amp;gt; Bei der Fehlermeldung wie &amp;quot;Der Befehl &amp;quot;npm&amp;quot; ist entweder falsch geschrieben oder konnte nicht gefunden werden.&amp;quot; ist die Installation von Node.js zu überprüfen.&lt;br /&gt;
# SSL Zertifikat erzeugen. Dafür muss man alle Befehle aus dem Skript &#039;&#039;createKey.sh&#039;&#039; nacheinander manuell ausführen. Hierbei beachten, dass ein Kennwort vergeben werden muss, das mindestens aus 4 Zeichen besteht, dieses Kennwort bitte merken. Der Windows-Welt unbekannter Befehl &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt; ist durch &amp;lt;code&amp;gt;move /y&amp;lt;/code&amp;gt; zu ersetzen:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;openssl rsa -in key.pem -out newkey.pem&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;move /y newkey.pem key.pem&amp;lt;/syntaxhighlight&amp;gt; Eventuelle Fehlermeldung &amp;quot;can&#039;t open config file: /usr/local/ssl/openssl.cnf&amp;quot; o.Ä. lässt sich durch Befehl &amp;lt;code&amp;gt;set OPENSSL_CONF=&amp;lt;OpenSSL-Verzeichnis&amp;gt;\bin\openssl.cfg&amp;lt;/code&amp;gt; beheben, wobei &amp;lt;OpenSSL-Verzeichnis&amp;gt; durch den entsprechenden Installationspfad (typischerweise &amp;lt;code&amp;gt;c:\OpenSSL-Win32&amp;lt;/code&amp;gt;) zu ersetzen ist.&lt;br /&gt;
# Das Verzeichnis &#039;&#039;.alexa&#039;&#039; anlegen, &#039;&#039;und zwar im Benutzerverzeichnis desjenigen Benutzers, unter dem Alexa-Fhem laufen soll.&#039;&#039; In aktuellen Versionen von Windows (ab Windows 7 bzw. ab Windows Server 2008 R2) liegt das Verzeichnis unter &amp;lt;code&amp;gt;C:\Users\&amp;lt;Benutzername&amp;gt;&amp;lt;/code&amp;gt;, also z.B. für Benutzer &amp;quot;Administrator&amp;quot; - unter &amp;lt;code&amp;gt;C:\Users\Administrator&amp;lt;/code&amp;gt;.&amp;lt;br/&amp;gt;Falls Windows sich weigert das Verzichniss mit dem Punkt am Anfang zu erstellen, kann man das aus der Kommandozeile machen:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd &amp;quot;C:\Users\&amp;lt;Benutzername&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
mkdir &amp;quot;.alexa&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Die Datei &#039;&#039;config-sample.json&#039;&#039; nach &#039;&#039;C:\Users\&amp;lt;Benutzername&amp;gt;\.alexa\config.json&#039;&#039; kopieren.&lt;br /&gt;
# Achtung: Ggf. müssen auch die Dateien key.pem und cert.pem ins entsprechende Verzeichnis (&amp;lt;code&amp;gt;&amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem\bin&amp;lt;/code&amp;gt;) kopiert werden.&lt;br /&gt;
&lt;br /&gt;
====Update====&lt;br /&gt;
Hier wir das Update auf eine neue Version von Alexa-Fhem beschrieben&lt;br /&gt;
===== Linux =====&lt;br /&gt;
# Das Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; im Hauptverzeichnis von FHEM (typischerweise &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt;) umbenennen in &#039;&#039;alexa-fhem.old&#039;&#039;.&lt;br /&gt;
# Die tgz-Datei der neuen Alexa-Fhem-Version unter Linux im Hauptverzeichnis von FHEM (typischerweise &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt;) entpacken (&#039;&#039;nicht&#039;&#039; unter Windows, das zerstört die Rechteeinstellungen).&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen, in das Verzeichnis wechseln&lt;br /&gt;
# Mit &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/syntaxhighlight&amp;gt; alle Abhängigkeiten installieren (kein sudo!).&lt;br /&gt;
# Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; ins neue Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; kopieren.&lt;br /&gt;
Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; gelöscht werden.&lt;br /&gt;
===== Windows =====&lt;br /&gt;
# Das Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; im Hauptverzeichnis von FHEM (z.B. &amp;lt;code&amp;gt;С:\Program Files (x86)\fhem&amp;lt;/code&amp;gt;) umbenennen in &#039;&#039;alexa-fhem.old&#039;&#039;.&lt;br /&gt;
# Die tgz-Datei der neuen Alexa-Fhem-Version im Hauptverzeichnis von FHEM entpacken.&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen&lt;br /&gt;
# Windows-Shell (Kommandozeile, Eingabeaufforderung usw.) öffnen. &amp;quot;Start&amp;quot; -&amp;gt; &amp;quot;Ausführen&amp;quot; (oder [Windows-Taste]+[R]) -&amp;gt; cmd -&amp;gt; Ok. Durch &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd &amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; in das Verzeichnis wechseln. &amp;lt;br/&amp;gt;Dabei ist natürlich das &amp;lt;FHEM-Hauptverzeichis&amp;gt; durch den entsprechenden Pfad aus dem Schritt 1 zu ersetzen. Im o.g. Beispiel wäre es &amp;lt;code&amp;gt;cd &amp;quot;С:\Program Files (x86)\fhem\alexa-fhem&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Mit &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/syntaxhighlight&amp;gt; alle Abhängigkeiten installieren.&lt;br /&gt;
# Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; ins neue Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; kopieren.&lt;br /&gt;
Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem konfigurieren ====&lt;br /&gt;
Der Inhalt der Datei &#039;&#039;~/.alexa/config.json&#039;&#039; muss an die eigene Umgebung angepasst werden. &lt;br /&gt;
# &#039;&#039;nat-pmp&#039;&#039; -&amp;gt; wenn nat-pmp verwendet werden soll: die ip des eigenen routers,&lt;br /&gt;
# &#039;&#039;nat-upnp&#039;&#039; -&amp;gt; wenn nat-upnp verwendet werden soll: &#039;&#039;true&#039;&#039;,&lt;br /&gt;
# &#039;&#039;applicationId&#039;&#039; &lt;br /&gt;
#:* Wenn man nur den SmartHome-Skill verwenden möchte, kann dieser Eintrag leer bleiben.&lt;br /&gt;
#:* Ansonsten ist er mit der SkillID des Alexa Custom Skills zu belegen, siehe Abschnitt [[#Skill_Id_bestimmen | Skill Id bestimmen]]&lt;br /&gt;
# &#039;&#039;oauthClientID&#039;&#039; -&amp;gt; &#039;&#039;Client ID&#039;&#039; dem Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&lt;br /&gt;
# &#039;&#039;server&#039;&#039; -&amp;gt; IP-Adresse des eigenen FHEM-Servers&lt;br /&gt;
# &#039;&#039;port&#039;&#039; -&amp;gt; Portnummer des eigenen FHEM-Servers&lt;br /&gt;
Beispiel:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;alexa&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Alexa TEST&amp;quot;,&lt;br /&gt;
        &amp;quot;keyFile&amp;quot;: &amp;quot;./key.pem&amp;quot;,&lt;br /&gt;
        &amp;quot;certFile&amp;quot;: &amp;quot;./cert.pem&amp;quot;,&lt;br /&gt;
        &amp;quot;applicationId&amp;quot;: &amp;quot;amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;quot;,&lt;br /&gt;
        &amp;quot;oauthClientID&amp;quot;: &amp;quot;amzn1.application-oa2-client.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;connections&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;FHEM&amp;quot;,&lt;br /&gt;
            &amp;quot;server&amp;quot;: &amp;quot;192.168.0.xxx.xxx&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: &amp;quot;8083&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;room=AlexaRoom&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Mehrere Custom Skills lassen sich mit der folgenden Syntax eintragen&lt;br /&gt;
         &amp;quot;applicationId&amp;quot;: [ &amp;quot;amzn1.ask.skill.1&amp;quot; , &amp;quot;amzn1.ask.skill.2&amp;quot; ],&lt;br /&gt;
         &amp;quot;oauthClientID&amp;quot;: [ &amp;quot;amzn1.application-oa2-client.1&amp;quot; , &amp;quot;amzn1.application-oa2-client.1&amp;quot; ]&lt;br /&gt;
&lt;br /&gt;
Danach durch Aufruf von &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./bin/alexa&amp;lt;/syntaxhighlight&amp;gt; den Dienst starten (kein sudo!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unter Windows startet man Alexa-Dienst durch &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;node alexa&amp;lt;/syntaxhighlight&amp;gt; aus der &amp;lt;code&amp;gt;alex-fhem/bin&amp;lt;/code&amp;gt; (also erst z.B. durch &amp;lt;code&amp;gt;cd &amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem\bin&amp;quot;&amp;lt;/code&amp;gt; ins richtige Verzeichnis kommen)&lt;br /&gt;
&lt;br /&gt;
Der Start des Alexa-Dienstes auf der Console ist immer dann zu empfehlen, wenn man auf die Ausgaben des Dienstes angewiesen ist und beispielsweise sehen möchte, welche Devices durch den Dienst bereitgestellt werden oder ob Fehler auftreten. Beendet man die Console-Session wird auch der Dienst wieder beendet. Insofern ist die vorgenannte Vorgehensweise nur für ein Debugging zu empfehlen und nicht im Regelbetrieb. Nachfolgend ist beschrieben, wie man den Alexa-Dienst aus FHEM heraus starten / stoppen und neu starten kann.&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem aus FHEM heraus starten ====&lt;br /&gt;
Zunächst das Start-up-Skript aus diesem Post herunterladen {{Link2Forum|Topic=60244|Message=517271|LinkText=https://forum.fhem.de/index.php/topic,60244.msg517271.html#msg517271}} und unter /etc/init.d/alexa speichern.&lt;br /&gt;
&lt;br /&gt;
Das Script geht davon aus, das der alexa-fhem script unter /opt/fhem/alexa-fhem liegt, und die logfiles später unter /opt/fhem/log. Sollte das nicht der Fall sein, muss das Skript angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Nun folgende Kommandos ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo chmod 755 /etc/init.d/alexa&lt;br /&gt;
sudo update-rc.d alexa defaults&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datei &amp;lt;code&amp;gt;/etc/sudoers&amp;lt;/code&amp;gt; den User fhem für die Nutzung von sudo zulassen (&amp;lt;code&amp;gt;sudo nano /etc/sudoers&amp;lt;/code&amp;gt;), z.B. durch Anfügen der nachfolgenden Zeile:&lt;br /&gt;
&amp;lt;code&amp;gt;fhem ALL=(ALL) NOPASSWD: ALL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun folgende Devices anlegen (ggf. einem Raum zuordnen, z.B. AlexaControl):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;define FHEM.Alexa.Status dummy&lt;br /&gt;
&lt;br /&gt;
define FHEM.Alexa dummy&lt;br /&gt;
attr FHEM.Alexa event-on-change-reading state&lt;br /&gt;
attr FHEM.Alexa webCmd status:start:stop:restart&lt;br /&gt;
&lt;br /&gt;
define FHEM.Alexa.DOIF DOIF ([FHEM.Alexa] eq &amp;quot;start&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa start &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;stop&amp;quot;)&lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa stop &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;restart&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa restart &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;status&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa status &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)})&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem als Service (systemd) installieren ====&lt;br /&gt;
Auf neueren Installationen (z.B. RPi Jessie) wird init.d durch systemd ersetzt. Folgend die Anleitung um alexa-fhem als Service zu installieren auf einem Raspberry Pi mit Jessie.&lt;br /&gt;
&lt;br /&gt;
Zunächst einen neuen Benutzer anlegen unter dem alexa-fhem laufen soll, falls man nicht möchtet dass alexa-fhem z.B. mit dem fhem User ausgeführt wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo useradd -M --system alexa&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigentlich braucht der Benutzer keine Gruppen, aber man kann den Benutzer auch der Gruppe &amp;lt;code&amp;gt;dialout&amp;lt;/code&amp;gt; hinzufügen (&amp;lt;code&amp;gt;sudo usermod -a -G dialout alexa&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Datei &amp;quot;alexa.service&amp;quot; unter &amp;lt;code&amp;gt;/etc/systemd/system&amp;lt;/code&amp;gt; anlegen:&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Node.js Alexa Server &lt;br /&gt;
 After=syslog.target network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=alexa &lt;br /&gt;
 WorkingDirectory=/opt/alexa/alexa-fhem&lt;br /&gt;
 ExecStart=/opt/fhem/alexa-fhem/bin/alexa -U /home/alexa/.alexa&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=10&lt;br /&gt;
 KillMode=process&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target &lt;br /&gt;
&lt;br /&gt;
Den Pfad &amp;lt;code&amp;gt;/home/alexa/.alexa&amp;lt;/code&amp;gt; an die Systemgegebenheiten anpassen. Letztendlich kann die config.json irgendwo liegen, hauptsache alexa-fhem weiß wo. &lt;br /&gt;
&lt;br /&gt;
Im WorkingDirectory wird der alexa Dienst die Zertifikate suchen.&lt;br /&gt;
&lt;br /&gt;
Achtung: Natürlich muss der Benutzer auch Zugriff sowohl auf das Verzeichnis mit der config als auch das alexa-fhem Verzeichnis und das WorkingDirectory haben.&lt;br /&gt;
&lt;br /&gt;
Um den Service zu aktiveren und zu starten helfen folgende Befehle:&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl enable alexa&lt;br /&gt;
 sudo systemctl start alexa&lt;br /&gt;
&lt;br /&gt;
Status abfragen mit&lt;br /&gt;
 sudo systemctl status alexa&lt;br /&gt;
&lt;br /&gt;
Log einsehen?&lt;br /&gt;
 sudo journalctl -u alexa&lt;br /&gt;
&lt;br /&gt;
(mit &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; kann man den follow Modus aktivieren, wie &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt;).&lt;br /&gt;
Bei einen reboot startet alexa-fhem jetzt automatisch.&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem testen ====&lt;br /&gt;
Node.Js stellt einen Web-Server am Port 3000 bereit, das oben erzeugte Zertifikat sichert diesen Zugang per SSL ab. Durch Aufruf der Adresse&lt;br /&gt;
&amp;lt;code&amp;gt;https://&amp;lt;IP-Adresse des Servers&amp;gt;:3000&amp;lt;/code&amp;gt; kann man testen, ob der Alexa-Fhem Service läuft - der Seitenaufruf liefert eine Zeile JSON-Code, beginnend mit&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;header&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;UnsupportedOperationError&amp;quot;...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa Device anlegen ===&lt;br /&gt;
Das Modul 39_alexa.pm stellt innerhalb von FHEM verschiedene Attribute z.B. alexaName oder alexaRoom zur Verfügung. Manche dieser Attribute (wie z.b. alexaName) werden in beiden Skills verwendet, andere werden ausschließlich bei einer Nutzung des Alexa Custom Skill verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung des Alexa Device geschieht durch die nachfolgende Definition:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;define MyAlexa alexa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa Skills ===&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://developer.amazon.com angemeldet sein&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-01-login2.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-02-userpass2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Security Profile anlegen ====&lt;br /&gt;
Die Erzeugung eines Sicherheitsprofils muss nur einmal erfolgen, es wird dann für alle weiteren Skills verwendet.&lt;br /&gt;
# Nach der Anmeldung Auswahl von &#039;&#039;APPS &amp;amp; SERVICES&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Anschließend auswählen &#039;&#039;Security Profiles&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-05-apps_and_services_-_security_profiles.png|200px]]&lt;br /&gt;
# Auswählen &#039;&#039;Create a New Security Profile&#039;&#039; aus&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-06-apps_and_services_-_create_a_new_security_profile.png|200px]]&lt;br /&gt;
# Dann einen Namen und eine Beschreibung für das Profil eingeben und mit &#039;&#039;Save&#039;&#039; bestätigen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-07-apps_and_services_-_security_profile_management.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== Login with Amazon =====&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo &#039;&#039;Client Id&#039;&#039; und &#039;&#039;Client Secret&#039;&#039; zu finden sind}}&lt;br /&gt;
# Oben rechts auf &#039;&#039;Login with Amazon&#039;&#039; klicken (https://developer.amazon.com/lwa/sp/overview.html).&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-08-login_with_amazon.png|200px]]&lt;br /&gt;
# Auf der neu geladenen Seite auswählen &#039;&#039;Sign up&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-09-login_with_amazon_-_sign_up.png|200px]]&lt;br /&gt;
# Anschließend im Dropdown Menü das vorher angelegte Profil auswählen und mit &#039;&#039;Confirm&#039;&#039; bestätigen&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-10-login_with_amazon_-_create_new_profile.png|200px]] [[Datei:Developer.amazon.com-11-login_with_amazon_-_create_new_profile2.png|200px]]&lt;br /&gt;
# Im folgenden Fenster die Adresse [https://www.amazon.com/gp/help/customer/display.html?nodeId=468496 https://www.amazon.com/gp/help/customer/display.html?nodeId=468496] eingeben und mit &#039;&#039;Save&#039;&#039; bestätigen. &#039;&#039;&#039;Todo Erklärungsbedarf: WARUM diese Adresse&#039;&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-12-login_with_amazon_-_enter_consent_screen_information.png|200px]]&lt;br /&gt;
# Anschließend bei dem neu angelegten Eintrag auf der rechten Seite auf das Zahnrad klicken und &#039;&#039;Web Settings&#039;&#039; auswählen&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-13-login_with_amazon_-_web_settings.png|200px]]&lt;br /&gt;
# Im neu geladenen Fenster anklicken von &#039;&#039;Edit&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-14-login_with_amazon_-_edit.png|200px]]&lt;br /&gt;
# Anschließend bei &#039;&#039;Allowed Return URLs&#039;&#039; die folgenden drei Adressen eingeben. &#039;&#039;xxx&#039;&#039; muss hierbei durch den Wert ersetzt werden, der in den beiden Abschnitten [[#SmartHome_Skill_anlegen | SmartHome Skill anlegen]] bzw. [[#Custom_Skill_anlegen | Custom Skill anlegen]] jeweils unter Punkt 4 (Seite &#039;&#039;Configuration&#039;&#039;) bei &#039;&#039;Redirect Urls&#039;&#039; am Ende der URLs angezeigt wird&lt;br /&gt;
## [https://layla.amazon.co.uk/api/skill/link/xxx https://layla.amazon.co.uk/api/skill/link/xxx]&lt;br /&gt;
## [https://pitangui.amazon.com/api/skill/link/xxx https://pitangui.amazon.com/api/skill/link/xxx]&lt;br /&gt;
## [https://layla.amazon.com/api/skill/link/xxx https://layla.amazon.com/api/skill/link/xxx]&lt;br /&gt;
.&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-15-login_with_amazon_-_allowed_return_urls.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Skills bearbeiten ====&lt;br /&gt;
# Im Menü den Punkt &#039;&#039;ALEXA&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Anschließend im Feld &#039;&#039;Alexa Skills Kit&#039;&#039; auf &#039;&#039;Get started&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-17-alexa_-_alex_skills_kit_-_get_started.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== SmartHome Skill anlegen ====={{Randnotiz|RNTyp=r|RNText=aktuell lässt sich nur noch das v3 api auswählen. eine test version hierfür gibt es im {{Link2Forum|Topic=81324|LinkText=Forum}}. bitte die hinweise dort lesen und beachten.}}&lt;br /&gt;
# Oben rechts &#039;&#039;Add a New Skill&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-18-alexa_-_alex_skills_kit_-_add_a_new_skill.png|200px]]&lt;br /&gt;
# Auf der folgenden Seite eingeben und dann mit &#039;&#039;Next&#039;&#039; bestätigen:&lt;br /&gt;
#:* &#039;&#039;Skill Type&#039;&#039; -&amp;gt; &#039;&#039;SmartHome Skill API&#039;&#039; &lt;br /&gt;
#:* &#039;&#039;Language&#039;&#039; -&amp;gt; &#039;&#039;German&#039;&#039;&lt;br /&gt;
#:* &#039;&#039;Name&#039;&#039; -&amp;gt; beliebiger Name, z.B. &amp;quot;MySmartHome Basic&amp;quot;)&lt;br /&gt;
#:* &#039;&#039;Payload Version&#039;&#039; -&amp;gt; &#039;&#039;v2 (other devices)&#039;&#039; &amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-19-alexa_-_alex_skills_kit_-_skill_information.png|200px]] &lt;br /&gt;
# Die folgende Seite einfach mit &#039;&#039;Next&#039;&#039; überspringen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-20-alexa_-_alex_skills_kit_-_interaction_model.png|200px]]&lt;br /&gt;
# Auf der Seite &#039;&#039;Configuration&#039;&#039; Folgendes eingeben:&lt;br /&gt;
#:* &#039;&#039;Service Endpoint Type&#039;&#039; -&amp;gt; &#039;&#039;AWS Lambda&#039;&#039; ist vorausgewählt und kann nicht geändert werden.&lt;br /&gt;
#:* &#039;&#039;Geographical Region&#039;&#039; -&amp;gt; &#039;&#039;Europe&#039;&#039; auswählen und im Textfeld die ARN aus Abschnitt [[#ARN_der_AWS_Lambda_Funktion_bestimmen | AWS Lambda Funktion]] eintragen. &lt;br /&gt;
#:* &#039;&#039;Authorization URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/ap/oa&amp;lt;/code&amp;gt;&lt;br /&gt;
#:* &#039;&#039;Client ID&#039;&#039; -&amp;gt; &#039;&#039;Client ID&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&lt;br /&gt;
#:* &#039;&#039;Scope&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;profile:user_id&amp;lt;/code&amp;gt;    (wörtlich 1:1 eintragen)&lt;br /&gt;
#:* &#039;&#039;Redirect URLs&#039;&#039; - sollten vorbelegt sein&lt;br /&gt;
#:* &#039;&#039;Authorization Grant Type&#039;&#039; -&amp;gt; &#039;&#039;Auth Code Grant&#039;&#039; auswählen&lt;br /&gt;
#:* &#039;&#039;Access Token URI&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://api.amazon.com/auth/o2/token&amp;lt;/code&amp;gt;&lt;br /&gt;
#:* &#039;&#039;Client Secret&#039;&#039; -&amp;gt; &#039;&#039;Client Secret&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&lt;br /&gt;
#:* &#039;&#039;Client Authentication Scheme&#039;&#039; -&amp;gt; &#039;&#039;HTTP Basic&#039;&#039;&lt;br /&gt;
#:* &#039;&#039;Privacy Policy URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/gp/help/customer/display.html?nodeId=468496&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-21-alexa_-_alex_skills_kit_-_configuration.png|200px]] [[Datei:Developer.amazon.com-22-alexa_-_alex_skills_kit_-_test.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== Custom Skill anlegen =====&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Oben rechts &#039;&#039;Add a New Skill&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-18-alexa_-_alex_skills_kit_-_add_a_new_skill.png|200px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Auf der folgenden Seite (&#039;&#039;Skill Information&#039;&#039;) die nachstehenden Daten eingeben und dann mit &#039;&#039;Next&#039;&#039; bestätigen:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Skill Type&#039;&#039; -&amp;gt; &#039;&#039;Custom Interaction Model&#039;&#039; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Language&#039;&#039; -&amp;gt; &#039;&#039;German&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Name&#039;&#039; -&amp;gt; beliebiger Name, z.B. &amp;quot;MySmartHome Advanced&amp;quot;. Dieser wird in der Alexa App unter &amp;quot;Meine Skills&amp;quot; angezeigt.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Invocation Name&#039;&#039; -&amp;gt; Aufruf des Skills, unter dem dieser später gestartet wird. Z.B. &amp;quot;Alexa, starte James&amp;quot;&amp;lt;br /&amp;gt;[[Datei:CustomSkill_2.PNG|400px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Auf der Seite &#039;&#039;Interaction Model&#039;&#039; folgende Eingaben tätigen und mit &#039;&#039;Next&#039;&#039; abschließen&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In einem separaten Browserfenster FHEM aufrufen, und für das bereits definierte Alexa-Gerät das Kommando &amp;lt;code&amp;gt;get MyAlexa interactionModel&amp;lt;/code&amp;gt; aufrufen. Es erscheint ein Popup-Fenster mit ziemlich vielen Zeilen.&lt;br /&gt;
&amp;lt;li&amp;gt;In die Box &#039;&#039;Intent Schema&#039;&#039; kopiert man den ersten Teil dieser FHEM-Ausgabe hinein, also:&amp;lt;br/&amp;gt;&amp;lt;blockquote&amp;gt;&lt;br /&gt;
 { &lt;br /&gt;
   &amp;quot;intents&amp;quot; : [ &lt;br /&gt;
    &amp;lt;hier ziemlich viele Zeilen&amp;gt;  &lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Nun die &#039;&#039;Custom Slot Types&#039;&#039; einrichten. Dazu muss aus dem zweiten Teil der FHEM-Ausgabe jeweils der Slot-Type (z.B. &amp;lt;code&amp;gt;FHEM_article&amp;lt;/code&amp;gt;) in das Feld &#039;&#039;TYPE&#039;&#039; eingetragen werden, das nach dem Anklicken von &#039;&#039;Add Slot Type&#039;&#039; erscheint. In das darunter liegende größere Textfeld kommen die möglichen Werte für diesen Slot, so wie sie aus der FHEM-Ausgabe abzulesen sind. Dann mit &#039;&#039;Save&#039;&#039; sichern. Als Custom Slot Type erscheint dann für diesen Beispiel-Slot&lt;br /&gt;
 FHEM_article 	der | die | das | den&lt;br /&gt;
d.h., die Zeilenumbrüche bei den möglichen Werten werden als &amp;quot;|&amp;quot; dargestellt.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hier muss nun ein Bruch im Arbeitsfluss durchgeführt werden, denn bei der Erstellung des Custom Skills kommt es auf die Reihenfolge der Einträge an. Deshalb zunächst diese FHEM-Ausgabe schließen, und für dasselbe FHEM-Device &amp;lt;code&amp;gt;get MyAlexa customSlotTypes&amp;lt;/code&amp;gt; ausführen. Auch diese Ausgabe wird, wie oben beschriebeen, in Custom Slot Types eingetragen (erst der TYPE, dann die möglichen Werte)&lt;br /&gt;
&amp;lt;li&amp;gt;Anschließend erneut die FHEM-Ausgabe schließen und erneut  für das bereits definierte Alexa-Gerät das Kommando &amp;lt;code&amp;gt;get MyAlexa interactionModel&amp;lt;/code&amp;gt; aufrufen.&lt;br /&gt;
&amp;lt;li&amp;gt;Unter &#039;&#039;Sample Utterances&#039;&#039; nun den Text aus dem dritten Teil dieser FHEM-Ausgabe hineinkopieren&amp;lt;br /&amp;gt;[[Datei:CustomSkill_5.PNG|400px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Auf der Seite &#039;&#039;Configuration&#039;&#039; Folgendes eingeben und mit &#039;&#039;Next&#039;&#039; bestätigen:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Service Endpoint Type&#039;&#039; -&amp;gt; &#039;&#039;AWS Lambda&#039;&#039; auswählen&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Geographical Region&#039;&#039; -&amp;gt; &#039;&#039;Europe&#039;&#039; auswählen und im Textfeld den Wert aus Abschnitt [[#AWS_Lambda_Funktion_anlegen | AWS Lambda Funktion anlegen]] (Punkt 12) eintragen. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Do you allow users to create an account or link to an existing account with you?&#039;&#039; -&amp;gt; &#039;&#039;Yes&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Authorization URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/ap/oa&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Client ID&#039;&#039; -&amp;gt; &#039;&#039;Client ID&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Scope&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;profile:user_id&amp;lt;/code&amp;gt; (wörtlich 1:1 eintragen)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Redirect URLs&#039;&#039; - sollten vorbelegt sein&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Authorization Grant Type&#039;&#039; -&amp;gt; &#039;&#039;Auth Code Grant&#039;&#039; auswählen&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Access Token URI&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://api.amazon.com/auth/o2/token&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Client Secret&#039;&#039; -&amp;gt; &#039;&#039;Client Secret&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Client Authentication Scheme&#039;&#039; -&amp;gt; &#039;&#039;HTTP Basic&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Privacy Policy URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/gp/help/customer/display.html?nodeId=468496&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Beim Sichern dieser Seite mit &#039;&#039;Next&#039;&#039; kann es zu einer Fehlermeldung kommen, wenn man seine Skill-Definitionen mit dem einfachen SmartHome-Skill begonnen hat. Deshalb muss noch der entsprechende Trigger für die [[#AWS_Lambda-Funktion | AWS Lambda Funktion]] nachgetragen werden, dies wird in Abschnitt [[#Trigger_f.C3.BCr_Custom_Skill_hinzuf.C3.BCgen | Trigger für Custom Skill hinzufügen]] beschrieben.&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Datei:CustomSkill_6.PNG|400px]] [[Datei:CustomSkill_7.PNG|400px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Testen ====&lt;br /&gt;
Hat man den Custom Skill angelegt, bietet dieser auch eine komfortable Testmöglichkeit. Dazu wählt man in der Übersichtsseite &#039;&#039;All Skills&#039;&#039; den Button &#039;&#039;Edit&#039;&#039; des Alexa Custom Skill aus. Auf der nachfolgenden Seite dann links &#039;&#039;Test&#039;&#039;. &lt;br /&gt;
Die Testseite enthält &lt;br /&gt;
* ein Feld &#039;&#039;Voice Simulator&#039;&#039;, mit dem man die Sprachsausgabe testen kann, &lt;br /&gt;
* ein Feld &#039;&#039;Service Simulator&#039;&#039;, mit dem die Verarbeitung von Alexa-Kommandois getestet werden kann. Hier kann man z.B. eintragen&lt;br /&gt;
 &amp;quot;Alexa, sage &amp;lt;Custom Skill Invocation Name&amp;gt;: Stelle Weckzeit auf Neunzehn Siebenundzwanzig Uhr&amp;quot;&lt;br /&gt;
 &amp;quot;Alexa, frage &amp;lt;Custom Skill Invocation Name&amp;gt; nach dem Status von Weckzeit&amp;quot;&lt;br /&gt;
Dabei ist natürlich der &#039;&#039;Custom Skill Invocation Name&#039;&#039; durch den Wert zu ersetzen, den man im Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]] unter Punkt 2 eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
==== Skill Id bestimmen ====&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo die &#039;&#039;Alexa Skill Id&#039;&#039; zu finden ist}}&lt;br /&gt;
Für das [[#AWS_Lamba_Funktion_anlegen | Anlegen einer &#039;&#039;AWS Lambda Funktion&#039;&#039;]] bzw für die [[#Alexa-Fhem_konfigurieren | Konfiguration von Alexa-Fhem]] wird die &#039;&#039;Alexa Skill Id&#039;&#039; benötigt. An diese kommt man wie folgt:&lt;br /&gt;
# Anmelden wie unter [[#Alexa_Skills | Alexa Skills]] beschrieben.&lt;br /&gt;
# Menüpunkt &#039;&#039;ALEXA&#039;&#039; auswählen, wie [[#Skills_bearbeiten | Skills bearbeiten]] erklärt.&lt;br /&gt;
# Beim gewünschten Eintrag auf &#039;&#039;Edit&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-23-alexa_-_alex_skills_kit_-_overview.png|200px]]&lt;br /&gt;
# Die Id, die nun oben angezeigt wird, ist die gesuchte. Sie hat typischerweise das Format &amp;lt;code&amp;gt;amzn1.ask.skill.[Zahlen und Bindestriche]&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AWS Lambda Funktion ===&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://aws.amazon.com angemeldet sein&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-01-site.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-02-login.png|200px]]&lt;br /&gt;
# Den Punkt &#039;&#039;Lambda&#039;&#039; links auf der Startseite auswählen, bzw. im Menü &#039;&#039;Services&#039;&#039; unter &#039;&#039;Compute&#039;&#039; den Menüpunkt &#039;&#039;Lambda&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-03-lambda.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== AWS Lambda Funktion anlegen ====&lt;br /&gt;
# Für eine erste Lambda-Funktion den Punkt &#039;&#039;Get Started Now&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-04-get_started_now.png|200px]]&lt;br /&gt;
# Den Blueprint &#039;&#039;Blank function&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-05-select_blueprint.png|200px]]&lt;br /&gt;
# Im neuen Fenster dann auf den gestrichelten Kasten klicken und &#039;&#039;Alexa Smart Home&#039;&#039; auswählen und mit &#039;&#039;Next&#039;&#039; bestätigen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers1.png|200px]]&lt;br /&gt;
## Achtung, es ist möglich, dass dabei &#039;&#039;Alexa Smart Home&#039;&#039; überhaupt nicht angeboten wird. Dann bitte ganz rechts oben in der Ecke nachsehen, welche Region bzw. welches Land ausgewählt ist. Empfohlen wird, &#039;&#039;Ireland&#039;&#039; auszuwählen. Dann erscheint bei den Funktionen auch &#039;&#039;Alexa Smart Home&#039;&#039;.&lt;br /&gt;
# Bei &#039;&#039;Application Id&#039;&#039; den Wert eintragen, dessen Ermittlung im Abschnitt [[#Skill_Id_bestimmen | Skill Id bestimmen]] beschrieben wird, den Haken bei &#039;&#039;Enable trigger&#039;&#039; setzen und mit &#039;&#039;Next&#039;&#039; bestätigen &amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers3.png|200px]]&lt;br /&gt;
# Auf der Konfigurationsseite eingeben:&lt;br /&gt;
## &#039;&#039;Name&#039;&#039; -&amp;gt; &#039;&#039;FHEM&#039;&#039;&lt;br /&gt;
## &#039;&#039;Runtime&#039;&#039; -&amp;gt; Node.js 4.3. &lt;br /&gt;
## &#039;&#039;Role&#039;&#039; -&amp;gt; &#039;&#039;Choose an existing role&#039;&#039; &lt;br /&gt;
### Achtung: wenn es noch keine existing role gibt, zuerst &#039;&#039;Create a custom role&#039;&#039; -&amp;gt; in dem Popup dann &#039;&#039;lambda_basic_execution&#039;&#039; auswählen und auf &#039;&#039;Allow&#039;&#039; klicken sowie bei &#039;&#039;Existing role&#039;&#039; dann &#039;&#039;x&#039;&#039; wählen.&lt;br /&gt;
# Auf der Code-Seite ist im großen Textfeld dann der Code aus der Datei &#039;&#039;lambda.js&#039;&#039; im Paket [[#Alexa-Fhem_installieren | Alexa-Fhem]] vollständig einzufügen. Dabei muss der vorhandene Code im Texteil komplett gelöscht, der Teil aus der &#039;&#039;lamda.js&#039;&#039; eingefügt und noch der Hostname im Quellcode an den eigenen Hostnamen angepasst werden. &lt;br /&gt;
# Anschließend alles mit &#039;&#039;Next&#039;&#039; bestätigen.&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-07-configure_function.png|200px]]&lt;br /&gt;
# Auf der Übersichtsseite dann &#039;&#039;Create function&#039;&#039; anklicken&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-08-review.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Trigger für Custom Skill hinzufügen ====&lt;br /&gt;
Editiert man eine Lambda-Funktion, werden auf der Seite &#039;&#039;Triggers&#039;&#039; diejenigen Dienste angezeigt, die diese Funktion aufrufen.&lt;br /&gt;
* Hier taucht der Trigger &#039;&#039;Alexa Smart Home&#039;&#039; zusammen mit der &#039;&#039;Application Id&#039;&#039; auf, der bei der Einrichtung des SmartHome-Skills eingetragen wurde.&lt;br /&gt;
* Zur Verbindung mit dem Custom Skill ist es nötig, einen zweiten Trigger hinzuzufügen. Durch Anklicken von &#039;&#039;Add Trigger&#039;&#039; wird eine Auswahlseite eingeblendet. Im neuen Fenster dann auf den gestrichelten Kasten klicken und &#039;&#039;Alexa Skills Kit&#039; auswählen und mit &#039;&#039;Next&#039;&#039; bestätigen&lt;br /&gt;
&lt;br /&gt;
==== ARN der AWS Lambda Funktion bestimmen ====&lt;br /&gt;
# Auf der Übersichtsseite oben links den Menüpunkt &#039;&#039;Functions&#039;&#039; aúswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-09-go_overview.png|200px]]&lt;br /&gt;
# Anschließend den Radiobutton der angelegten Funktion &#039;&#039;FHEM&#039;&#039; markieren und im Menü &#039;&#039;Action&#039;&#039; den Punkt &#039;&#039;Show ARN&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-10-1-show_arn.png|200px]]&lt;br /&gt;
# Es wird nun eine ARN Adresse angezeigt, die für den Abschnitt [[#SmartHome_Skill_anlegen| SmartHome Skill anlegen]] benötigt wird&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-10-2-arn.png|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Absichern des Zugriffs ===&lt;br /&gt;
Natürlich muss der Zugriff auf den von Alexa-Fhem verwendeten Port (default: 3000, Bestandteil des Codes in der AWS Lambda-Funktion) durch die Firewall freigeschaltet werden (auf einer FritzBox unter &amp;quot;Portfreigaben&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==== Absicherung direkt in Alexa-FHEM ====&lt;br /&gt;
Die Kommunikation zwischen Amazon AWS und Alexa-FHEM ist auf die folgenden Arten gesichert:&lt;br /&gt;
* Die Verbindung erfolgt per HTTPS&lt;br /&gt;
* Es werden nur Verbindung angenommen auf denen ein gültiges Alexa-Event gesendet wird. &lt;br /&gt;
* Es werden nur Verbindungen angenommen die ein gültiges und noch nicht abgelaufenes OAuth-Token enthalten. Jedes neue Token wird live bei Amazon auf Gültigkeit geprüft.    &lt;br /&gt;
* Es werden nur Verbindungen mit lokal konfigurierter Skill-ID angenommen.&lt;br /&gt;
* Es ist nicht möglich von außen beliebige FHEM Kommandos zu senden. Die FHEM Kommandos werden nur lokal erzeugt.&lt;br /&gt;
&lt;br /&gt;
Wer möchte kann Alexa-FHEM natürlich noch weiter absichern. Es gilt aber, dass nicht jedes zusätzliche Glied in der Kette die Sicherheit sondern unter Umständen nur die Angriffsfläche erhöht. Ein falsch konfigurierter und nach aussen offener Apache (oder anderer ReverseProxy) ist unter Umständen ein größeres Risiko als Alexa-FHEM alleine.&lt;br /&gt;
&lt;br /&gt;
==== Absicherung per ReverseProxy ====&lt;br /&gt;
&amp;lt;s&amp;gt;Die Kommunikation zwischen Amazon und FHEM ist wegen der Verwendung von SSL schon verschlüsselt - prinzipiell kann aber jeder von außen mit Alexa-Fhem kommunizieren. Man sollte sich deshalb im Klaren darüber sein, dass dies eine Sicherheitslücke darstellt:&amp;lt;/s&amp;gt; Jeder offene Port verleitet zu Angriffen, und mit zunehmender Verbreitung von Alexa steigt auch das Risiko. Es wird deshalb empfohlen, vor den eigentlichen Alexa-Server zur Absicherung einen Apache-Webserver als ReverseProxy zu setzen. Nicht nur ist der Apache eine hervorragend stabile und seit Jahrzehnten getestete Software, sondern die Konfiguration als ReverseProxy erlaubt auch, den Zugriff auf den Alexa-Fhem-Rechner auf die Amazon-Maschinen zu beschränken.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung: Dies ist keine allgemeine Anleitung in Sachen Computersicherheit.&#039;&#039;&#039; Im Folgenden gehen wir davon aus, dass &lt;br /&gt;
* Grundbegriffe wie Firewall, IP-Ports, SSL und Dynamic DNS vertraut sind&lt;br /&gt;
* Ein Apache Webserver (idealerweise auf einer zweiten Maschine) bereits installiert ist und die Konfiguration verstanden wurde (wenn nicht: Es gibt im Netz &#039;&#039;tausende&#039;&#039; von Anleitungen dafür...)&lt;br /&gt;
* Ein Servername von einem DynDNS-Anbieter - sagen wir &#039;&#039;myhome.is-my-castle.com&#039;&#039; - bereits von &#039;&#039;außen&#039;&#039; auf unser SmartHome zeigt.&lt;br /&gt;
* Alexa-Fhem in einer der oben beschriebenen Basiskonfigurationen läuft, d.h. der Zugriff auf &amp;lt;code&amp;gt;https://myhome.is-my-castle.com:3000&amp;lt;/code&amp;gt; ergibt, wie im Punkt [[#Alexa-Fhem_testen|Alexa-Fhem testen]] beschrieben, eine Antwort des Node.js Servers.&lt;br /&gt;
&lt;br /&gt;
Als erster Schritt zur Absicherung muss das ReverseProxy Modul für den Apache installiert und mit &amp;lt;code&amp;gt;a2enmod&amp;lt;/code&amp;gt; aktiviert werden, hierzu sei auf [https://www.digitalocean.com/community/tutorials/how-to-use-apache-http-server-as-reverse-proxy-using-mod_proxy-extension diese Anleitung] verwiesen. Der zweite Schritt besteht darin, den SSL-Zugriff durch ein Passwort abzusichern. Dazu wird auf dem Apache-Rechner das Programm &lt;br /&gt;
 htpasswd &amp;lt;passwdfile&amp;gt; &amp;lt;username&amp;gt;&lt;br /&gt;
ausgeführt, das Programm fragt dann nach dem gewünschten Passwort. Wir nehmen im Folgenden an, dass das Passwortfile &#039;&#039;/etc/apache2/htpasswd&#039;&#039; ist, der gesetzte Username &#039;&#039;alexa&#039;&#039; lautet und das Passwort &#039;&#039;my_smarthome&#039;&#039; ist.&lt;br /&gt;
&lt;br /&gt;
Im dritten Schritt wird nun in das Apache-Konfigurationsfile die Weiterleitung auf den eigentlichen Alexa-Fhem-Rechner eingetragen. Dazu wählen wir, dass von außen der Standard-SSL-Port 443 benutzt werden soll, sowie als Verzeichnisname &#039;&#039;/alexa&#039;&#039;. &#039;&#039;&#039;Achtung:&#039;&#039;&#039; Dieser Code soll &#039;&#039;&#039;nicht&#039;&#039;&#039; in die Default-Konfiguration des Apache-Webservers. Sondern in eine separate Datei (Dateiname z.B. &amp;quot;fhem&amp;quot;), die ins Unterverzeichnis /etc/apache2/conf.d gestellt wird.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
  ServerName myhome.is-my-castle.com&lt;br /&gt;
  SSLEngine on&lt;br /&gt;
  SSLProxyEngine on&lt;br /&gt;
  SSLProxyCheckPeerCN off&lt;br /&gt;
  SSLProxyCheckPeerName off&lt;br /&gt;
  SSLCertificateKeyFile /etc/apache2/mycert/server.key&lt;br /&gt;
  SSLCertificateFile /etc/apache2/mycert/server.crt&lt;br /&gt;
 &amp;lt;Location /alexa&amp;gt;&lt;br /&gt;
  AuthType Basic&lt;br /&gt;
  AuthName &amp;quot;Authentication Required&amp;quot;&lt;br /&gt;
  AuthUserFile &amp;quot;/etc/apache2/htpasswd&amp;quot;&lt;br /&gt;
  Require valid-user&lt;br /&gt;
  ProxyPass https://&amp;lt;hier IP-Adresse des Alexa-Fhem-Rechners&amp;gt;:3000/&lt;br /&gt;
  ProxyPassReverse https://&amp;lt;hier IP-Adresse des Alexa-Fhem-Rechners&amp;gt;:3000/&lt;br /&gt;
  Order deny,allow&lt;br /&gt;
  Allow from All&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 (... Hier eventuell weitere Umleitungen)&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
Nach einem Neustart des Apache-Servers, dem Schließen des Ports 3000 in der Firewall sowie dem Öffnen des Ports 443 ist der Alexa-Fhem-Rechner von außen nur noch erreichbar durch den Aufruf von &amp;lt;code&amp;gt;https://myhome.is-my-castle.com/alexa&amp;lt;/code&amp;gt; und verlangt unmittelbar die Eingabe von Username und Passwort.&lt;br /&gt;
&lt;br /&gt;
Der vierte Schritt ist nun, den Code der AWS Lambda-Funktion an fünf Stellen zu verändern&lt;br /&gt;
 &#039;&#039;&#039;const PORT=443;&#039;&#039;&#039;&lt;br /&gt;
 const HOST=&#039;myhome.is-my-castle.com&#039;;&lt;br /&gt;
 &#039;&#039;&#039;const PATH=&#039;/alexa&#039;;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;const AUTH=&#039;alexa:my_smarthome&#039;;&#039;&#039;&#039;&lt;br /&gt;
 // entry&lt;br /&gt;
 exports.handler = function(event, context, callback) {&lt;br /&gt;
  console.log(`EVENT: ${event}`);&lt;br /&gt;
  console.log(`CONTEXT: ${context}`);  &lt;br /&gt;
  var post_data = JSON.stringify(event);&lt;br /&gt;
  var options = {&lt;br /&gt;
    hostname: HOST,&lt;br /&gt;
    port: PORT,&lt;br /&gt;
    //family: 6,&lt;br /&gt;
    &#039;&#039;&#039;path: PATH,&#039;&#039;&#039;&lt;br /&gt;
    method: &#039;POST&#039;,&lt;br /&gt;
    &#039;&#039;&#039;auth: AUTH,&#039;&#039;&#039;&lt;br /&gt;
    rejectUnauthorized: false, // accept self-signed&lt;br /&gt;
 (etc., Rest des Codes wie gehabt)&lt;br /&gt;
Natürlich muss der Zugriff getestet werden. Bei Beachtung aller dieser Schritte werden alle un-autorisierten Zugriffe von außen abgewehrt. Eine noch weiter gehende Sicherung ist möglich, dazu kann in der Serverkonfiguration der Zugriff auf die Amazon-Domains beschränkt werden. Das ganze Alexa-System ist aber noch in konstanter Weiterentwicklung, diese Domain-Namen können sich also noch ändern.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung in der Alexa App==&lt;br /&gt;
Nachdem die Alexa Skills angelegt wurden, müssen diese noch in der Alexa App eingerichtet werden.&lt;br /&gt;
Dafür jeweils per Desktop-Browser auf [http://alexa.amazon.de alexa.amazon.de] anmelden, nicht die App unter iOS oder Android verwenden. Diese hat Probleme mit der OAuth Verknüpfung.&lt;br /&gt;
&lt;br /&gt;
=== Alexa Skill ===&lt;br /&gt;
# Auf &#039;&#039;Skills&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-01-startseite.png|200px]]&lt;br /&gt;
# Oben rechts &#039;&#039;Meine Skills&#039;&#039;  bzw. &#039;&#039;Ihre Skills&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-03-meine_skills.png|200px]]&lt;br /&gt;
# In der Liste der Skills sollte das angelegte FHEM Skill angezeigt werden. Dieses anklicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-02-liste_skills.png|200px]]&lt;br /&gt;
# Oben Rechts in den Details des Skills auf &#039;&#039;Skill aktivieren&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-04-skill_details.png|200px]]&lt;br /&gt;
# In dem neu geöffneten Fenster die Autorisierung bestätigen&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-05-amazon_auth.png|200px]]&lt;br /&gt;
# Anschließend sollte die Verbindung erfolgreich aufgebaut worden sein &amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-06-success.png|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Geräte ===&lt;br /&gt;
# Auf http://alexa.amazon.de anmelden&lt;br /&gt;
# Auf &#039;&#039;Smart Home&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-01-startseite.png|200px]]&lt;br /&gt;
# Anschließend den Punkt &#039;&#039;Geräte suchen&#039;&#039; anklicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-07-Gerätesuche.png|200px]]&lt;br /&gt;
# Wurde soweit alles korrekt eingerichtet, werden nun die gefundenen Geräte angezeigt.&lt;br /&gt;
&lt;br /&gt;
Tip: Es macht Sinn, unter &#039;&#039;Meine Gruppen&#039;&#039; Gruppen benannt nach den Räumen einzurichten. Hierdurch kann Alexa die Geräte besser auseinander halten, vor allem wenn die den gleichen Alias (z.B. &amp;quot;Licht&amp;quot;) haben.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung unter FHEM ==&lt;br /&gt;
Im Folgenden werden exemplarisch ein paar Geräte beschrieben, die man nutzbringend mit FHEM einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Custom Skills übersetzt die Kombination der Attribute &#039;&#039;alexaMapping&#039;&#039; und &#039;&#039;homebridgeMapping&#039;&#039; Sprachbefehle (&amp;quot;Intents&amp;quot;) in gerätespezifische Kommandos. &lt;br /&gt;
* Das Attribut alexaMapping wird am Alexa-Device gesetzt und dient dazu, erkannte Sprachkommandos in abstrakte Characteristiken zu überführen. Für den einfacheren SmartHome Skill hat darum das Attribut &#039;&#039;alexaMapping&#039;&#039; keine Bedeutung, sondern nur der &#039;&#039;genericDeviceType&#039;&#039; des zu steuernden Gerätes.&lt;br /&gt;
* Das Attribut homebridgeMapping wird für beide Skills am zu steuernden Gerät gesetzt und übersetzt diese Charakteristiken in die konkreten Befehle, die das Gerät versteht. Der inhalt des Attributs wird von links nach rechts ausgewertet und ist wie folgt aufgebaut:&lt;br /&gt;
** Das Attribut enthält eine durch Leerzeichen getrennte Liste aus Konfigurationen für jeweils eine Characteristik&lt;br /&gt;
** Jede einzelne der Characteristik-Konfigurationen besteht aus dem Namen der Characteristik, gefolgt von &amp;quot;=&amp;quot; und einer kommaseparierten Liste von Parametern.&lt;br /&gt;
  attr &amp;lt;device&amp;gt; homebridgeMapping &amp;lt;Characteristic1&amp;gt;=&amp;lt;param1.1&amp;gt;,&amp;lt;param1.2&amp;gt;,... &amp;lt;Characteristic2&amp;gt;=&amp;lt;param2.1&amp;gt;,&amp;lt;param2.2&amp;gt;,...&lt;br /&gt;
** Jeder Parameter besteht entweder aus&lt;br /&gt;
*** &amp;lt;code&amp;gt;&amp;lt;cmd&amp;gt;:&amp;lt;device&amp;gt;:&amp;lt;reading&amp;gt;&amp;lt;/code&amp;gt;, hier können nicht verwendete Elemente von links nach rechts weg gelassen werden.&lt;br /&gt;
*** &amp;lt;code&amp;gt;&amp;lt;name&amp;gt;=&amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;, hier kann &amp;lt;code&amp;gt;&amp;lt;value&amp;gt;&amp;lt;/code&amp;gt; entweder ein Wert oder semikolonseparierte Liste sein.&lt;br /&gt;
*** Oder dem schlüsselwort &amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt;, welches alle vorhandenen (default) Parameter dieser Characteristik löscht. &amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt; kann auch an Stelle einer ganzen Characteristik-Konfiguration stehen&lt;br /&gt;
Weiter führende Dokumentation zum homebridgeMapping findet sich unter https://forum.fhem.de/index.php/topic,48558.0.html&lt;br /&gt;
&lt;br /&gt;
=== Einfacher Schalter ===&lt;br /&gt;
* Ein einfacher Schalter, der die set-Kommandos &#039;&#039;on&#039;&#039; und &#039;&#039;off&#039;&#039; kennt, kann direkt mit Alexa-Fhem gekoppelt werden &lt;br /&gt;
* Für kompliziertere Aktionen, etwa das Übermitteln eines spezifischen Schaltbefehls an FHEM, ist die Einrichtung eines Dummies zu empfehlen. &lt;br /&gt;
Ob Dummy oder nicht, wichtig sind die drei fett gedruckten Zeilen&lt;br /&gt;
 define Alexa.Party dummy&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party alexaName party&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party genericDeviceType switch&#039;&#039;&#039;&lt;br /&gt;
 attr Alexa.Party group AlexaGeräte&lt;br /&gt;
 attr Alexa.Party room AlexaRoom&lt;br /&gt;
 attr Alexa.Party setList on off&lt;br /&gt;
Selbstverständlich kann man diesen Dummy mit einem notify oder DOIF abfangen, um die gewünschte Schaltaktion auszuführen. &lt;br /&gt;
&lt;br /&gt;
Ein Alternative zum Dummy ist das Anlegen eines readingsProxy, dem die entsprechenden Attribute gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Weil es sich hierbei um eines der einfachen Geräte handelt, die Alexa selbst im SmartHome Skill bearbeiten kann, ist auch der zweite Schritt bei der Einrichtung in der Alexa App sinnvoll: Der Schalter wird dann im Bereich Smart Home der Alexa App erkannt. Wer ihn auch mit dem Custon Skill bedienen möchte, muss natürlich Sorge tragen, dass der Alexa-Name &#039;&#039;party&#039;&#039; bei den FHEM_Devices auftaucht und die entsprechenden weiteren Slot Types und Example Utterances in der Konfiguration des Custom Skills vorhanden sind (siehe Abschnitt [[##Custom_Skill_anlegen | Custom Skill Anlegen]]).&lt;br /&gt;
&lt;br /&gt;
=== Wecker ===&lt;br /&gt;
Dieses Gerät kann man nur mit dem Custom Skill bedienen, es wird also &#039;&#039;&#039;nicht&#039;&#039;&#039; im Bereich Smart Home der Alexa App auftauchen. Wir richten einen Dummy ein, wichtig sind wieder die fett gedruckten Zeilen:&lt;br /&gt;
 define Alexa.Weckzeit dummy&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit alexaName weckzeit&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 attr Alexa.Weckzeit genericDeviceType clock&lt;br /&gt;
 attr Alexa.Weckzeit group AlexaGeräte&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit homebridgeMapping Weckzeit=state,cmd=+&#039;&#039;&#039;&lt;br /&gt;
 attr Alexa.Weckzeit room AlexaRoom&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit setList Weckzeit:time&#039;&#039;&#039;&lt;br /&gt;
Das Attribut &#039;&#039;genericDeviceTye&#039;&#039; ist nicht wichtig, weil es ein generisches Device dieser Art gar nicht gibt. Wichtig hingegen ist das Attribut &#039;&#039;homebridgeMapping&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Für das Gerät &#039;&#039;MyAlexa&#039;&#039;, das in Abschnitt definiert wurde, muss im Attribut &#039;&#039;alexaMapping&#039;&#039; auftauchen&lt;br /&gt;
 Weckzeit=verb=stelle,valuePrefix=für;auf,values=AMAZON.TIME,valueSuffix=uhr&lt;br /&gt;
Darüber hinaus muss der Alexa-Name &#039;&#039;weckzeit&#039;&#039; bei den FHEM_Devices auftauchen und die entsprechenden weiteren Slot Types und Example Utterances in der Konfiguration des Custom Skills vorhanden sein (siehe Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]]).&lt;br /&gt;
&lt;br /&gt;
Der Aufruf dieses Gerätes mit Alexa erfolgt dann z.B. mit den Sätzen&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;Alexa, sage &amp;lt;Custom Skill Invocation Name&amp;gt;: Stelle Weckzeit auf Neunzehn Uhr Siebenundzwanzig&amp;quot;&lt;br /&gt;
&amp;quot;Alexa, frage &amp;lt;Custom Skill Invocation Name&amp;gt; nach dem Status von Weckzeit&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dabei ist natürlich der &#039;&#039;Custom Skill Invocation Name&#039;&#039; durch den Wert zu ersetzen, den man im Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]] unter Punkt 2 eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
Zur weiteren Bearbeitung kann man jetzt mit einem DOIF Statusänderungen des Dummies abfangen und durch eine kleine Helperfunktion ins &amp;quot;echte&amp;quot; FHEM weiterleiten.&lt;br /&gt;
  define Alexa.Weckzeit.N DOIF ([&amp;quot;Alexa.Weckzeit:.*&amp;quot;])({AlexaHelper(&amp;quot;Alexa.Weckzeit&amp;quot;,&amp;quot;$EVENT&amp;quot;)}) &lt;br /&gt;
Die Helperfunktion (z.B. in 99_myUtils.pm) stellt aus der übergebenen Zeit (immer im Format dd:mm) eine sprachkompatible Nachricht $nc und einen mit den FHEM-Zeitangaben kompatiblen String $nt zusammen und reicht beide an eine Routine &#039;&#039;changeWakeTime&#039;&#039; weiter (dokumentiert in den [https://www.dpunkt.de/buecher/12387/9783960090120-smarthome-hacks.html Smart Home Hacks]).&lt;br /&gt;
 sub AlexaHelper($$){&lt;br /&gt;
  my ($name,$event)=@_;&lt;br /&gt;
  if( $name eq &amp;quot;Alexa.Weckzeit&amp;quot; ){ &lt;br /&gt;
    my ($nc,$nt);&lt;br /&gt;
    #-- volle Stunde----------------------------------------&lt;br /&gt;
    if( $event =~ /(\d+):00/ ){&lt;br /&gt;
      $nc=sprintf(&amp;quot;%d Uhr&amp;quot;,$1);&lt;br /&gt;
      $nt=sprintf(&amp;quot;%02d:00:00&amp;quot;,$1);&lt;br /&gt;
    #-- nicht volle Stunde---------------------------------&lt;br /&gt;
    }elsif( $event =~ /(\d+):(\d+)/ ){&lt;br /&gt;
      $nc=sprintf(&amp;quot;%d Uhr %d&amp;quot;,$1,$2);&lt;br /&gt;
      $nt=sprintf(&amp;quot;%02d:%02d:00&amp;quot;,$1,$2);&lt;br /&gt;
    }&lt;br /&gt;
    changeWakeTime(\&#039;GalaxyTab.EG\&#039;,\&#039;$nc\&#039;,\&#039;$nt\&#039;);&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lichtszene ===&lt;br /&gt;
Eine Lichtszene wird mit dem Modul LightScene angelegt. Wir gehen davon aus, dass in der Lichtszene die beiden Szenen Alle_An und Alle_Aus, sowie mindestens eine weitere Szene (hier: Sitzgruppe) definiert wurde.&lt;br /&gt;
* Nachfolgend wird ein Beispiel beschrieben, wie man eine Lichtszene mit dem einfachen SmartHome Skill steuern kann. Die verwendeten Kommandos sind dann&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;Alexa, schalte (die) Beleuchtung an&amp;quot; -&amp;gt; LightScene Alle_An wird ausgewählt&lt;br /&gt;
&amp;quot;Alexa, schalte (die) Beleuchtungsitzgruppe an&amp;quot; -&amp;gt; LightScene Sitzgruppe wird ausgewählt&lt;br /&gt;
...&lt;br /&gt;
&amp;quot;Alexa, schalte (die) Beleuchtung aus&amp;quot; -&amp;gt; LightScene Alle_Aus wird ausgewählt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Künftig wird man LightScene mit dem Custom Skill eventuell direkt steuern können - allerdings hat das einen geringeren WAF, als die Steuerung über den SmartHome Skill: Der Einschaltsatz muss dann mindestens lauten&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;Alexa, sage &amp;lt;Custom Skill Invocation Name&amp;gt;: schalte (die) Beleuchtung an&amp;quot; -&amp;gt; LightScene Alle_An wird ausgewählt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dafür wird es aber auch möglich sein direkt die SzenenNamen im gesprochenen Kommando zu verwenden und so auf die Umwege über dummys und ähnliches zu verzichten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im ersten Schritt wird ein Dummy für die Gesamtbeleuchtung eingerichtet:&lt;br /&gt;
 define Alexa.Beleuchtung dummy &lt;br /&gt;
 attr Beleuchtung setList on off&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung alexaName beleuchtung&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung genericDeviceType switch&#039;&#039;&#039;&lt;br /&gt;
Anschließend wird für jede vorhandene Lichtszene (außer Alle_An und Alle_Aus) ein weiterer Dummy angelegt:&lt;br /&gt;
 define Alexa.Beleuchtung.Sitzgruppe dummy &lt;br /&gt;
 attr Beleuchtung setList on off&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung.Sitzgruppe alexaName beleuchtungsitzgruppe&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung.Sitzgruppe alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung.Sitzgruppe genericDeviceType switch&#039;&#039;&#039; &lt;br /&gt;
Die eigentliche Steuerung übernimmt dann ein DOIF&lt;br /&gt;
 define Alexa.Beleuchtung.N DOIF&lt;br /&gt;
 ([&amp;quot;Alexa.Beleuchtung.Sitzgruppe:on&amp;quot;])&lt;br /&gt;
 (set &amp;lt;devicename der Lichtszene&amp;gt; scene Sitzgruppe,&lt;br /&gt;
  set Alexa.Beleuchtung off,&lt;br /&gt;
   ...&amp;lt;weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet&amp;gt;&lt;br /&gt;
 )&lt;br /&gt;
 DOELSIF&lt;br /&gt;
 ... &amp;lt;weitere on-Events der anderen Szenen werden abgefangen&amp;gt;&lt;br /&gt;
 DOELSEIF&lt;br /&gt;
 ([&amp;quot;Alexa.Beleuchtung:on&amp;quot;])&lt;br /&gt;
 (set &amp;lt;devicename der Lichtszene&amp;gt; scene Alle_An,&lt;br /&gt;
  set Alexa.Beleuchtung.Sitzgruppe off,&lt;br /&gt;
  ...&amp;lt;weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet&amp;gt;&lt;br /&gt;
 )&lt;br /&gt;
 DOELSEIF&lt;br /&gt;
 ([&amp;quot;Alexa.Beleuchtung:off&amp;quot;])&lt;br /&gt;
 (set &amp;lt;devicename der Lichtszene&amp;gt; scene Alle_Aus,&lt;br /&gt;
  set Alexa.Beleuchtung.Sitzgruppe off,&lt;br /&gt;
  ...&amp;lt;weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet&amp;gt;&lt;br /&gt;
 )&lt;br /&gt;
Mit diesem DOIF wird ein Radiobutton simuliert, d.h. wie bei den Stationstasten vor Uralt-Radios sorgt die Auswahl einer Szene immer dafür, dass alle anderen Dummies ausgeschaltet werden.&lt;br /&gt;
Natürlich kann man das auch mit einem kleinen Perl-Programm erreichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zwei andere Ansätze Lichtszenen zu schalten die ohne DOIF auskommen sind im Folgenden beschrieben:&lt;br /&gt;
&lt;br /&gt;
* Wenn es von Interesse ist die Steuerung mit einer Darstellung in FTUI zu verbinden: Statt der oben beschriebenen dummy Devices kann man readingsProxy Devices mit passenden setFn und valueFn analog zum  [[Harmony#Button_f.C3.BCr_eine_bestimmte_Activity_im_Frontend_und_Homekit_.C3.BCber_readingsProxy|diesem Beispiel für harmony aktivitäten]] verwenden.&lt;br /&gt;
&lt;br /&gt;
* Für jede zu schaltende Szene wird ein dummy angelegt dessen homebridgeMapping direkt auf das LightScene Device zeigt:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;dummy&amp;gt; dummy&lt;br /&gt;
 attr &amp;lt;dummy&amp;gt; setList on off&lt;br /&gt;
 attr &amp;lt;dummy&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;dummy&amp;gt; homebridgeMapping On=&amp;lt;light scene&amp;gt;::state,valueOn=&amp;lt;szene&amp;gt;,cmdOn=scene+&amp;lt;szene&amp;gt;,cmdOff=scene+&amp;lt;szene aus&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der zweiten Variante wird davon ausgegangen das der aktuelle status nicht abgefragt oder angezeigt werden soll. Deshalb gibt es keine direkte RadioButton Funktionalität.&lt;br /&gt;
&lt;br /&gt;
=== Harmony Hub ===&lt;br /&gt;
Ein [https://forum.fhem.de/index.php/topic,60244.msg550298.html#msg550298 HowTo-Beitrag im Forum] beschreibt die Ansteuerung von Harmony-Aktionen über den Custom Skill, beispielsweise für eine Aktion &#039;&#039;ARD&#039;&#039;: „Alexa, sage FHEM stelle Anlage auf ARD“.&lt;br /&gt;
&lt;br /&gt;
== Nutzung ==&lt;br /&gt;
Um den Namen zu bestimmen, unter dem ein Gerät mit Alexa angesprochen wird, verwendet Alexa-Fhem mit absteigender Priorität:&lt;br /&gt;
* das alexaName Attribut&lt;br /&gt;
* das alias Attribut&lt;br /&gt;
* das NAME Internal&lt;br /&gt;
Damit Alexa ein Gerät eindeutig identifizieren kann, sollten eindeutige Gerätenamen verwendet werden, bestehed möglichst aus einem Wort und ohne Ziffern. Wenn Alexa einen Namen nicht versteht, kann man unter [http://alexa.amazon.de/spa/index.html] nachsehen was tatsächlich verstanden wurde und den Gerätenamen ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
=== SmartHome Skill ===&lt;br /&gt;
Gruppen (Räume) müssen in der Alexa App konfiguriert werden. Über das API lassen sich nur der Name und die Schalteigenschaften übergeben.&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreicher Einrichtung des SmartHome Skills sollte Alexa mit den folgenden Befehlen nutzbar sein:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
“alexa, schalte &amp;lt;gerät/gruppe&amp;gt; ein”&lt;br /&gt;
“alexa, schalte &amp;lt;gerät/gruppe&amp;gt; aus”&lt;br /&gt;
“alexa, stelle &amp;lt;gerät/gruppe&amp;gt; auf &amp;lt;wert&amp;gt; prozent”&lt;br /&gt;
“alexa, stelle &amp;lt;gerät/gruppe&amp;gt; auf &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
“alexa, erhöhe &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; prozent”&lt;br /&gt;
“alexa, reduziere &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; prozent”&lt;br /&gt;
“alexa, erhöhe &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
“alexa, reduziere &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom Skill ===&lt;br /&gt;
Der Custom Skill erlaubt im Gegensatz zum SmartHome Skill eine weitreichende Konfiguration der möglichen Kommandos. Die Dokumentation ist aktuell noch über diverse Artikel im Wiki verstreut:&lt;br /&gt;
&lt;br /&gt;
*Das Prinzip der Kommandokonfiguration ist {{Link2Forum|Topic=60244|Message=532513|LinkText=hier}} beschrieben.&lt;br /&gt;
*Die erste Umsetzung ist {{Link2Forum|Topic=60244|Message=540117|LinkText=hier}} beschrieben.&lt;br /&gt;
*Mehr zu FHEM-Intents und deren Möglichkeiten gibt es {{Link2Forum|Topic=67490|Message=589378|LinkText=hier}}.&lt;br /&gt;
*Wie man die Alexa TTS-Engine bei den Antworten auf FHEM-Intents beeinflussen kann {{Link2Forum|Topic=77421|Message=693631|LinkText=hier}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO: Abfragen, Attribute (alexaMapping, alexaTypes, fhemIntents, articles, prepositions), alles hier sammeln.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
====Allgemeiner Hinweis====&lt;br /&gt;
Besonders wichtig ist, dass man sich sehr genau an diese Anleitung hält. Ein häufiger Fehler ist, dass die einfachen Anführungszeichen in der Anleitung unter &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; Punkt 8 einfach weggelassen werden. Diese sind zwingend notwendig. Es darf auch nur der reine Hostname eingetragen werden. Also kein &#039;&#039;http://&#039;&#039; davor. Entweder eine feste IP Adresse oder den Hostnamen, um den Rechner zu erreichen, den ihr über den Port 3000 freigegeben habt. Das sollte dann so aussehen:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
const PORT=3000;&lt;br /&gt;
const HOST=&#039;mein.host.name&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Freigabe von Port 3000====&lt;br /&gt;
{{Randnotiz|RNTyp=Fehl|RNText=Derzeit müsst ihr über einen echten IPv4 Anschluss verfügen, damit der Amazon Lambda-Server euch erreichen kann. DS-Lite Anschlüsse wie die von &amp;lt;b&amp;gt;UnityMedia&amp;lt;/b&amp;gt; z.B. funktionieren derzeit leider nicht. Eine möglicher &amp;quot;Workaround&amp;quot; wird hier beschrieben: https://forum.fhem.de/index.php/topic,60244.msg518276.html#msg518276}}&lt;br /&gt;
&lt;br /&gt;
Auf dem Router muss der Port 3000 Protokoll TCP freigegeben werden. D.h. von außen muss man wenn man den Port 3000 aufruft, auf dem intern laufenden node.js Alexa-Dienst zugreifen können.&lt;br /&gt;
Je nach Router gestaltet sich das Portforwarding bzw. die Portumleitung etwas schwieriger.&lt;br /&gt;
&lt;br /&gt;
Bei einem Speedport Router der Telekom beispielsweise, muss der Router komplett neu gestartet werden, wenn die Portfreigabe eingerichtet wurde. &lt;br /&gt;
&lt;br /&gt;
Bei der Fritz!Box ist das nicht nötig, bei dieser finden die Freigabe unter &#039;&#039;Internet -&amp;gt; Freigaben -&amp;gt; Portfreigaben&#039;&#039; statt. Dort wählt man dann den Rechner aus und richtet eine neue Freigabe ein. Wichtig hierbei ist, dass man Portfreigabe auswählt und nicht MyFRITZ!-Freigabe. Bei Port von bis trägt man 3000 ein, bei Port extern ebenfalls.&lt;br /&gt;
&lt;br /&gt;
Um die Portweiterleitung zu testen, solltet ihr euch auch nicht im gleichen Netz befinden. Viele Router blockieren den Netzaufruf aus dem gleichen Netz. Am besten testet ihr es, wenn ihr an eurem Mobiltelefon W-LAN deaktiviert und im Browser folgende Seite aufruft: &#039;&#039;https://mein.hostname:3000&#039;&#039;. Wenn ihr im Browser dann einen Quellcode von Alexa seht, funktioniert die Portumleitung.&lt;br /&gt;
&lt;br /&gt;
Wenn bis hier alles funktioniert und es läuft dennoch nicht rund, liegt das Problem woanders. Kommt z.B. bei der Gerätesuche kein Request rein (sichtbar auf dem Bildschirm, wenn bin/alexa gestartet wurden), kann evtl. der Lambda-Dienst falsch konfiguriert sein.&lt;br /&gt;
&lt;br /&gt;
====Probleme mit node.js - npm install====&lt;br /&gt;
&lt;br /&gt;
Falls eine Fehlermeldung auftritt, dass &amp;quot;npm&amp;quot; nicht gefunden werden kann, bitte NodeJS entsprechend der Anleitung im Homebridge-Artikel vorgehen: [[Homebridge_einrichten#NodeJS_installieren|NodeJS installieren]] sowie [[Homebridge_einrichten#Python.2C_g.2B.2B.2C_MDNS_installieren|Python, g++, MDNS installieren]], siehe auch folgenden Abschnitt.&lt;br /&gt;
&lt;br /&gt;
====Es kommen diverse Fehlermeldungen beim Starten von alexa-fhem und es beendet sich====&lt;br /&gt;
Wenn man auf der Konsole angemeldet ist, den Befehl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;node -v&amp;lt;/syntaxhighlight&amp;gt;eingeben. Ist die Version niedriger als die geforderte 0.12, muss eine neuere installiert werden. Hier darf man dann im Wiki unter [[Homebridge_einrichten#NodeJS_installieren]] nachschauen. NodeJS V4 sollte hierbei schon ausreichen. Solange die node.js Version nicht passt, gar nicht groß rum experimentieren! Bitte beachtet, dass alle Voraussetzungen unter [[Alexa-Fhem#Voraussetzungen]] erfüllt sind! Keine Experimente mit Versionen die darunter liegen.&lt;br /&gt;
&lt;br /&gt;
====Fehlermeldung &#039;&#039;NAT-PMP failed: Error: timeout&#039;&#039; Fehler angezeigt beim Start von alexa-fhem====&lt;br /&gt;
Wenn ihr dann alexa-fhem über die Konsole startet und bekommt folgenden Fehler: &#039;&#039;NAT-PMP failed: Error: timeout&#039;&#039;, lasst euch davon nicht irritieren. Das bedeutet lediglich, dass der Port nicht automatich freigegeben wurde über uPNP. Alternativ prüft, ob die Funktion der Portfreigabe via uPNP auf eurem Router aktiviert ist.&lt;br /&gt;
&lt;br /&gt;
====Nach Start auf der Console beendet sich Alexa-FHEM sofort wieder====&lt;br /&gt;
Unmittelbar nach dem Start von Alexa-FHEM werden ein paar UPNP Fehlermeldungen ausgegeben. Unmittelbar danach beendet sich Alexa-FHEM wieder. &lt;br /&gt;
&lt;br /&gt;
Viele scheinen ein Problem mit UPNP auf dem Raspberry Pi zu haben. Wenn dieses Problem auftritt einfach in der &amp;lt;code&amp;gt;~/.alexa/config.json&amp;lt;/code&amp;gt; die folgenden Zeilen rauslöschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;nat-pmp&amp;quot;: &amp;quot;10.0.1.1&amp;quot;,&lt;br /&gt;
        &amp;quot;nat-upnp&amp;quot;: true,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt erneut Alexa-FHEM starten. Sollte nun laufen.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn alexa-fhem keine Geräte findet?====&lt;br /&gt;
Zunächst müssen die Geräte, die angesprochen werden wollen, unter FHEM ein neues Attribut zugewiesen bekommen. Dazu das Gerät in FHEM öffnen und das Attribut &#039;&#039;genericDeviceType switch&#039;&#039; hinzufügen, wenn es ein Schalter mit der Funktiona AN/AUS sein soll. Wenn man will, kann man dem Gerät jetzt noch über das Attribut &#039;&#039;alias&#039;&#039; eine besseren Namen geben, mit dem Alexa das Gerät dann auch finden kann.&lt;br /&gt;
Anschließend muss alexa-fhem neu gestartet werden und die definierten Geräte sollten nun gefunden werden.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn Alexa zwar Geräte findet, diese aber nicht angesprochen werden können?====&lt;br /&gt;
Zuerst die Informationen zum Datenfluss ganz oben ansehen. Dann am besten von hinten nach vorne vorgehen:&lt;br /&gt;
* wenn nichts bei alexa-fhem ankommt: port forwarding prüfen&lt;br /&gt;
* wenn lambda.js nichts los wird: im cloudwatch log nachsehen&lt;br /&gt;
* wenn bei lambda.js nichts ankommt: den trigger prüfen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zunächst sollte man sich unter &#039;&#039;http://aws.amazon.com&#039;&#039; das Logfile seiner erstellten Funktion anschauen. Ist überhaupt ein Logfile vorhanden? Falls nicht, liegt es vermutlich am Trigger.&lt;br /&gt;
Den solltet ihr überprüfen. Scheinbar kommt es hin und wieder vor, dass dieser nicht gesetzt ist. Dazu einfach auf &#039;&#039;Triggers&#039;&#039; klicken und mit &#039;&#039;Add trigger&#039;&#039; erneut einen anlegen. Hier muss, wie in der Anleitung unter &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; Punkt 7, die &#039;&#039;Application Id&#039;&#039; stehen und der Haken bei &#039;&#039;Enable trigger&#039;&#039; gesetzt sein. Dann alexa-fhem neu starten.&lt;br /&gt;
Wenn ihr Änderungen gemacht habt und den alexa-fhem Dienst noch nicht neu gestartet habt, wäre jetzt der richtige Zeitpunkt. Fürs Debugging empfiehlt es sich, alexa-fhem in einer Konsole laufen zu lassen, um eingehende Anfragen mitverfolgen zu können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sein, dass immer noch keine Log im Cloudwatch ([http://docs.aws.amazon.com/de_de/lambda/latest/dg/monitoring-functions-logs.html]) zu sehen ist. In dem Fall hilft es, eine neue Role Policy anzulegen. &lt;br /&gt;
* in der AWS Console [https://console.aws.amazon.com] oben links auf Services klicken, und in der Gruppe &amp;quot;Security, Identity &amp;amp; Compliance&amp;quot; auf IAM klicken&lt;br /&gt;
* links auf Roles klicken&lt;br /&gt;
* Auf dem Knopf &amp;quot;Create Role&amp;quot; klicken&lt;br /&gt;
* AWS Services &amp;gt; Lambda auswählen, unten auf Next:Permissions klicken&lt;br /&gt;
* im Filter / Policy Type,  &amp;quot;log&amp;quot; eintragen (ohne quotes)&lt;br /&gt;
* CloudWatchLogsFullAccess hacken, auf Next:Review unten klicken&lt;br /&gt;
* Name vergeben und mit &amp;quot;Create role&amp;quot; bestätigen&lt;br /&gt;
* Oben links auf Services klicken, und in der Gruppe &amp;quot;Compute&amp;quot;, auf Lambda klicken&lt;br /&gt;
* auf den Name der Funktion klicken&lt;br /&gt;
* Reiter Configuration auswählen&lt;br /&gt;
* in Existing Role, den neukreierten Role auswählen&lt;br /&gt;
* oben auf Save (und Testen wenn gewünscht) klicken.&lt;br /&gt;
Schon sollte eine neue Gruppe im Cloudwatch sichtbar sein. Die Suche von den Devices in Alexa wiederholen, und die Logs analysieren&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn sich der Alexa-Service nicht starten lässt?====&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Der User in der User= Directive von alexa.service muss Ausführungsrecht auf dem alexa binary haben (x), so wie auch mind. Lesezugriff auf dem Verzeichnis nach -U Option in der ExecStart= Directive und auch auf dem WorkingDirectory }}&lt;br /&gt;
Schaut bitte in das Unterverzeichnis [alexa-fhem (also dort, wo Ihr Alexa-FHEM instelliert habt]/bin. Die dort befindliche Datei &#039;&#039;alexa&#039;&#039; muss ausführbar sein. Also z.B. so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;2755327 4 -rwxr-xr-x 1 pi pi  339 Nov 26 23:20 alexa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Sollte dies nicht der Fall sein bitte mit:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;chmod +x alexa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
die Datei ausführbar machen. Sofern der User &amp;quot;pi&amp;quot; Eigentümer ist, ist kein sudo erforderlich.&lt;br /&gt;
&lt;br /&gt;
Eine lauffähige Konfiguration ist {{Link2Forum|Topic=71612|Message=668383|LinkText=hier}} zu sehen.&lt;br /&gt;
&lt;br /&gt;
Ein Fehler in der Rechtekonfiguration führt in der Regel zu folgendem Ergebnis nach &amp;lt;code&amp;gt;sudo systemctl status alexa&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;   Loaded: loaded (/etc/systemd/system/alexa.service; enabled)&lt;br /&gt;
   Active: activating (auto-restart) (Result: exit-code) since mer. 2017-09-06 02:33:23 CEST; 3s ago&lt;br /&gt;
  Process: 18332 ExecStart=/opt/fhem/alexa-fhem/bin/alexa -U /home/alexa/.alexa (code=exited, status=217/USER)&lt;br /&gt;
 Main PID: 18332 (code=exited, status=217/USER)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wie kann ich via Alexa-FHEM auf FHEM zugreifen, wenn der Port mit Benutzername/Kennwort geschützt ist?====&lt;br /&gt;
&lt;br /&gt;
Hierzu muss die Datei &amp;lt;code&amp;gt;~/.alexa/config.json&amp;lt;/code&amp;gt; geöffnet werden und der Abschnitt &amp;quot;connections&amp;quot; um folgende Zeile ergänzt werden:&amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;auth&amp;quot;: {&amp;quot;user&amp;quot;: &amp;quot;fhem&amp;quot;, &amp;quot;pass&amp;quot;: &amp;quot;fhempassword&amp;quot;},&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bei Verwendung von SSL bei FHEM muss auch noch &amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;ssl&amp;quot;: true,&amp;lt;/pre&amp;gt; hinzugefügt werden&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Template&amp;diff=20977</id>
		<title>Template</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Template&amp;diff=20977"/>
		<updated>2017-03-20T14:24:53Z</updated>

		<summary type="html">&lt;p&gt;KernSani: kleine Ergänzungen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:template}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einfaches Erstellen gleichartiger Devices&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=template&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=98_template.pm&lt;br /&gt;
|ModOwner=Dr. Boris Neubert ({{Link2FU|10| Forum}})&lt;br /&gt;
}}&lt;br /&gt;
Der [[template]] Befehl vereinfacht das Erstellen gleichartiger Devices in FHEM. Ein Template File besteht im Grunde aus FHEM Befehlen, in die Platzhalter eingefügt werden. Beim Aufruf des template Befehles werden die Platzhalter durch konkrete Werte ersetzt. Damit lassen sich sehr schnell ähnliche Devices (oder Kombinationen von Devices) erstellen oder ändern. Ein template file könnte z.B. die Definition eines Dummies inkl. mehrerer sich auf den Dummy beziehenden [[notify]] und [[at]] enthalten. Durch wiederholte Ausführung des templates lassen sich so schnell Devices und ihre Verarbeitungslogik erstellen.&lt;br /&gt;
&lt;br /&gt;
== Template File erstellen ==&lt;br /&gt;
Template Files werden ausserhalb FHEM erstellt und dann auf dem FHEM Server (in einem Unterverzeichnis von fhem) abgelegt. Nutzer von [[configdb]] müssen das file zunächst importieren.&lt;br /&gt;
  &lt;br /&gt;
Derzeit (März 2017) können template files noch nicht über &amp;quot;Edit Files&amp;quot; in FHEM direkt bearbeitet werden. Über einen Workaround ist dies jedoch möglich. Dateien, die in /FHEM abgelegt sind und Endungen wie z.B. .holiday oder .layout haben, werden unter &amp;quot;Edit Files&amp;quot; angezeigt und können in FHEM bearbeitet werden.&lt;br /&gt;
Das template file kann mittels&lt;br /&gt;
:&amp;lt;code&amp;gt;template show &amp;lt;templateFile&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
angezeigt werden&lt;br /&gt;
&lt;br /&gt;
== Template File mit Inhalt füllen ==&lt;br /&gt;
Das Template besteht aus FHEM Befehlen mit Plathaltern, die bei der Ausführung des template Befehls durch konkrete Werte ersetzt werden. Ein template könnte beispielsweise folgendermaßen definiert werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# my Template File ./FHEM/tmpl_example.layout&lt;br /&gt;
define %name% dummy &lt;br /&gt;
&lt;br /&gt;
define di_%name% doif ([%name]) (set %device&amp;quot; on)&lt;br /&gt;
attr di_%name do always&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Kopie eines Devices mit [[copy]] ermöglicht der template Befehl die Definition mehrerer - von einander abhängiger - Geräte &amp;quot;in einem Rutsch&amp;quot;. Oben stehendes Beispiel ist bewusst einfach gehalten um diesen Aspekt zu verdeutlichen.&lt;br /&gt;
&lt;br /&gt;
Für komplexere Templates bietet sich die [[Import_von_Code_Snippets|raw definition]] eines existierenden Gerätes als Ausgangspunkt an.&lt;br /&gt;
&lt;br /&gt;
== Template ausführen ==&lt;br /&gt;
Bei Ausführung des Templates werden die FHEM Befehle des template files abgearbeitet. In oben definiertem Beispiel würde also ein &lt;br /&gt;
:&amp;lt;code&amp;gt;template ./FHEM/tmpl_example.layout name=myDummy device=myDevice&amp;lt;/code&amp;gt;&lt;br /&gt;
dazu führen, dass ein Dummy inkl. zugehörigem [[DOIF]] angelegt würde.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Template&amp;diff=20789</id>
		<title>Template</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Template&amp;diff=20789"/>
		<updated>2017-03-19T00:02:03Z</updated>

		<summary type="html">&lt;p&gt;KernSani: Wiki EIntrag für &amp;quot;template&amp;quot; Befehl erstellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:template}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einfaches Erstellen gleichartiger Devices&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=template&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=98_template.pm&lt;br /&gt;
|ModOwner=Dr. Boris Neubert ([https://forum.fhem.de/index.php?action=profile;u=10 Forum])&lt;br /&gt;
}}&lt;br /&gt;
Der template Befehl vereinfacht das Erstellen gleichartiger Devices in FHEM. Ein Template File besteht im Grunde aus FHEM Befehlen, in die Platzhalter eingefügt werden. Beim Aufruf des template Befehles werden die Platzhalter durch konkrete Werte ersetzt. Damit lassen sich sehr schnell ähnliche Devices (oder Kombinationen von Devices) erstellen oder ändern. Ein template file könnte z.B. die Definition eines Dummies inkl. mehrerer sich auf den Dummy beziehenden notifies und at&#039;s enthalten. Durch wiederholte Ausführung des templates lassen sich so schnell Devices und ihre Verarbeitungslogik erstellen.&lt;br /&gt;
&lt;br /&gt;
== Template File erstellen ==&lt;br /&gt;
Template Files werden ausserhalb FHEM erstellt und dann auf FHEM Server (in einem Unterverzeichnis von fhem) abgelegt. Nutzer von configdb müssen das file zunächst importieren,  &lt;br /&gt;
Derzeit (März 2017) können template files noch nicht über &amp;quot;Edit Files&amp;quot; in FHEM direkt bearbeitet werden. Über einen Workaround ist dies jedoch möglich. Dateien, die in /FHEM abgelegt sind und Endungen wie z.B. .holiday oder .layout haben, werden unter &amp;quot;Edit Files&amp;quot; angezeigt und können in FHEM bearbeitet werden.&lt;br /&gt;
Das template file kann mittels&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
template show &amp;lt;templateFile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
angezeigt werden&lt;br /&gt;
&lt;br /&gt;
== Template File mit Inhalt füllen ==&lt;br /&gt;
Das Template besteht aus FHEM Befehlen mit Plathaltern, die bei der Ausführung des template Befehls durch konkrete Werte ersetzt werden. Ein template könnte beispielsweise folgendermaßen definiert werden.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
# my Template File ./FHEM/tmpl_example.layout&lt;br /&gt;
define %name% dummy &lt;br /&gt;
define di_%name% doif ([%name]) (set %device&amp;quot; on)&lt;br /&gt;
attr di_%name do always&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Template ausführen ==&lt;br /&gt;
Bei Ausführung des Templates werden die FHEM Befehle des template files abgearbeitet. In oben definiertem Beispiel würde also ein &lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
template ./FHEM/tmpl_example.layout name=myDummy &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dazu führen, dass ein Dummy inkl. zugehörigem DOIF angelegt würde.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DOIF/Import_von_Code_Snippets&amp;diff=19317</id>
		<title>DOIF/Import von Code Snippets</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DOIF/Import_von_Code_Snippets&amp;diff=19317"/>
		<updated>2017-02-02T20:54:18Z</updated>

		<summary type="html">&lt;p&gt;KernSani: KernSani verschob die Seite DOIF/Import von Code Snippets nach Import von Code Snippets: Hatt nichts mit DOIF zu tun&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#WEITERLEITUNG [[Import von Code Snippets]]&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Import_von_Code_Snippets&amp;diff=19316</id>
		<title>Import von Code Snippets</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Import_von_Code_Snippets&amp;diff=19316"/>
		<updated>2017-02-02T20:54:18Z</updated>

		<summary type="html">&lt;p&gt;KernSani: KernSani verschob die Seite DOIF/Import von Code Snippets nach Import von Code Snippets: Hatt nichts mit DOIF zu tun&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sorgfältig vorbereitete Code Snippets, mit exportdevice erzeugter Code oder mit &#039;&#039;&#039;Raw definition&#039;&#039;&#039; ausgegebene Gerätedefinitionen können im FHEMWEB-Frontend über &#039;&#039;&#039;Raw definition&#039;&#039;&#039; importiert werden.&lt;br /&gt;
&lt;br /&gt;
==Wo finde ich Raw definition?==&lt;br /&gt;
Zur &#039;&#039;&#039;Raw definition&#039;&#039;&#039; kommt man über die Geräteansicht (DeviceOverview) eines beliebigen Gerätes. Der Link &#039;&#039;&#039;Raw definition&#039;&#039;&#039; steht in der letzten Zeile der Seite.&lt;br /&gt;
[[Datei:Raw_definition.png|600px]]&lt;br /&gt;
==Erstellen eines Importgerätes==&lt;br /&gt;
Zur Übung kann man dieses Importgerät importieren.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Import dummy&lt;br /&gt;
attr Import group Entwicklung&lt;br /&gt;
attr Import room Entwicklung&lt;br /&gt;
save&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Direktzugriff über das FHEM-Menü==&lt;br /&gt;
Der angelegten Import-Dummy kann direkt aufgerufen werden, wenn man einen Meüeintrag anlegt.&lt;br /&gt;
Im entsprechenden FHEMWEB-Gerät das Attribut &#039;&#039;&#039;menuEntries&#039;&#039;&#039; erzeugen mit&lt;br /&gt;
&amp;lt;pre&amp;gt;attr WEB menuEntries CodeImport,/fhem?detail=Import#&amp;lt;/pre&amp;gt;&lt;br /&gt;
oder ergänzen mit&lt;br /&gt;
&amp;lt;pre&amp;gt;CodeImport,/fhem?detail=Import#&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Vorgehensweise beim Import==&lt;br /&gt;
Als erstes die Geräteansicht eines beliebigen Gerätes aufrufen, dann den Link &#039;&#039;&#039;Raw definition&#039;&#039;&#039; anklicken.&amp;lt;br&amp;gt;&lt;br /&gt;
Jetzt den angezeigten Inhalt des sich öffnenden Eingabefeldes mit der oben stehenden Definition überschreiben und danach den erschienenen Button &#039;&#039;&#039;Execute commands&#039;&#039;&#039; drücken.&amp;lt;br&amp;gt; Wenn die Meldung &amp;quot;Wrote configuration to fhem.cfg&amp;quot; erscheint, war der Import erfolgreich, andernfalls gibt es eine Fehlermeldung und der Import wird an dieser Stelle abgebrochen.&amp;lt;br&amp;gt;Das Gerät müsste jetzt im Raum Entwicklung zu finden sein.&amp;lt;br&amp;gt;&lt;br /&gt;
Zukünftig kann dieses Gerät zum Importieren genutzt werden, damit sinkt die Wahrscheinlichkeit eine bestehende Definition zu beeinträchtigen.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Zum Erstellen eigener Definitionen ist der DEF-Editor das empfohlene Werkzeug.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [[DOIF]]&lt;br /&gt;
* [[DOIF/Ein- und Ausgabe in FHEMWEB und Tablet-UI am Beispiel einer Schaltuhr]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=19198</id>
		<title>Homebridge User Configs</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=19198"/>
		<updated>2017-01-29T22:33:39Z</updated>

		<summary type="html">&lt;p&gt;KernSani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Eintrag dient zur Sammlung funktionsfähiger Homebridge Configs.&lt;br /&gt;
&lt;br /&gt;
Bitte immer die FHEM Version und Homebridge Version angegeben.&lt;br /&gt;
&lt;br /&gt;
Sehr gute Hinweise gibt es hier: http://www.meintechblog.de/2015/10/mit-siri-und-fhem-das-gesamte-smart-home-per-stimme-steuern/&lt;br /&gt;
== Feuchtesensor ==&lt;br /&gt;
Zum Einstieg etwas leicht nachvollziehbares. &lt;br /&gt;
&lt;br /&gt;
Feuchtesensoren haben in der Regel ein &amp;quot;humidity&amp;quot; reading, im Falle des Opus XT300 Bodenfeuchtesensors auch Temperatur und Batterie Level. Homekit unterstützt einen &amp;quot;HumiditySensor&amp;quot; Service. Dieser ist in homebridge-fhem nicht standardmäßig vorhanden (kann also nicht aus dem dropdown ausgewählt werden, sondern muss über das Befehlsfeld zugewiesen werden):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr meinSensor genericDeviceType HumiditySensor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im nächsten Schritt mappen wir die readings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr meinSensor homebridgeMapping clear CurrentRelativeHumidity=humidity StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;;/^.*/:BATTERY_LEVEL_LOW CurrentTemperature=temperature&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt;löscht default mappings - das wird in der Regel nicht notwendig sein, schadet aber nicht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CurrentRelativeHumidity&amp;lt;/code&amp;gt; ist die relevante Homekit Characteristic - wird mit dem entsprechenden Reading des Sensors gemappt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;StatusLowBattery&amp;lt;/code&amp;gt; erwartet entweder BATTERY_LEVEL_NORMAL oder _LOW. Mein Sensor liefert ok zurück, wenn alles gut ist, also wird &amp;quot;ok&amp;quot; auf _NORMAL gemappt, alles andere auf _LOW. &lt;br /&gt;
&lt;br /&gt;
Mein Sensor liefert auch noch die Temperatur - der HumiditySensor Service sieht das eigentlich nicht vor, daher wird die Temperatur auch nicht in der Apple &amp;quot;Home&amp;quot; App angezeigt. Eve ist da nicht so pingelig.&lt;br /&gt;
&lt;br /&gt;
== EnOcean STM 250 Tür-/Fensterkontakt ==&lt;br /&gt;
Der STM 250 liefert als Status in FHEM &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;, wenn das Fenster offen und damit der Kontakt &amp;quot;offen&amp;quot; ist. Analog liefert er &amp;lt;code&amp;gt;closed&amp;lt;/code&amp;gt; wenn das Fenster geschlossen und damit auch der Kontakt geschlossen ist. Diese Statusangaben sind sehr intuitiv zu verstehen und zu interpretieren. &lt;br /&gt;
&lt;br /&gt;
Die characteristic &amp;lt;code&amp;gt;ContactSensorState&amp;lt;/code&amp;gt; von HomeKit liefert entweder den Wert &amp;lt;code&amp;gt;CONTACT_DETECTED=0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1&amp;lt;/code&amp;gt; zurück. Wobei &amp;lt;code&amp;gt;CONTACT_DETECTED&amp;lt;/code&amp;gt; bedeutet, dass der Kontakt geschlossen ist. Je nach Darstellung in der HomeKit-fähigen App muss dieses Verhalten bei der Interpretation berücksichtigt werden. Die App Eve von Elgato zum Beispiel liefert für Kontaktsensoren &amp;quot;JA&amp;quot; oder &amp;quot;NEIN&amp;quot; mit der Bedeutung &amp;lt;code&amp;gt;CONTACT_DETECTED=0=JA&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1=NEIN&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
Noch ein wichtiger Punkt: Um einen Sensorkontakt sinnvoll einzurichten sollte als zusätzlicher Wert für das Attribut &amp;lt;code&amp;gt;genericdeviceType&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;ContactSensor&amp;lt;/code&amp;gt; hinzugefügt werden. Wie das geht ist im Eintrag [[Homebridge_einrichten#FHEM_konfigurieren | Homebridge einrichten]] ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
Folgende Attribute dann hinzufügen:&lt;br /&gt;
 attr STM250 genericDeviceType ContactSensor&lt;br /&gt;
 attr STM250 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;open:CONTACT_NOT_DETECTED&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== Modul RESIDENTS für Anwesenheitserkennung und Steuerung der Anwesenheit benutzen ==&lt;br /&gt;
[[Datei:Homebridge_bewohner_zu_szene.jpeg|mini|Schaltzustand eines Bewohners zu einer Szene hinzufügen]]&lt;br /&gt;
Aus den einzelnen Komponenten des Moduls RESIDENTS, homebridge sowie der characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; und der Szenensteuerung lässt sich eine gleichzeitige Steuerung der Anwesenheit und Anwesenheitserkennung basteln.&lt;br /&gt;
&lt;br /&gt;
Dazu müssen folgende Schritte unternommen werden:&lt;br /&gt;
* einem Bewohner aus dem Modul ROOMMATE die Steuerung über homebridgeMapping hinzufügen&lt;br /&gt;
* Szene für &amp;quot;Ich bin zu Hause&amp;quot; und &amp;quot;Ich gehe jetzt&amp;quot; in einer HomeKit-fähigen App wie z.B. Eve einrichten&lt;br /&gt;
&lt;br /&gt;
Man kann einen beliebigen Bewohner aus dem Modul ROOMMATE nehmen und ihn über die characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; in Form eines Schalters sozusagen schaltbar machen. Nur wird das Ein- und Ausschalten des Bewohners über HomeKit in FHEM auf den Status home bzw. absent gemappt. Seit dem 06.02.2016 werden RESIDENTS automatisch als Occupancy Sensor für HomeKit annonciert. Nun noch die Attribute des ROOMMATE wie folgt setzen:&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; homebridgeMapping On=state,valueOn=/home|awoken|asleep|gotosleep/,valueOff=/gone|absent/,cmdOn=home,cmdOff=absent&lt;br /&gt;
&lt;br /&gt;
Natürlich muss der Bewohner noch dem Filter von homebridge hinzugefügt und homebridge neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Anschließend geht es in der HomeKit-fähigen App Deiner Wahl weiter. In Eve von Elgato ist von vornherein zum Beispiel vorgesehen, dass man zwei Szenen &amp;quot;Ich bin zuhause&amp;quot; und &amp;quot;Ich verlasse das Haus&amp;quot; hat. Zu diesen Szenen wird eine Aktion hinzugefügt indem der Bewohner, den das ROOMMATE-Modul meldet zur Szene hinzugefügt wird und beim Nachhausekommen &amp;quot;eingeschaltet&amp;quot; wird. Genauso wird mit der Szene &amp;quot;Ich verlasse das Haus&amp;quot; verfahren: Bewohner zur Szene hinzufügen und den Schaltvorgang auf &amp;quot;ausschalten&amp;quot; setzen.&lt;br /&gt;
&lt;br /&gt;
Mit den Sprachbefehlen &amp;quot;Ich bin zuhause&amp;quot; oder &amp;quot;Ich verlasse das Haus&amp;quot; wird die entsprechende Szene eingeschaltet, homebridge schaltet über das &amp;lt;code&amp;gt;homebridgeMapping&amp;lt;/code&amp;gt; Attribut dann den Bewohner auf &amp;quot;home&amp;quot; oder &amp;quot;absent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== ZWave Türschloss Vision ZM1701 einbinden ==&lt;br /&gt;
Das ZWave Türschloss ZM1701 von der Firma Vision sendet seinen aktuellen Schließstatus in ein einzelnes Reading wie &amp;quot;lock&amp;quot;, sondern schickt eine ganze Reihe von Informationen über den Zustand in das Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das Schließen und Öffnen der Türschlosses wird auch nicht mit einem Setzen des &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; erreicht, sondern mit dem Setzen von &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das macht das Einbinden in homebridge nicht trivial, funktioniert aber über folgendes Homebridge-Mapping:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&lt;br /&gt;
&lt;br /&gt;
Kurz zur Erklärung: Um ein Schloss über HomeKit steuern zu können braucht es zwei characteristics. LockCurrentState zeigt an, ob das Schloss geöffnet oder geschlossen ist. Und mit LockTargetState wird das Schloss geöffnet oder geschlossen. Damit der aktuelle Status des Schlosses ausgelesen werden kann, muss aus dem FHEM-Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; die Zeichenfolge &amp;lt;code&amp;gt; secured&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;unsecured&amp;lt;/code&amp;gt; extrahiert werden, daher die beiden regulären Ausdrücke &amp;lt;code&amp;gt;/\ssecured/&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;/unsecured/&amp;lt;/code&amp;gt;. In der characteristic &amp;lt;code&amp;gt;LockTargetState&amp;lt;/code&amp;gt; muss sowohl der aktuelle Status des Schlosses als auch das Kommando angegeben werden, schließlich möchte man ein geschlossenes Schloss nicht nochmal schließen. Daher wird erst aus dem Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; der aktuelle Status des Schlosses ausgelesen und die damit korrespondierenden Befehle über &amp;lt;code&amp;gt;cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&amp;lt;/code&amp;gt; generiert.&lt;br /&gt;
&lt;br /&gt;
Wer es in FHEM über ein webCmd einfacher zu bedienen haben möchte, fügt bitte noch die dafür notwendigen Attribute und die leicht geänderten homebridgeMappings wie folgt ein:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:close;UNSECURED:open&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; /doorLockOperation open:open/doorLockOperation close:close&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; webCmd open:close&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12191&lt;br /&gt;
 homebridge 0.4.6&lt;br /&gt;
 homebridge-fhem 0.2.48&lt;br /&gt;
&lt;br /&gt;
== Roomba über THINKINGCLEANER Modul ==&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; homebridgeMapping clear On=state,valueOn=/^(on|dock)/,cmdOn=on,cmdOff=off,nocache=1 ChargingState=deviceStatus,values=/(_recon|_full|_trickle)$/:CHARGING;/^.*/:NOT_CHARGING&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; siriName Robby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12680&lt;br /&gt;
 homebridge 0.4.11&lt;br /&gt;
 homebridge-fhem 0.2.66&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=19197</id>
		<title>Homebridge User Configs</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=19197"/>
		<updated>2017-01-29T22:33:09Z</updated>

		<summary type="html">&lt;p&gt;KernSani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Eintrag dient zur Sammlung funktionsfähiger Homebridge Configs.&lt;br /&gt;
&lt;br /&gt;
Bitte immer die FHEM Version und Homebridge Version angegeben.&lt;br /&gt;
&lt;br /&gt;
Sehr gute Hinweise gibt es hier: http://www.meintechblog.de/2015/10/mit-siri-und-fhem-das-gesamte-smart-home-per-stimme-steuern/&lt;br /&gt;
== Feuchtesensor ==&lt;br /&gt;
Zum Einstieg etwas leicht nachvollziehbares. &lt;br /&gt;
&lt;br /&gt;
Feuchtesensoren haben in der Regel ein &amp;quot;humidity&amp;quot; reading, im Falle des Opus XT300 Bodenfeuchtesensors auch Temperatur und Batterie Level. Homekit unterstützt einen &amp;quot;HumiditySensor&amp;quot; Service. Dieser ist in homebridge-fhem nicht standardmäßig vorhanden (kann also nicht aus dem dropdown ausgewählt werden, sondern muss über das Befehlsfeld zugewiesen werden):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr meinSensor genericDeviceType HumiditySensor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im nächsten Schritt mappen wir die readings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr meinSensor homebridgeMapping clear CurrentRelativeHumidity=humidity StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;;/^.*/:BATTERY_LEVEL_LOW CurrentTemperature=temperature&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt;löscht default mappings - das wird in der Regel nicht notwendig sein, schadet aber nicht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CurrentRelativeHumidity&amp;lt;/code&amp;gt; ist die relevante Homekit Characteristic - wird mit dem entsprechenden Reading des Sensors gemappt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;StatusLowBattery&amp;lt;/code&amp;gt; erwartet entweder BATTERY_LEVEL_NORMAL ode _LOW. Mein Sensor liefert ok zurück, wenn alles gut ist, also wird &amp;quot;ok&amp;quot; auf _NORMAL gemappt, alles andere auf _LOW. &lt;br /&gt;
&lt;br /&gt;
Mein Sensor liefert auch noch die Temperatur - der HumiditySensor Service sieht das eigentlich nicht vor, daher wird die Temperatur auch nicht in der Apple &amp;quot;Home&amp;quot; App angezeigt. Eve ist da nicht so pingelig.&lt;br /&gt;
&lt;br /&gt;
== EnOcean STM 250 Tür-/Fensterkontakt ==&lt;br /&gt;
Der STM 250 liefert als Status in FHEM &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;, wenn das Fenster offen und damit der Kontakt &amp;quot;offen&amp;quot; ist. Analog liefert er &amp;lt;code&amp;gt;closed&amp;lt;/code&amp;gt; wenn das Fenster geschlossen und damit auch der Kontakt geschlossen ist. Diese Statusangaben sind sehr intuitiv zu verstehen und zu interpretieren. &lt;br /&gt;
&lt;br /&gt;
Die characteristic &amp;lt;code&amp;gt;ContactSensorState&amp;lt;/code&amp;gt; von HomeKit liefert entweder den Wert &amp;lt;code&amp;gt;CONTACT_DETECTED=0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1&amp;lt;/code&amp;gt; zurück. Wobei &amp;lt;code&amp;gt;CONTACT_DETECTED&amp;lt;/code&amp;gt; bedeutet, dass der Kontakt geschlossen ist. Je nach Darstellung in der HomeKit-fähigen App muss dieses Verhalten bei der Interpretation berücksichtigt werden. Die App Eve von Elgato zum Beispiel liefert für Kontaktsensoren &amp;quot;JA&amp;quot; oder &amp;quot;NEIN&amp;quot; mit der Bedeutung &amp;lt;code&amp;gt;CONTACT_DETECTED=0=JA&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1=NEIN&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
Noch ein wichtiger Punkt: Um einen Sensorkontakt sinnvoll einzurichten sollte als zusätzlicher Wert für das Attribut &amp;lt;code&amp;gt;genericdeviceType&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;ContactSensor&amp;lt;/code&amp;gt; hinzugefügt werden. Wie das geht ist im Eintrag [[Homebridge_einrichten#FHEM_konfigurieren | Homebridge einrichten]] ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
Folgende Attribute dann hinzufügen:&lt;br /&gt;
 attr STM250 genericDeviceType ContactSensor&lt;br /&gt;
 attr STM250 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;open:CONTACT_NOT_DETECTED&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== Modul RESIDENTS für Anwesenheitserkennung und Steuerung der Anwesenheit benutzen ==&lt;br /&gt;
[[Datei:Homebridge_bewohner_zu_szene.jpeg|mini|Schaltzustand eines Bewohners zu einer Szene hinzufügen]]&lt;br /&gt;
Aus den einzelnen Komponenten des Moduls RESIDENTS, homebridge sowie der characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; und der Szenensteuerung lässt sich eine gleichzeitige Steuerung der Anwesenheit und Anwesenheitserkennung basteln.&lt;br /&gt;
&lt;br /&gt;
Dazu müssen folgende Schritte unternommen werden:&lt;br /&gt;
* einem Bewohner aus dem Modul ROOMMATE die Steuerung über homebridgeMapping hinzufügen&lt;br /&gt;
* Szene für &amp;quot;Ich bin zu Hause&amp;quot; und &amp;quot;Ich gehe jetzt&amp;quot; in einer HomeKit-fähigen App wie z.B. Eve einrichten&lt;br /&gt;
&lt;br /&gt;
Man kann einen beliebigen Bewohner aus dem Modul ROOMMATE nehmen und ihn über die characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; in Form eines Schalters sozusagen schaltbar machen. Nur wird das Ein- und Ausschalten des Bewohners über HomeKit in FHEM auf den Status home bzw. absent gemappt. Seit dem 06.02.2016 werden RESIDENTS automatisch als Occupancy Sensor für HomeKit annonciert. Nun noch die Attribute des ROOMMATE wie folgt setzen:&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; homebridgeMapping On=state,valueOn=/home|awoken|asleep|gotosleep/,valueOff=/gone|absent/,cmdOn=home,cmdOff=absent&lt;br /&gt;
&lt;br /&gt;
Natürlich muss der Bewohner noch dem Filter von homebridge hinzugefügt und homebridge neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Anschließend geht es in der HomeKit-fähigen App Deiner Wahl weiter. In Eve von Elgato ist von vornherein zum Beispiel vorgesehen, dass man zwei Szenen &amp;quot;Ich bin zuhause&amp;quot; und &amp;quot;Ich verlasse das Haus&amp;quot; hat. Zu diesen Szenen wird eine Aktion hinzugefügt indem der Bewohner, den das ROOMMATE-Modul meldet zur Szene hinzugefügt wird und beim Nachhausekommen &amp;quot;eingeschaltet&amp;quot; wird. Genauso wird mit der Szene &amp;quot;Ich verlasse das Haus&amp;quot; verfahren: Bewohner zur Szene hinzufügen und den Schaltvorgang auf &amp;quot;ausschalten&amp;quot; setzen.&lt;br /&gt;
&lt;br /&gt;
Mit den Sprachbefehlen &amp;quot;Ich bin zuhause&amp;quot; oder &amp;quot;Ich verlasse das Haus&amp;quot; wird die entsprechende Szene eingeschaltet, homebridge schaltet über das &amp;lt;code&amp;gt;homebridgeMapping&amp;lt;/code&amp;gt; Attribut dann den Bewohner auf &amp;quot;home&amp;quot; oder &amp;quot;absent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== ZWave Türschloss Vision ZM1701 einbinden ==&lt;br /&gt;
Das ZWave Türschloss ZM1701 von der Firma Vision sendet seinen aktuellen Schließstatus in ein einzelnes Reading wie &amp;quot;lock&amp;quot;, sondern schickt eine ganze Reihe von Informationen über den Zustand in das Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das Schließen und Öffnen der Türschlosses wird auch nicht mit einem Setzen des &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; erreicht, sondern mit dem Setzen von &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das macht das Einbinden in homebridge nicht trivial, funktioniert aber über folgendes Homebridge-Mapping:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&lt;br /&gt;
&lt;br /&gt;
Kurz zur Erklärung: Um ein Schloss über HomeKit steuern zu können braucht es zwei characteristics. LockCurrentState zeigt an, ob das Schloss geöffnet oder geschlossen ist. Und mit LockTargetState wird das Schloss geöffnet oder geschlossen. Damit der aktuelle Status des Schlosses ausgelesen werden kann, muss aus dem FHEM-Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; die Zeichenfolge &amp;lt;code&amp;gt; secured&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;unsecured&amp;lt;/code&amp;gt; extrahiert werden, daher die beiden regulären Ausdrücke &amp;lt;code&amp;gt;/\ssecured/&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;/unsecured/&amp;lt;/code&amp;gt;. In der characteristic &amp;lt;code&amp;gt;LockTargetState&amp;lt;/code&amp;gt; muss sowohl der aktuelle Status des Schlosses als auch das Kommando angegeben werden, schließlich möchte man ein geschlossenes Schloss nicht nochmal schließen. Daher wird erst aus dem Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; der aktuelle Status des Schlosses ausgelesen und die damit korrespondierenden Befehle über &amp;lt;code&amp;gt;cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&amp;lt;/code&amp;gt; generiert.&lt;br /&gt;
&lt;br /&gt;
Wer es in FHEM über ein webCmd einfacher zu bedienen haben möchte, fügt bitte noch die dafür notwendigen Attribute und die leicht geänderten homebridgeMappings wie folgt ein:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:close;UNSECURED:open&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; /doorLockOperation open:open/doorLockOperation close:close&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; webCmd open:close&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12191&lt;br /&gt;
 homebridge 0.4.6&lt;br /&gt;
 homebridge-fhem 0.2.48&lt;br /&gt;
&lt;br /&gt;
== Roomba über THINKINGCLEANER Modul ==&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; homebridgeMapping clear On=state,valueOn=/^(on|dock)/,cmdOn=on,cmdOff=off,nocache=1 ChargingState=deviceStatus,values=/(_recon|_full|_trickle)$/:CHARGING;/^.*/:NOT_CHARGING&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; siriName Robby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12680&lt;br /&gt;
 homebridge 0.4.11&lt;br /&gt;
 homebridge-fhem 0.2.66&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=19196</id>
		<title>Homebridge User Configs</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=19196"/>
		<updated>2017-01-29T22:31:33Z</updated>

		<summary type="html">&lt;p&gt;KernSani: HumiditySensor hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Eintrag dient zur Sammlung funktionsfähiger Homebridge Configs.&lt;br /&gt;
&lt;br /&gt;
Bitte immer die FHEM Version und Homebridge Version angegeben.&lt;br /&gt;
&lt;br /&gt;
Sehr gute Hinweise gibt es hier: http://www.meintechblog.de/2015/10/mit-siri-und-fhem-das-gesamte-smart-home-per-stimme-steuern/&lt;br /&gt;
== Feuchtesensor ==&lt;br /&gt;
Zum Einstieg etwas leicht nachvollziehbares. &lt;br /&gt;
&lt;br /&gt;
Feuchtesensoren haben in der Regel ein &amp;quot;humidity&amp;quot; reading, im Falle des Opus XT300 Bodenfeuchtesensors auch Temperatur und Batterie Level. Homekit unterstützt einen &amp;quot;HumiditySensor&amp;quot; Service. Dieser ist in homebridge-fhem nicht standardmäßig vorhanden (kann also nicht aus dem dropdown ausgewählt werden, sondern muss über das Befehlsfeld zugewiesen werden):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr meinSensor genericDeviceType HumiditySensor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im nächsten Schritt mappen wir die readings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr meinSensor homebridgeMapping clear CurrentRelativeHumidity=humidity StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;;/^.*/:BATTERY_LEVEL_LOW CurrentTemperature=temperature&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt;löscht default mappings - das wird in der Regel nicht notwendig sein, schadet aber nicht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CurrentRelativeHumidity&amp;lt;/code&amp;gt; ist die Homekit Characteristic - wird mit dem entsprechenden Reading des Sensors gemappt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;StatusLowBattery&amp;lt;/code&amp;gt; erwartet entweder BATTERY_LEVEL_NORMAL ode _LOW. Mein Sensor liefert ok zurück, wenn alles gut ist, also wird &amp;quot;ok&amp;quot; auf _NORMAL gemappt, alles andere auf _LOW. &lt;br /&gt;
&lt;br /&gt;
Mein Sensor liefert auch noch die Temperatur - der HumiditySensor Service sieht das eigentlich nicht vor, daher wird die Temperatur auch nicht in der Apple &amp;quot;Home&amp;quot; App angezeigt. Eve ist da nicht so pingelig.&lt;br /&gt;
&lt;br /&gt;
== EnOcean STM 250 Tür-/Fensterkontakt ==&lt;br /&gt;
Der STM 250 liefert als Status in FHEM &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;, wenn das Fenster offen und damit der Kontakt &amp;quot;offen&amp;quot; ist. Analog liefert er &amp;lt;code&amp;gt;closed&amp;lt;/code&amp;gt; wenn das Fenster geschlossen und damit auch der Kontakt geschlossen ist. Diese Statusangaben sind sehr intuitiv zu verstehen und zu interpretieren. &lt;br /&gt;
&lt;br /&gt;
Die characteristic &amp;lt;code&amp;gt;ContactSensorState&amp;lt;/code&amp;gt; von HomeKit liefert entweder den Wert &amp;lt;code&amp;gt;CONTACT_DETECTED=0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1&amp;lt;/code&amp;gt; zurück. Wobei &amp;lt;code&amp;gt;CONTACT_DETECTED&amp;lt;/code&amp;gt; bedeutet, dass der Kontakt geschlossen ist. Je nach Darstellung in der HomeKit-fähigen App muss dieses Verhalten bei der Interpretation berücksichtigt werden. Die App Eve von Elgato zum Beispiel liefert für Kontaktsensoren &amp;quot;JA&amp;quot; oder &amp;quot;NEIN&amp;quot; mit der Bedeutung &amp;lt;code&amp;gt;CONTACT_DETECTED=0=JA&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1=NEIN&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
Noch ein wichtiger Punkt: Um einen Sensorkontakt sinnvoll einzurichten sollte als zusätzlicher Wert für das Attribut &amp;lt;code&amp;gt;genericdeviceType&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;ContactSensor&amp;lt;/code&amp;gt; hinzugefügt werden. Wie das geht ist im Eintrag [[Homebridge_einrichten#FHEM_konfigurieren | Homebridge einrichten]] ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
Folgende Attribute dann hinzufügen:&lt;br /&gt;
 attr STM250 genericDeviceType ContactSensor&lt;br /&gt;
 attr STM250 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;open:CONTACT_NOT_DETECTED&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== Modul RESIDENTS für Anwesenheitserkennung und Steuerung der Anwesenheit benutzen ==&lt;br /&gt;
[[Datei:Homebridge_bewohner_zu_szene.jpeg|mini|Schaltzustand eines Bewohners zu einer Szene hinzufügen]]&lt;br /&gt;
Aus den einzelnen Komponenten des Moduls RESIDENTS, homebridge sowie der characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; und der Szenensteuerung lässt sich eine gleichzeitige Steuerung der Anwesenheit und Anwesenheitserkennung basteln.&lt;br /&gt;
&lt;br /&gt;
Dazu müssen folgende Schritte unternommen werden:&lt;br /&gt;
* einem Bewohner aus dem Modul ROOMMATE die Steuerung über homebridgeMapping hinzufügen&lt;br /&gt;
* Szene für &amp;quot;Ich bin zu Hause&amp;quot; und &amp;quot;Ich gehe jetzt&amp;quot; in einer HomeKit-fähigen App wie z.B. Eve einrichten&lt;br /&gt;
&lt;br /&gt;
Man kann einen beliebigen Bewohner aus dem Modul ROOMMATE nehmen und ihn über die characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; in Form eines Schalters sozusagen schaltbar machen. Nur wird das Ein- und Ausschalten des Bewohners über HomeKit in FHEM auf den Status home bzw. absent gemappt. Seit dem 06.02.2016 werden RESIDENTS automatisch als Occupancy Sensor für HomeKit annonciert. Nun noch die Attribute des ROOMMATE wie folgt setzen:&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; homebridgeMapping On=state,valueOn=/home|awoken|asleep|gotosleep/,valueOff=/gone|absent/,cmdOn=home,cmdOff=absent&lt;br /&gt;
&lt;br /&gt;
Natürlich muss der Bewohner noch dem Filter von homebridge hinzugefügt und homebridge neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Anschließend geht es in der HomeKit-fähigen App Deiner Wahl weiter. In Eve von Elgato ist von vornherein zum Beispiel vorgesehen, dass man zwei Szenen &amp;quot;Ich bin zuhause&amp;quot; und &amp;quot;Ich verlasse das Haus&amp;quot; hat. Zu diesen Szenen wird eine Aktion hinzugefügt indem der Bewohner, den das ROOMMATE-Modul meldet zur Szene hinzugefügt wird und beim Nachhausekommen &amp;quot;eingeschaltet&amp;quot; wird. Genauso wird mit der Szene &amp;quot;Ich verlasse das Haus&amp;quot; verfahren: Bewohner zur Szene hinzufügen und den Schaltvorgang auf &amp;quot;ausschalten&amp;quot; setzen.&lt;br /&gt;
&lt;br /&gt;
Mit den Sprachbefehlen &amp;quot;Ich bin zuhause&amp;quot; oder &amp;quot;Ich verlasse das Haus&amp;quot; wird die entsprechende Szene eingeschaltet, homebridge schaltet über das &amp;lt;code&amp;gt;homebridgeMapping&amp;lt;/code&amp;gt; Attribut dann den Bewohner auf &amp;quot;home&amp;quot; oder &amp;quot;absent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== ZWave Türschloss Vision ZM1701 einbinden ==&lt;br /&gt;
Das ZWave Türschloss ZM1701 von der Firma Vision sendet seinen aktuellen Schließstatus in ein einzelnes Reading wie &amp;quot;lock&amp;quot;, sondern schickt eine ganze Reihe von Informationen über den Zustand in das Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das Schließen und Öffnen der Türschlosses wird auch nicht mit einem Setzen des &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; erreicht, sondern mit dem Setzen von &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das macht das Einbinden in homebridge nicht trivial, funktioniert aber über folgendes Homebridge-Mapping:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&lt;br /&gt;
&lt;br /&gt;
Kurz zur Erklärung: Um ein Schloss über HomeKit steuern zu können braucht es zwei characteristics. LockCurrentState zeigt an, ob das Schloss geöffnet oder geschlossen ist. Und mit LockTargetState wird das Schloss geöffnet oder geschlossen. Damit der aktuelle Status des Schlosses ausgelesen werden kann, muss aus dem FHEM-Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; die Zeichenfolge &amp;lt;code&amp;gt; secured&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;unsecured&amp;lt;/code&amp;gt; extrahiert werden, daher die beiden regulären Ausdrücke &amp;lt;code&amp;gt;/\ssecured/&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;/unsecured/&amp;lt;/code&amp;gt;. In der characteristic &amp;lt;code&amp;gt;LockTargetState&amp;lt;/code&amp;gt; muss sowohl der aktuelle Status des Schlosses als auch das Kommando angegeben werden, schließlich möchte man ein geschlossenes Schloss nicht nochmal schließen. Daher wird erst aus dem Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; der aktuelle Status des Schlosses ausgelesen und die damit korrespondierenden Befehle über &amp;lt;code&amp;gt;cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&amp;lt;/code&amp;gt; generiert.&lt;br /&gt;
&lt;br /&gt;
Wer es in FHEM über ein webCmd einfacher zu bedienen haben möchte, fügt bitte noch die dafür notwendigen Attribute und die leicht geänderten homebridgeMappings wie folgt ein:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:close;UNSECURED:open&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; /doorLockOperation open:open/doorLockOperation close:close&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; webCmd open:close&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12191&lt;br /&gt;
 homebridge 0.4.6&lt;br /&gt;
 homebridge-fhem 0.2.48&lt;br /&gt;
&lt;br /&gt;
== Roomba über THINKINGCLEANER Modul ==&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; homebridgeMapping clear On=state,valueOn=/^(on|dock)/,cmdOn=on,cmdOff=off,nocache=1 ChargingState=deviceStatus,values=/(_recon|_full|_trickle)$/:CHARGING;/^.*/:NOT_CHARGING&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; siriName Robby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12680&lt;br /&gt;
 homebridge 0.4.11&lt;br /&gt;
 homebridge-fhem 0.2.66&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>KernSani</name></author>
	</entry>
</feed>