<?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=Moontear</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=Moontear"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Moontear"/>
	<updated>2026-04-30T21:35:42Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=34490</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=34490"/>
		<updated>2020-12-29T15:16:40Z</updated>

		<summary type="html">&lt;p&gt;Moontear: HmIP-BWTH homebridgemapping ergänzt, da es sich vom default unterscheidet und auf ein userReading angewiesen ist&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;
== Mögliche Mappings ==&lt;br /&gt;
Die Möglichen Mappings können hier nachgelesen werden https://github.com/KhaosT/HAP-NodeJS/tree/master/src/lib/gen  insbesondere in HomeKit.ts.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
 Characteristic.Brightness = function() {&lt;br /&gt;
  Characteristic.call(this, &#039;Brightness&#039;, &#039;00000008-0000-1000-8000-0026BB765291&#039;);&lt;br /&gt;
  this.setProps({&lt;br /&gt;
    format: Characteristic.Formats.INT,&lt;br /&gt;
    unit: Characteristic.Units.PERCENTAGE,&lt;br /&gt;
    maxValue: 100,&lt;br /&gt;
    minValue: 0,&lt;br /&gt;
    minStep: 1,&lt;br /&gt;
    perms: [Characteristic.Perms.READ, Characteristic.Perms.WRITE, Characteristic.Perms.NOTIFY]&lt;br /&gt;
  });&lt;br /&gt;
  this.value = this.getDefaultValue();&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Das Mapping in diesem Fall, hat den Titel Brightness.&lt;br /&gt;
&lt;br /&gt;
Die Werte können in 1er Schritten zwischen 0 und 100 liegen (max und min Value)&lt;br /&gt;
== Erstellung eines HomebridgeMappings am Beispiel &amp;quot;Feuchtesensor&amp;quot; ==&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 werden die Readings gemappt:&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;
Der Opus XT300 Bodenfeuchtesensors 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. Bei Eve wird die Temperatur hingegen berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
== BRAVIA Fernseher ==&lt;br /&gt;
Ein Beispiel homebridgeMapping für Sony Bravia Fernseher (iOS 12.2 beta!) und genericDeviceType Television:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clear&lt;br /&gt;
ConfiguredName:model&lt;br /&gt;
Active:state,values=off:INACTIVE;on:ACTIVE,cmds=ACTIVE:on;INACTIVE:off&lt;br /&gt;
RemoteKey:key,cmds=REWIND:remoteControl+Rewind;FAST_FORWARD:remoteControl+FastForward;NEXT_TRACK:remoteControl+NEXT_TRACK;PREVIOUS_TRACK:remoteControl+PREVIOUS_TRACK;ARROW_UP:remoteControl+Up;ARROW_DOWN:remoteControl+Down;ARROW_LEFT:remoteControl+Left;ARROW_RIGHT:remoteControl+Right;SELECT:remoteControl+Ok;BACK:remoteControl+RETURN;EXIT:remoteControl+Exit;PLAY_PAUSE:remoteControl+Play;INFORMATION:remoteControl+Info&lt;br /&gt;
SleepDiscoveryMode:default=ALWAYS_DISCOVERABLE&lt;br /&gt;
ClosedCaptions:default=0&lt;br /&gt;
DisplayOrder:default=Test1&lt;br /&gt;
CurrentMediaState:default=0:currentTitle&lt;br /&gt;
TargetMediaState:default=0,cmds=PLAY:remoteControl+play;PAUSE:remoteControl+pause;STOP:remoteControl+stop;&lt;br /&gt;
PictureMode:default=1&lt;br /&gt;
PowerModeSelection:default=1,cmds=0:remoteControl+options&lt;br /&gt;
ActiveIdentifier:input,default=0,values=/tv.dvbt|TV...DVB-T/:1;/HDMI.3/:2,cmds=1:input+TV+/+DVB-T;2:input+HDMI+3/ARC;3:application+Plex&lt;br /&gt;
TelevisionSpeaker#Mute=mute&lt;br /&gt;
 Active:default=ACTIVE&lt;br /&gt;
 VolumeSelector:volume,cmds=INCREMENT:VolumeUp;DECREMENT:VolumeDown&lt;br /&gt;
 VolumeControlType:default=RELATIVE_WITH_CURRENT&lt;br /&gt;
 linkedTo=Television&lt;br /&gt;
InputSource(1)#Identifier:default=1&lt;br /&gt;
 ConfiguredName:default=TV&lt;br /&gt;
 IsConfigured:default=CONFIGURED&lt;br /&gt;
 InputSourceType:default=TUNER&lt;br /&gt;
 CurrentVisibilityState:default=SHOWN&lt;br /&gt;
 linkedTo=Television&lt;br /&gt;
InputSource(2)#Identifier:default=2&lt;br /&gt;
 ConfiguredName:default=APPLE+TV&lt;br /&gt;
 IsConfigured:default=CONFIGURED&lt;br /&gt;
 InputSourceType:default=HDMI&lt;br /&gt;
 CurrentVisibilityState:default=SHOWN&lt;br /&gt;
 linkedTo=Television&lt;br /&gt;
InputSource(3)#Identifier:default=3&lt;br /&gt;
 ConfiguredName:default=PLEX&lt;br /&gt;
 IsConfigured:default=CONFIGURED&lt;br /&gt;
 InputSourceType:default=APPLICATION&lt;br /&gt;
 CurrentVisibilityState:default=SHOWN&lt;br /&gt;
 linkedTo=Television&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
damit lässt sich der Fernseher über Siri/Homekit ein- und ausschalten sowie über das appleTV Control-Center Widget steuern.&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 {{Link2Forum|Topic=48558|Message=402024|LinkText=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 {{Link2Forum|Topic=48558|Message=402024|LinkText=homebridge/homekit}}&lt;br /&gt;
&lt;br /&gt;
Eine noch etwas bessere Schaltmöglichkeit bietet &#039;&#039;&#039;genericDeviceType security&#039;&#039;&#039;.&lt;br /&gt;
Das Mapping für ROOMMATE sieht wie folgt aus:&lt;br /&gt;
 attr TYPE=ROOMMATE genericDeviceType security&lt;br /&gt;
 attr TYPE=ROOMMATE homebridgeMapping SecuritySystemCurrentState=state,values=/home|awoken/:0;;absent:1;;/asleep|gotosleep/:2;;gone:3 SecuritySystemTargetState=SecuritySystemCurrentState,cmds=0:state+home;;1:state+absent;;2:state+gotosleep;;3:state+gone,delay=1&lt;br /&gt;
für GUEST:&lt;br /&gt;
 attr TYPE=GUEST genericDeviceType security&lt;br /&gt;
 attr TYPE=GUEST homebridgeMapping SecuritySystemCurrentState=state,values=/home|awoken/:0;;absent:1;;/asleep|gotosleep/:2;;none:3 SecuritySystemTargetState=SecuritySystemCurrentState,cmds=0:state+home;;1:state+absent;;2:state+gotosleep;;3:state+none,delay=1&lt;br /&gt;
&lt;br /&gt;
== Homematic Luftfeuchtigkeits- und Temperatursensoren ==&lt;br /&gt;
&lt;br /&gt;
Mit folgenden Geräten wurde folgendes Mapping erstellt und somit erfolgreich getestet:&lt;br /&gt;
&lt;br /&gt;
 - HM-WDS10-TH-O&lt;br /&gt;
 - HM-WDS40-TH-I&lt;br /&gt;
 - HM-WDS40-TH-I-2&lt;br /&gt;
&lt;br /&gt;
Achtung: Hier wird genericDeviceType &amp;quot;TemperatureSensor&amp;quot; verwendet, um eine history in EVE zu erhalten. Mit einem &amp;quot;HumiditySensor&amp;quot; funktionierte dies bei den Tests (Februar 2019) nicht.&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;THSensor&amp;gt; genericDeviceType TemperatureSensor&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;THSensor&amp;gt;      CurrentRelativeHumidity=humidity&lt;br /&gt;
                      CurrentTemperature=temperature&lt;br /&gt;
                      StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;/^.*/:BATTERY_LEVEL_LOW&lt;br /&gt;
                      history:size=1024&lt;br /&gt;
&lt;br /&gt;
== Homematic SmokeDetector HM-SEC-SD und HM-SEC-SD2 ==&lt;br /&gt;
 [[Datei:Homebridge-Homematic-Smokedetector-Gen1.jpg|mini|Homebridge-Homematic-Smokedetector-Gen1 in EVE]]&lt;br /&gt;
Es sind keine Homebridge Mappings für die Rauch Meldung erforderlich.&lt;br /&gt;
&lt;br /&gt;
Allerdings ist ein Mapping für den Batterie Zustand nötig, siehe Unten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;SmokeDetector&amp;gt; genericDeviceType SmokeSensor&lt;br /&gt;
 attr &amp;lt;SmokeDetector&amp;gt; subType smokeDetector&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;SmokeDetector&amp;gt; homebridgeMapping StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;;/^.*/:BATTERY_LEVEL_LOW&lt;br /&gt;
&lt;br /&gt;
== Homematic Heizkörperthermostat HM-CC-RT-DN ==&lt;br /&gt;
[[Datei:HM-CC-RT-DN-Eve.PNG|mini|Darstellung des HM-CC-RT-DN in der iOS App Eve]]&lt;br /&gt;
 attr &amp;lt;HMCCRTDN_Channel2_Clima&amp;gt; homebridgeMapping TargetTemperature=desired-temp::desired-temp,minValue=5,maxValue=35,minStep=0.5,nocache=1&lt;br /&gt;
                      CurrentTemperature=BU_Heizung_01_Clima:measured-temp,nocache=1&lt;br /&gt;
                      StatusLowBattery=BU_Heizung_01:battery,values=ok:BATTERY_LEVEL_NORMAL;;/^.*/:BATTERY_LEVEL_LOW&lt;br /&gt;
                      TargetHeatingCoolingState=heatingState,values=OFF:0;;HEAT:1;;COOL:2;;AUTO:3,cmds=OFF:controlManu+off;;HEAT:controlMode+boost;;AUTO:controlMode+auto;;COOL:controlManu+17.0&lt;br /&gt;
                      CurrentHeatingCoolingState=heatingState,values=OFF:0;;HEAT:1;;COOL:2;;AUTO:0,valud=OFF&lt;br /&gt;
 attr &amp;lt;HMCCRTDN_Channel2_Clima&amp;gt; siriName Robby&lt;br /&gt;
Dieses Mapping bezieht sich auf ein vorhandenes &#039;&#039;userReading&#039;&#039; mit dem Namen &amp;lt;code&amp;gt;heatingState&amp;lt;/code&amp;gt;, womit Homekit die einzelnen Status nachher unterscheidet.&lt;br /&gt;
 attr &amp;lt;HM-CC-RT-DN_Clima&amp;gt; userReadings heatingState {(ReadingsVal($NAME,&amp;quot;ValvePosition&amp;quot;,0) &amp;gt; 0 || ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;on&amp;quot;) ? &amp;quot;HEAT&amp;quot; : ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;off&amp;quot; ? &amp;quot;OFF&amp;quot; : ReadingsVal($NAME,&amp;quot;controlMode&amp;quot;,&amp;quot;auto&amp;quot;) eq &amp;quot;auto&amp;quot; ? &amp;quot;AUTO&amp;quot; : (ReadingsVal($NAME,&amp;quot;measured-temp&amp;quot;,20) &amp;gt; ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,20)) ? &amp;quot;COOL&amp;quot; : &amp;quot;AUTO&amp;quot;}&lt;br /&gt;
Global auf alle in FHEM angelegten HM-CC-RT-DN, lässt sich mit folgendem Befehl das &#039;&#039;userReading&#039;&#039; anlegen.&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,59211.msg505986.html#msg505986 Forumsthread].&lt;br /&gt;
&lt;br /&gt;
 attr TYPE=CUL_HM:FILTER=model=HM-CC-RT-DN:FILTER=chanNo=04 userReadings heatingState {(ReadingsVal($NAME,&amp;quot;ValvePosition&amp;quot;,0) &amp;gt; 0 || ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;on&amp;quot;) ? &amp;quot;HEAT&amp;quot; : ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;off&amp;quot; ? &amp;quot;OFF&amp;quot; : ReadingsVal($NAME,&amp;quot;controlMode&amp;quot;,&amp;quot;auto&amp;quot;) eq &amp;quot;auto&amp;quot; ? &amp;quot;AUTO&amp;quot; : (ReadingsVal($NAME,&amp;quot;measured-temp&amp;quot;,20) &amp;gt; ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,20)) ? &amp;quot;COOL&amp;quot; : &amp;quot;AUTO&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
== Homematic IP Wandthermostat mit Schaltausgang HmIP-BWTH ==&lt;br /&gt;
 attr &amp;lt;HmIP_BWTH_Thermostat&amp;gt; homebridgeMapping TargetTemperature=1.SET_POINT_TEMPERATURE::1.SET_POINT_TEMPERATURE,,minValue=17,maxValue=25,minStep=0.5,cmd=control,nocache=true&lt;br /&gt;
                                                  CurrentTemperature=1.ACTUAL_TEMPERATURE&lt;br /&gt;
                                                  CurrentHeatingCoolingState=heatingState,values=HEAT:1;COOL:2;OFF:0;AUTO:0&lt;br /&gt;
                                                  TargetHeatingCoolingState=heatingState,values=OFF:0;HEAT:1;COOL:2;AUTO:3,cmds=OFF:datapoint+1.CONTROL_MODE+1;HEAT:datapoint+1.BOOST_MODE+1;COOL:datapoint+1.BOOST_MODE+0;AUTO:datapoint+1.CONTROL_MODE+0&lt;br /&gt;
                                                  CurrentRelativeHumidity=1.HUMIDITY&lt;br /&gt;
&lt;br /&gt;
Dieses Mapping bezieht sich auf ein vorhandenes &#039;&#039;userReading&#039;&#039; mit dem Namen &amp;lt;code&amp;gt;heatingState&amp;lt;/code&amp;gt;, womit Homekit die einzelnen Status nachher unterscheidet.&lt;br /&gt;
 attr &amp;lt;HmIP_BWTH_Thermostat&amp;gt; userReadings heatingState {(ReadingsVal($NAME,&amp;quot;10.STATE&amp;quot;,0) eq 1 &amp;amp;&amp;amp; ReadingsVal($NAME,&amp;quot;1.HEATING_COOLING&amp;quot;,0) eq 0) ? &amp;quot;HEAT&amp;quot; : ReadingsVal($NAME,&amp;quot;1.SET_POINT_TEMPERATURE&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;off&amp;quot; ? &amp;quot;OFF&amp;quot; : ReadingsVal($NAME,&amp;quot;1.SET_POINT_MODE&amp;quot;,&amp;quot;-&amp;quot;) eq 0 ? &amp;quot;AUTO&amp;quot; : (ReadingsVal($NAME,&amp;quot;10.STATE&amp;quot;,0) eq 1 &amp;amp;&amp;amp; ReadingsVal($NAME,&amp;quot;1.HEATING_COOLING&amp;quot;,0) eq 1) ? &amp;quot;COOL&amp;quot; : &amp;quot;OFF&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
== Homematic Wetterstation OC3 HM-WDS100-C6-O-2 ==&lt;br /&gt;
[[Datei: homebridge-wetter.jpg|mini|Wetterstation in EVE]]&lt;br /&gt;
Mit der EVE und den hier: [https://github.com/naofireblade/homebridge-weather-plus/blob/master/util/characteristics.js] beschriebenen Characteristics lässt sich eine lokale Homematic OC3 Wetterstation aus FHEM einbinden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clear&lt;br /&gt;
CurrentTemperature:temperature&lt;br /&gt;
CurrentRelativeHumidity:humidity&lt;br /&gt;
49C8AE5A-A3A5-41AB-BF1F-12D5654F9F41:windSpeed,name=WINDGESCHWINDIGKEIT,format=FLOAT,unit=kmh,maxValue=250,minValue=0,minStep=1&lt;br /&gt;
46f1284c-1912-421b-82f5-eb75008b167e:windDirection,name=WINDRICHTUNG,format=UINT8,unit=ARC_DEGREE,maxValue=360,minValue=0,minStep=1&lt;br /&gt;
StatusLowBattery:battery,values=ok:BATTERY_LEVEL_NORMAL;/^.*/:BATTERY_LEVEL_LOW &lt;br /&gt;
ccc04890-565b-4376-b39a-3113341d9e0f:RegenmengeLast24Hours:state,name=REGEN_24h,format=FLOAT,unit=mm,maxValue=100,minValue=0,minStep=1 &lt;br /&gt;
10c88f40-7ec4-478c-8d5a-bd0c3cce14b7:RegenmengeLast1Hours:state,name=REGEN_1h,format=FLOAT,unit=mm,maxValue=100,minValue=0,minStep=1 &lt;br /&gt;
0000006B-0000-1000-8000-0026BB765291:brightness,name=BRIGHTNESS,format=FLOAT,unit=LUX,maxValue=10000,minValue=0,minStep=.0001 &lt;br /&gt;
cd65a9ab-85ad-494a-b2bd-2f380084134c:isRaining,name=BEDINGUNGKATEGORIE,values=0:0;1:2,format=UINT8,maxValue=3,minValue=0,minStep=1 &lt;br /&gt;
cd65a9ab-85ad-494a-b2bd-2f380084134d:isRaining,name=BEDINGUNG,format=STRING,values=0:-;/.*/:Regen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
== Vallox Belüftungsanlage ==&lt;br /&gt;
Die Steuerung der Lüftungsgeschwindigkeit ist nur in Prozent möglich. Die Umrechnung erfolgt im [[Vallox]] Modul.&lt;br /&gt;
Hierzu wurde das Reading &#039;&#039;FanSpeedPct&#039;&#039; hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;Vallox&amp;gt; genericDeviceType Fan&lt;br /&gt;
 attr &amp;lt;Vallox&amp;gt; homebridgeMapping clear&lt;br /&gt;
                      model=Vallox&lt;br /&gt;
                      On=PowerState,valueOn=1,readOnly=1&lt;br /&gt;
                      RotationSpeed=FanSpeedPct,minValue=1,maxValue=100,cmd=FanSpeedPct,delay=1&lt;br /&gt;
&lt;br /&gt;
== Xiaomi Vacuum Cleaner 1. Generation ==&lt;br /&gt;
[[Datei:XIAOMI_VACUUM_CLEANER-Gen1.jpg|mini|XIAOMI VACUUM 1. GEN in EVE]]&lt;br /&gt;
Voraussetzung zur Verwendung der Mappings, ist ein eingebundener Staubsauger mit dem Modul 72_XiaomiDevice.&lt;br /&gt;
&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,73052.0.html Forumsthread]&lt;br /&gt;
Das Modul muss manuell installiert werden.&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; homebridgeMapping On=state,valueOn=Cleaning,cmdOn=start,cmdOff=charge&lt;br /&gt;
                      RotationSpeed=fan_power,minValue=0,maxValue=90,cmd=fan_power,delay=1&lt;br /&gt;
                      BatteryLevel=batteryLevel,maxValue=100,minValue=0,minStep=1&lt;br /&gt;
                      StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;;low:BATTERY_LEVEL_LOW&lt;br /&gt;
                      ChargingState=state,values=Docked:NOT_CHARGING;;Charging:CHARGING;;/.*/:NOT_CHARGEABLE&lt;br /&gt;
                      OccupancyDetected=state,values=/Docked|Charging/:OCCUPANCY_DETECTED;;/.*/:OCCUPANCY_NOT_DETECTED&lt;br /&gt;
                      FilterLifeLevel=consumables_filter,minValue=0,maxValue=100&lt;br /&gt;
                      FilterChangeIndication=consumables_filter,values=0:CHANGE_FILTER&lt;br /&gt;
&lt;br /&gt;
== Roborock S50 (2. Generation des Xiaomi Vacuum Cleaners) ==&lt;br /&gt;
[[Datei:Roborock S50.png|mini]]&lt;br /&gt;
Voraussetzung zur Verwendung der Mappings, ist ein eingebundener Staubsauger mit dem Modul 72_XiaomiDevice.&lt;br /&gt;
&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,73052.0.html Forumsthread]&lt;br /&gt;
Das Modul muss manuell installiert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Mapping für den Roborook S50 beinhaltet neben den Characteristics der 1. Genration des Xiaomi Vacuum Cleaners weitere Custom Mappings. Diese werden auch auf dem Bild dargestellt. Falls das einem zu viele Informationen sind, können diese beim Einfügen einfach weggelassen oder in EVE ausgeblendet werden.&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; homebridgeMapping On=state,valueOn=Cleaning,cmdOn=start,cmdOff=charge&lt;br /&gt;
                      RotationSpeed=fan_power,minValue=0,maxValue=90,cmd=fan_power,delay=1&lt;br /&gt;
                      BatteryLevel=batteryPercent,maxValue=100,minValue=0,minStep=1&lt;br /&gt;
                      StatusLowBattery=batteryState,values=ok:BATTERY_LEVEL_NORMAL;;low:BATTERY_LEVEL_LOW&lt;br /&gt;
                      ChargingState=state,values=Docked:NOT_CHARGING;;Charging:CHARGING;;/.*/:NOT_CHARGEABLE&lt;br /&gt;
                      OccupancyDetected=state,values=/Docked|Charging/:OCCUPANCY_DETECTED;;/.*/:OCCUPANCY_NOT_DETECTED&lt;br /&gt;
                      2af6d0d0-3691-4f0d-9c9c-c1098295b1cb=consumables_sensors,name=Reinigung+Sensoren,minValue=0,maxValue=100,format=FLOAT,minStep=1,unit=%&lt;br /&gt;
                      fd11b965-052e-430f-b08f-206287d8bc00=consumables_filter,name=Austausch+Filter,minValue=0,maxValue=100,format=FLOAT,minStep=1,unit=%&lt;br /&gt;
                      fe7a8dac-dff3-4a07-8a5e-0d6abbf0df0c=consumables_main_brush,name=Austausch+Hauptbürste,minValue=0,maxValue=100,format=FLOAT,minStep=1,unit=%&lt;br /&gt;
                      4f9b2a22-b764-4fc1-8cd2-99383924394c=consumables_side_brush,name=Austausch+Seitenbürste,minValue=0,maxValue=100,format=FLOAT,minStep=1,unit=%&lt;br /&gt;
                      FilterLifeLevel=consumables_filter,minValue=0,maxValue=100&lt;br /&gt;
                      FilterChangeIndication=consumables_filter,values=0:CHANGE_FILTER&lt;br /&gt;
                      4896763a-26f7-400b-9734-2ce6564ceba2=total_clean_time,name=Lebenszeitersparnis,format=FLOAT,minStep=1,unit=h&lt;br /&gt;
                      82af5fd7-50a3-4ab3-81d3-1f7903de612a=total_clean_area,name=Gereinigte+Fläche,format=FLOAT,minStep=1,unit=m²&lt;br /&gt;
                      00d2ef14-b429-4569-8af3-c342d41cf383=total_cleans,name=Reinigungsvorgänge,format=FLOAT,minStep=1&lt;br /&gt;
                      e8d1027e-b068-40d5-9efd-f161b1b52774=device_firmware,name=Firmware,format=STRING&lt;br /&gt;
&lt;br /&gt;
== Xiaomi Fan (ältere Generationen mit Luftfeuchtigkeits- und Temperatursensor und Battery-Readings) ==&lt;br /&gt;
[[Datei:Xiaomi DC Pedestal Fan.png|mini]]&lt;br /&gt;
Voraussetzung zur Verwendung der Mappings, ist ein eingebundener Ventilator mit dem Modul 72_XiaomiDevice.&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,73052.0.html Forumsthread]&lt;br /&gt;
Das Modul muss manuell installiert werden.&lt;br /&gt;
&lt;br /&gt;
Die ältere Generation enthält Sensoren und somit Readings für Luftfeuchtigkeit, Temperatur und auch Batteriestatus. Diese fehlen bei den neueren Generation dieses Ventilators, siehe Bilder. Da anscheinend jedes Jahr neue Generationen dieses Ventilators herausgekommen sind, ist nicht klar bis zu welcher Generation diese Sensoren enthalten waren.&lt;br /&gt;
&lt;br /&gt;
Mit folgenden Geräten wurde folgendes Mapping erstellt und somit erfolgreich getestet:&lt;br /&gt;
&lt;br /&gt;
 - Xiaomi DC Pedestal Fan (FHEM model fehlt, Default Hostname am Router: zhimi-fan-v3)&lt;br /&gt;
 - Liste bitte ergänzen!&lt;br /&gt;
&lt;br /&gt;
Um möglichst viele Funktionen bereitzustellen, wurden auch Characteristics von anderen DeviceTypes verwendet. Erklärung zu den Characteristics:&lt;br /&gt;
&lt;br /&gt;
 - Die Kindersicherung (LockPhysicalControls) ist in Eve über das kleine Einstellungssymbol zu finden. &lt;br /&gt;
 - Mit AudioFeedback/Audio-Bestätigung werden die Töne des Lüfters ein bzw. ausgeschaltet.&lt;br /&gt;
 - Mit NightVision/Nachtsicht werden die LEDs ein (bright) bzw. ausgeschaltet (off).&lt;br /&gt;
 - Mit Mute/Audio wird der Windmodus von Straight zu Natural geschaltet.&lt;br /&gt;
 - Mit TargetTiltAngle/Neigung kann der Schwenkwinkel justiert werden.&lt;br /&gt;
 - Mit SwingMode/Schwenken kann der Schwenkmodus ein bzw. ausgeschaltet werden.&lt;br /&gt;
 - Der Rest ist selbsterklärend.&lt;br /&gt;
&lt;br /&gt;
homebridgeMapping:&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; genericDeviceType Fan&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; homebridgeMapping&lt;br /&gt;
                      clear&lt;br /&gt;
                      On:power,cmdOn=on,cmdOff=off,valueOn=on,valueOff=off&lt;br /&gt;
                      LockPhysicalControls=child_lock,values=on:CONTROL_LOCK_ENABLED;;off:CONTROL_LOCK_DISABLED,cmds=CONTROL_LOCK_ENABLED:child_lock+on;CONTROL_LOCK_DISABLED:child_lock+off&lt;br /&gt;
                      RotationSpeed=level,minValue=0,maxValue=100,cmd=level,delay=1&lt;br /&gt;
                      TargetTiltAngle=angle,minValue=30,maxValue=120,minStep=30,cmd=angle&lt;br /&gt;
                      SwingMode=angle_enable,values=on:SWING_ENABLED;;off:SWING_DISABLED,cmdOn=angle_enable+on,cmdOff=angle_enable+off&lt;br /&gt;
                      CurrentRelativeHumidity=humidity&lt;br /&gt;
                      CurrentTemperature=temperature&lt;br /&gt;
                      BatteryLevel=batteryPercent,maxValue=100,minValue=0,minStep=1&lt;br /&gt;
                      StatusLowBattery=batteryState,values=ok:BATTERY_LEVEL_NORMAL;;low:BATTERY_LEVEL_LOW&lt;br /&gt;
                      ChargingState=charging,values=complete:NOT_CHARGING;;progress:CHARGING;;/.*/:NOT_CHARGEABLE&lt;br /&gt;
                      AudioFeedback:buzzer,cmdOn=buzzer+on,cmdOff=buzzer+off,valueOn=on,valueOff=off&lt;br /&gt;
                      NightVision:led,cmdOn=led+off,cmdOff=led+bright,valueOn=off,valueOff=bright&lt;br /&gt;
                      Mute:mode,cmdOn=mode+straight,cmdOff=mode+natural,valueOn=straight,valueOff=natural&lt;br /&gt;
                      CurrentFanState:power,values=on:BLOWING_AIR;;off:INACTIVE;;/.*/:IDLE&lt;br /&gt;
&lt;br /&gt;
== Xiaomi Fan (neuere Generationen ohne Luftfeuchtigkeits- und Temperatursensor und Battery-Readings) ==&lt;br /&gt;
[[Datei:Xiaomi Standing Fan 2 bzw. 2S.png|mini]]&lt;br /&gt;
Voraussetzung zur Verwendung der Mappings, ist ein eingebundener Ventilator mit dem Modul 72_XiaomiDevice.&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,73052.0.html Forumsthread]&lt;br /&gt;
Das Modul muss manuell installiert werden.&lt;br /&gt;
&lt;br /&gt;
Den neueren Generationen dieses Ventilators fehlen Sensoren und somit Readings für Luftfeuchtigkeit, Temperatur und auch Batteriestatus. Diese sind bei der älteren Generation dieses Ventilators enthalten, siehe vorangegangenes Beispiel.&lt;br /&gt;
&lt;br /&gt;
Dieses Mapping wurde mit dem &amp;quot;2S&amp;quot; erstellt. Es sollte aber mindestens auch mit einem &amp;quot;Xiaomi Standing Fan 2&amp;quot; (ohne Akku) funktionieren, da auch der &amp;quot;Xiaomi Standing Fan 2S&amp;quot; (mit Akku) kein Reading für die Batterie bereitstellt. Ansonsten gibt es wohl auch noch Generationen zwischen dem &amp;quot;Xiaomi DC Pedestal Fan&amp;quot; und den &amp;quot;Xiaomi Standing Fan 2/2S&amp;quot;. Es ist davon auszugehen, dass dieses Beispiel genauso auch bei diesen Modellen funktioniert.&lt;br /&gt;
&lt;br /&gt;
Mit folgenden Geräten wurde folgendes Mapping erstellt und somit erfolgreich getestet:&lt;br /&gt;
&lt;br /&gt;
 - 2019 Xiaomi Standing Fan 2S (FHEM model bzw. Default Hostname am Router: zhimi-fan-za4)&lt;br /&gt;
 - 2018 Xiaomi ZhiMiDCVariableFrequencyFan ZRFFS01ZM (FHEM model bzw. Default Hostname am Router: zhimi-fan-za1)&lt;br /&gt;
 - Liste bitte ergänzen!&lt;br /&gt;
&lt;br /&gt;
Um möglichst viele Funktionen bereitzustellen, wurden auch Characteristics von anderen DeviceTypes verwendet. Erklärung zu den Characteristics:&lt;br /&gt;
&lt;br /&gt;
 - Die Kindersicherung (LockPhysicalControls) ist in Eve über das kleine Einstellungssymbol zu finden. &lt;br /&gt;
 - Mit AudioFeedback/Audio-Bestätigung werden die Töne des Lüfters ein bzw. ausgeschaltet.&lt;br /&gt;
 - Mit NightVision/Nachtsicht werden die LEDs ein (bright) bzw. ausgeschaltet (off).&lt;br /&gt;
 - Mit Mute/Audio wird der Windmodus von Straight zu Natural geschaltet.&lt;br /&gt;
 - Mit TargetTiltAngle/Neigung kann der Schwenkwinkel justiert werden.&lt;br /&gt;
 - Mit SwingMode/Schwenken kann der Schwenkmodus ein bzw. ausgeschaltet werden.&lt;br /&gt;
 - Der Rest ist selbsterklärend.&lt;br /&gt;
&lt;br /&gt;
homebridgeMapping:&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; genericDeviceType Fan&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; homebridgeMapping &lt;br /&gt;
                      clear&lt;br /&gt;
                      On:power,cmdOn=on,cmdOff=off,valueOn=on,valueOff=off&lt;br /&gt;
                      LockPhysicalControls=child_lock,values=on:CONTROL_LOCK_ENABLED;;off:CONTROL_LOCK_DISABLED,cmds=CONTROL_LOCK_ENABLED:child_lock+on;CONTROL_LOCK_DISABLED:child_lock+off&lt;br /&gt;
                      RotationSpeed=level,minValue=0,maxValue=100,cmd=level,delay=1&lt;br /&gt;
                      TargetTiltAngle=angle,minValue=30,maxValue=120,minStep=30,cmd=angle&lt;br /&gt;
                      SwingMode=angle_enable,values=on:SWING_ENABLED;;off:SWING_DISABLED,cmdOn=angle_enable+on,cmdOff=angle_enable+off&lt;br /&gt;
                      AudioFeedback:buzzer,cmdOn=buzzer+on,cmdOff=buzzer+off,valueOn=on,valueOff=off&lt;br /&gt;
                      NightVision:led,cmdOn=led+off,cmdOff=led+bright,valueOn=off,valueOff=bright&lt;br /&gt;
                      Mute:mode,cmdOn=mode+straight,cmdOff=mode+natural,valueOn=straight,valueOff=natural&lt;br /&gt;
                      CurrentFanState:power,values=on:BLOWING_AIR;;off:INACTIVE;;/.*/:IDLE&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;
 [[Kategorie:HOWTOS]]&lt;br /&gt;
 &lt;br /&gt;
 [[Kategorie:Sprachsteuerung]]&lt;br /&gt;
 &lt;br /&gt;
 [[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DeviceOverview_anpassen&amp;diff=32723</id>
		<title>DeviceOverview anpassen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DeviceOverview_anpassen&amp;diff=32723"/>
		<updated>2020-02-13T16:01:51Z</updated>

		<summary type="html">&lt;p&gt;Moontear: /* STATE */ Beispiel hinzugefügt für Perl-Code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite enthält einen systematischen Überblick über die verschiedenen Attribute, mit deren Hilfe das Erscheinungsbild und die Funktionalität eines [[Gerät|Geräts]] in [[FHEMWEB]] eingestellt und verändert werden kann. Dabei geht es im Folgenden um den sogenannten &#039;&#039;deviceOverview&#039;&#039;, mit der ein Gerät in der Raumdarstellung erscheint, wobei hier nur das Erscheinungsbild in f18 auf einem großen Bildschirm behandelt wird.&lt;br /&gt;
&lt;br /&gt;
==Überblick==&lt;br /&gt;
===Attribute===&lt;br /&gt;
Es stehen für alle Geräte in FHEM folgende Attribute zur Verfügung, die sich teilweise wechselseitig beeinflussen und überlagern:&lt;br /&gt;
*{{Link2CmdRef|Lang=de|Anker=icon|Label=icon}}&lt;br /&gt;
*[[webCmd]]&lt;br /&gt;
*[[eventMap]]&lt;br /&gt;
*{{Link2CmdRef|Lang=de|Anker=webCmdLabel|Label=webCmdLabel}}&lt;br /&gt;
*{{Link2CmdRef|Lang=de|Anker=cmdIcon|Label=cmdIcon}}&lt;br /&gt;
*{{Link2CmdRef|Lang=de|Anker=widgetOverride|Label=widgetOverride}}&lt;br /&gt;
*{{Link2CmdRef|Lang=de|Anker=stateFormat|Label=stateFormat}}&lt;br /&gt;
*[[devStateIcon]]&lt;br /&gt;
{{Hinweis|Wer einen schnellen Überblick über die diversen Widgets und webCmdLabel sucht, kann [[FHEMWEB/Widgets|hier]] fündig werden.}}&lt;br /&gt;
&lt;br /&gt;
===Allgemeines zum deviceOverview===&lt;br /&gt;
Grundsätzlich ist der deviceOverview in verschiedene &#039;&#039;&#039;Bereiche&#039;&#039;&#039; eingeteilt, die zum Teil nur mit Inhalten gefüllt werden, wenn auch ein entsprechendes Attribut vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;icon&#039;&#039; &amp;lt;Gerätename&amp;gt; &#039;&#039;STATE&#039;&#039;/&#039;&#039;devStateIcon&#039;&#039; &#039;&#039;webCmd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beispiele: &lt;br /&gt;
* ein &#039;&#039;icon&#039;&#039; wird nur angezeigt, wenn das entsprechende Attribut spezifiziert ist. Ansonsten beginnt der deviceOverview mit dem Gerätenamen.&lt;br /&gt;
* ist ein &#039;&#039;devStateIcon&#039;&#039; spezifiziert, verdrängt dieses in der Regel die &#039;&#039;STATE&#039;&#039;-Darstellung&lt;br /&gt;
* entsprechendes gilt ggf. für eine eventMap&lt;br /&gt;
* ist keines der genannten Attribut definiert und vom jeweiligen Modul wird kein &#039;&#039;set&#039;&#039; bereitgestellt, besteht die Ansicht nur aus dem Gerätenamen und dem derzeitigen Inhalt des Internals &#039;&#039;STATE&#039;&#039;. &#039;&#039;STATE&#039;&#039; wird dabei mangels stateFormat-Attribut aus dem Reading &#039;&#039;state&#039;&#039; abgeleitet. Ist auch dieses nicht vorhanden, erscheinen drei ???.&lt;br /&gt;
&lt;br /&gt;
==webCmd &amp;amp; Co==&lt;br /&gt;
Der rechte Bereich wird mit Hilfe der Attribute webCmd, eventMap, cmdIcon, widgetOverride und webCmdLabel beeinflußt.&lt;br /&gt;
Dabei bestimmt webCmd, welche Kommandos angezeigt werden, mit eventMap&amp;lt;ref&amp;gt;dabei sind komplexere Perl-Angaben möglich, z.B. &amp;lt;code&amp;gt; attr tasmota_test eventMap { dev=&amp;gt;{&#039;^(.*)POWER(.?): OFF$&#039;=&amp;gt;&#039;$1POWER$2: off&#039;, &#039;^(.*)POWER(.?): ON$&#039;=&amp;gt;&#039;$1POWER$2: on&#039;} }&amp;lt;/code&amp;gt; &amp;lt;/ref&amp;gt; werden diese intern ggf. in andere (Modul-)Befehle bzw. Reading-Inhalte umgewandelt und cmdIcon ermöglicht es, den Kommando-Text durch Symbole zu ersetzen. Mittels webCmdLabel kann eine Beschriftung vorangestellt werden und widgetOverride ein anderes Widget ausgewählt werden, als das, das für das Setzen eines bestimmten Readings standardmäßig verwendet wird. Weitere Hinweise zu diesen Attributen sind den oben verlinkten Artikeln zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
Hier soll anhand eines virtuellen Tür- oder Fensterkontakts die Funktionsweise der verschiedenen Attribute erläutert werden. Dazu wird zunächst mit &amp;lt;code&amp;gt;define Virtueller_Tuerkontakt CUL_HM 112233&amp;lt;/code&amp;gt; ein CUL_HM-Gerät generiert und mit &amp;lt;code&amp;gt;set Virtueller_Tuerkontakt virtual 1&amp;lt;/code&amp;gt; ein weiteres CUL_HM-Gerät für dessen ersten Kanal. Diesen &amp;lt;code&amp;gt;Virtueller_Tuerkontakt_Btn1&amp;lt;/code&amp;gt; verwenden wir im Folgenden. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtueller Btn 1 neu erstellt.png]]&lt;br /&gt;
&lt;br /&gt;
Dieser hat zunächst einen unbekannten STATE (&#039;&#039;???&#039;&#039;) und ein bereits gesetzes webCMD-Attribut &#039;&#039;press short:press long&#039;&#039;. Für die Verwendung als Tuerkontakt soll dieser jedoch nicht kurze oder lange Tastendrücke als Information versenden, sondern soll offen- bzw. geschlossen-Nachrichten senden. Wir ändern das daher und klicken auf eines der angebotenen webCmd. &lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 webCmd postEvent open:postEvent closed&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtueller TK postEvent.png]]&lt;br /&gt;
&lt;br /&gt;
Da dies nicht unbedingt optisch ansprechend ist, und wir vielleicht lieber eine Anzeige in unserer Sprache haben wollen, übersetzten wir das zwischen unserer Sprache und der des Türkontakts. Hierfür ändern wir das webCmd-Attribut auf &#039;&#039;offen:geschlossen&#039;&#039; und ergänzen  &lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 eventMap /postEvent open:offen/postEvent closed:geschlossen/&lt;br /&gt;
Da hier die zu übersetzenden Befehle Leerzeichen enthalten, muss statt des eigentlich üblichen Leerzeichens als Trenner zwischen den einzelnen Angaben etwas anderes festgelegt werden, hier wird &amp;quot;/&amp;quot; verwendet. Wenn jetzt &#039;&#039;offen&#039;&#039; gedrückt wird, sehen wir, dass sich nicht nur die Anzeige geändert hat:&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebCmd offen geschlossen.png]]&lt;br /&gt;
&lt;br /&gt;
Jetzt sind auch state bzw. STATE und die Anzeige des entsprechenden Bereichs nicht mehr deckungsgleich. In state ist &#039;&#039;set_postEvent open&#039;&#039; enthalten, in der Anzeige erscheint aber &#039;&#039;set_offen&#039;&#039;.  &lt;br /&gt;
Um statt des Texts ein passendes Symbol anzuzeigen, legen wir nun ein cmdIcon-Attribut fest:&lt;br /&gt;
  attr Virtueller_Tuerkontakt_Btn1 cmdIcon offen:fts_door_slide_open geschlossen:fts_door_slide&lt;br /&gt;
&lt;br /&gt;
[[Datei:Tuerkontakt cmdIcon.png]]&lt;br /&gt;
&lt;br /&gt;
Wer es farbig mag:&lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 cmdIcon offen:fts_door_slide_open@red geschlossen:fts_door_slide@green&lt;br /&gt;
Mit vorangestellter Beschreibung: &lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 webCmdLabel Auf:Zu&lt;br /&gt;
&lt;br /&gt;
==STATE==&lt;br /&gt;
Ist kein &#039;&#039;stateFormat&#039;&#039; und kein &#039;&#039;devStateIcon&#039;&#039; spezifiziert, enthält der Bereich &amp;quot;STATE&amp;quot; den aktuellen Inhalt des Readings &#039;&#039;state&#039;&#039;.&lt;br /&gt;
===stateFormat===&lt;br /&gt;
Mit diesem Attribut kann festgelegt werden, welcher Textinhalt für &#039;&#039;STATE&#039;&#039; verwendet werden soll. Es kann z.B. einfach eine Einheit hinzugefügt werden:&lt;br /&gt;
 attr Aussentemperatur_Nord stateFormat state °C&lt;br /&gt;
&lt;br /&gt;
[[Datei:DevState Text mit formatiertem state.png]]&lt;br /&gt;
&lt;br /&gt;
Oder es können die Inhalte mehrerer Readings übernommen und formatiert werden: &lt;br /&gt;
 attr MYSENSOR_97 stateFormat T: temperature2°C, H: humidity3%rH, P: pressure1 hPa, Status: state&lt;br /&gt;
&lt;br /&gt;
[[Datei:MySensors stateFormat.png]]&lt;br /&gt;
&lt;br /&gt;
Es kann für stateFormat auch Perl-Code festgelegt werden. Auf die geschweiften Klammern achten z.B.:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{if (ReadingsVal(&amp;quot;MYSENSOR_97&amp;quot;,&amp;quot;contact&amp;quot;,&amp;quot;&amp;quot;) =~ &amp;quot;open.*&amp;quot;) {&amp;quot;open&amp;quot; . ReadingsTimestamp(&amp;quot;MYSENSOR_97&amp;quot;,&amp;quot;contact&amp;quot;,&amp;quot;&amp;quot;)} else {ReadingsVal(&amp;quot;MYSENSOR_97&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;)}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Hinweis|Bei Verwendung von Perl-Code in stateFormat sollte jedoch darauf geachtet werden, dass ein lesbarer Text zurückgeliefert wird! Für grafische Ausgaben soll und kann devStateIcon iVm. Perl-Code verwendet werden.}}&lt;br /&gt;
&lt;br /&gt;
===devStateIcon===&lt;br /&gt;
Wird ein devStateIcon spezifiziert, verdrängt dies die Anzeige des STATE&amp;lt;ref&amp;gt;vorausgesetzt, in der Perl-Variante wird ein gültiges Ergebnis zurückgeliefert&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Text-Variante====&lt;br /&gt;
Es kann zum einen einfach ein bestimmter Text jeweils durch ein passendes Icon ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
1. Beispiel:&lt;br /&gt;
 attr Virtueller_Tuerkontakt devStateIcon set_offen:fts_door_slide_open set_geschlossen:fts_door_slide&lt;br /&gt;
Das ganze kann mit einer Farbangaben kombiniert sein: &lt;br /&gt;
 attr Virtueller_Tuerkontakt devStateIcon set_offen:fts_door_slide_open@red set_geschlossen:fts_door_slide@green&lt;br /&gt;
Schließlich kann man auch noch einen Befehl festlegen, der beim Klicken auf das Symbol ausgeführt werden soll:&lt;br /&gt;
 attr Virtueller_Tuerkontakt devStateIcon set_offen:fts_door_slide_open:geschlossen set_geschlossen:fts_door_slide:offen&lt;br /&gt;
bzw. mit Farbangabe:&lt;br /&gt;
 attr Virtueller_Tuerkontakt devStateIcon set_offen:fts_door_slide_open@red:geschlossen set_geschlossen:fts_door_slide@green:offen&lt;br /&gt;
Damit wäre in obigem Beispiel webCmd und webCmdLabel nicht mehr erforderlich und könnte gelöscht werden.&lt;br /&gt;
Die folgenden Attribute sind für eine Bedienung ausreichend:&lt;br /&gt;
 defmod Virtueller_Tuerkontakt_Btn1 CUL_HM 11223301&lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 cmdIcon offen:fts_door_slide_open@red geschlossen:fts_door_slide@green&lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 devStateIcon set_offen:fts_door_slide_open@red:geschlossen set_geschlossen:fts_door_slide@green:offen&lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 eventMap /postEvent open:offen/postEvent closed:geschlossen/&lt;br /&gt;
[[Datei:Tuerkontakt defStateIcon only.png]]&lt;br /&gt;
&lt;br /&gt;
2. Beispiel mit Regex&amp;lt;ref&amp;gt;Der Rollladenstatus ist hier invertiert, also 80% entspricht einem leicht geschlossenen Rollladen&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr Rollladen devStateIcon 0:fts_shutter_100 100:fts_shutter_10 9\d.*:fts_shutter_10 8\d.*:fts_shutter_20 7\d.*:fts_shutter_30 6\d.*:fts_shutter_40 5\d.*:fts_shutter_50 4\d.*:fts_shutter_60 3\d.*:fts_shutter_70 2\d.*:fts_shutter_80 1\d.*:fts_shutter_90 0\d.*:fts_shutter_100&lt;br /&gt;
&lt;br /&gt;
====Multi-Icon-Variante====&lt;br /&gt;
Seit 19.02.2019 ist es möglich, auch mehrere Icons zu nutzen, um den Zustand mehrerer Readings zu visualisieren. Beispiel 1 für den Zustand einer Tür samt Schloß:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Tuer geoeffnet.png]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Tuer nicht-verschlossen.png]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Tuer zu.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod keller_flur_tuer ESPEasy 192.168.144.181 80 ESPBridge Keller_Sensoren_flur_holzhalle&lt;br /&gt;
attr keller_flur_tuer alias Tür Holzhalle&lt;br /&gt;
attr keller_flur_tuer devStateIcon 1.on:fts_door@green 1.off:fts_door_open@red\&lt;br /&gt;
2.on:secur_locked@green 2.off:secur_open@red&lt;br /&gt;
attr keller_flur_tuer icon hue_room_frontdoor&lt;br /&gt;
attr keller_flur_tuer stateFormat 1:mk\&lt;br /&gt;
2:rsk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Anm.: rsk und mk sind jeweils die Namen der Readings für die Tür bzw. das Schloss&lt;br /&gt;
&lt;br /&gt;
Beispiel 2: holiday-Datei:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Holiday-multiicon.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod ferien holiday&lt;br /&gt;
attr ferien alias Ferien Baden-Württemberg&lt;br /&gt;
attr ferien devStateIcon [^(none|Heute|Morgen)].*:scene_party none:scene_office&lt;br /&gt;
attr ferien icon time_calendar&lt;br /&gt;
attr ferien stateFormat Heute: \&lt;br /&gt;
state\&lt;br /&gt;
Morgen: \&lt;br /&gt;
tomorrow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Anm.: Die regex beim devStateIcon wandelt alles, das nicht &amp;quot;none&amp;quot;, &amp;quot;heute&amp;quot; oder &amp;quot;Morgen&amp;quot; ist in das scene_party-Icon um .&lt;br /&gt;
&lt;br /&gt;
====Perl-Variante====&lt;br /&gt;
Schließlich kann in dem Attribut Perl-Code enthalten sein, der dann auch komplexe Anweisungen enthalten kann. Beispiele:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 1:&#039;&#039;&#039; Aufruf von Code aus einem Modul - regelbare Lampe mit toggle beim Klicken:&lt;br /&gt;
  attr MQTT2_zigbee_0x90fd9ffffe65db16 devStateIcon {zigbee2mqtt_devStateIcon255($name)}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 2:&#039;&#039;&#039; MySensors-Node mit farbiger Anzeige, ob regelmäßig Kontakt besteht&amp;lt;ref&amp;gt;Die Funktion &#039;&#039;FW_makeImage&#039;&#039; ist in der [[DevelopmentFHEMWEB-API]] näher erläutert&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; attr MYSENSOR_97 devStateIcon {my $alivecolor = &#039;lan_rs485@red&#039;;;$alivecolor=&#039;lan_rs485@green&#039; if (ReadingsVal($name, &amp;quot;state&amp;quot;, &amp;quot;dead&amp;quot;) eq &amp;quot;alive&amp;quot;);;&amp;quot;&amp;lt;div&amp;gt;&amp;quot; . FW_makeImage(&amp;quot;$alivecolor&amp;quot;,&amp;quot;lan_rs485&amp;quot;) . FW_makeImage(&amp;quot;temp_temperature&amp;quot;,&amp;quot;temp_temperature&amp;quot;) . ReadingsVal($name,&amp;quot;temperature2&amp;quot;,0) .&amp;quot;°C &amp;quot;. FW_makeImage(&amp;quot;humidity&amp;quot;,&amp;quot;humidity&amp;quot;). ReadingsVal($name,&amp;quot;humidity3&amp;quot;,0) . &amp;quot;%rH&amp;lt;/div&amp;gt;&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[Datei:MySensors devStateIcon Perl.png]]&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiel 3:&#039;&#039;&#039; 4-Kanaliges Tasmota-Gerät mit Anzeige aller 4 Kanäle und toggle-Funktion auf jedem der Icons: &lt;br /&gt;
///tbd&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
=== ReadingsProxy für fernotron-Rolladen ===&lt;br /&gt;
[[Datei:Fernotron deviceoverview.jpg]]&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod Rolladen_Buero readingsProxy Rolladen_Buero&lt;br /&gt;
attr Rolladen_Buero alias Büro&lt;br /&gt;
attr Rolladen_Buero cmdIcon auf:fts_shutter_up stopp:fts_shutter_manual zu:fts_shutter_down&lt;br /&gt;
attr Rolladen_Buero eventMap u:auf d:zu s:stopp&lt;br /&gt;
attr Rolladen_Buero room Rolläden&lt;br /&gt;
attr Rolladen_Buero setFn { fhem(&#039;&amp;quot;sudo /home/pi/fernotron-control/FernotronRemote.sh 2 2 &#039;. $CMD .&#039;&amp;quot;&#039;) }&lt;br /&gt;
attr Rolladen_Buero setList u d s&lt;br /&gt;
attr Rolladen_Buero webCmd auf:stopp:zu&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hinweise==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Frontends]]&lt;br /&gt;
[[Kategorie:FHEM-Verwendung]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-Sec-SCo_T%C3%BCr-Fensterkontakt,_optisch&amp;diff=32722</id>
		<title>HM-Sec-SCo Tür-Fensterkontakt, optisch</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-Sec-SCo_T%C3%BCr-Fensterkontakt,_optisch&amp;diff=32722"/>
		<updated>2020-02-13T14:16:33Z</updated>

		<summary type="html">&lt;p&gt;Moontear: &amp;quot;Sensor&amp;quot; mit einem sprechenden Namen ersetzt, so dass man merkt dass es sich um eine Variable handelt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=HM-SEC-SCo.jpg&lt;br /&gt;
|Bildbeschreibung=HomeMatic Tür-Fensterkontakt, optisch&lt;br /&gt;
|HWProtocol=HomeMatic&lt;br /&gt;
|HWType=Sensor&lt;br /&gt;
|HWCategory=HomeMatic&lt;br /&gt;
|HWComm=868MHz&lt;br /&gt;
|HWChannels=1&lt;br /&gt;
|HWVoltage=1,5 V DC&lt;br /&gt;
|HWPowerConsumption=max. 100 mA&lt;br /&gt;
|HWPoweredBy=Batterie (1x 1,5V LR03/Micro/AAA)&lt;br /&gt;
|HWSize=15x100x18mm&lt;br /&gt;
|HWDeviceFHEM=[[CUL_HM]]&lt;br /&gt;
|HWManufacturer=ELV / eQ-3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
[[HomeMatic]] Funk-Tür-/Fensterkontakt zur optischen Erkennung von Tür- bzw. Fensteröffnungen oder -schließungen, z.B. zur Sicherheit oder um automatisch, bei vorhandenem [[HM-CC-RT-DN]], die Heizung herunter zu regeln, sobald ein Fenster oder eine Tür geöffnet wird.&lt;br /&gt;
&lt;br /&gt;
== HM-SEC-SC und HM-SEC-SCo ==&lt;br /&gt;
Das meiste zum [[HM-SEC-SC Tür-Fensterkontakt|HM-SEC-SC]] Beschriebene zur Nutzung gilt auch für den HM-Sec-SCo.&lt;br /&gt;
&lt;br /&gt;
Wird mit aktiviertem [[AES Encryption|AES]] ausgeliefert und kann nur mit Gateways, die AES unterstützen, gepaired werden ([[HM-CFG-USB USB Konfigurations-Adapter|HM-LAN-CFG]], [[HM-CFG-LAN LAN Konfigurations-Adapter|HM-USB-CFG]] und [[CUL]] (seit Juli 2015)).&lt;br /&gt;
&lt;br /&gt;
Mindestens bei Benutzung mit einem CUL (vermutlich auch via HM-CFG-USB und HM-CFG-LAN) muss FHEM auf das Perl-Modul Crypt::Rijndael zugreifen können. Wenn es nicht zur Verfügung steht, bleibt das Pairing unvollständig. Siehe auch [[AES_Encryption#IO &amp;lt;-&amp;gt; Gerät|den Abschnitt über AES-Encryption zwischen IO-Device und Gerät]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
Das Gerät ist sowohl nutzungsbereit (ca. € 30) als auch als Bausatz (ca. € 20) verfügbar, letzterer muss selbst gelötet werden. Die Arbeitszeit sollte für erfahrende Personen unter 15 Minuten liegen. &lt;br /&gt;
[[Datei:Ansicht1.jpg|200px|thumb|left|Bestückung beider Platinen]]&lt;br /&gt;
[[Datei:Ansicht2.png|200px|thumb|right|Bestückung beider Platinen aus anderer Perspektive]]&lt;br /&gt;
Es sind nur&lt;br /&gt;
* das Funkmodul mit einer 8-poligen Stiftleiste&lt;br /&gt;
* der Batteriekontakt (Minuspol) mit einem kurzen Drahtstück&lt;br /&gt;
[[Datei:HM-Sec-SCo_Basisplatine.jpg|mini|250px|Markiert: Antennendurchführung (1), Batterieanschluss (2), sehr schmaler Platinensteg (3)]]&lt;br /&gt;
an der Basisplatine anzulöten.&lt;br /&gt;
&lt;br /&gt;
Beim Zusammenbau muss darauf geachtet werden das immer das &#039;&#039;&#039;zugehörige&#039;&#039;&#039; Funkmodul mit der Basisplatine aus der Verpackung zusammen gelötet werden!&lt;br /&gt;
Jede Platine für sich enthält die eindeutige ID. Aber nur auf dem Funkmodul ist diese erkennbar. Wenn die Module beim Zusammenbau vermischt werden, sendet das Geräte die Open/Close-Meldungen mit der ID des Funkmoduls. Die Sabotage- und vermutlich Batterie-Meldungen werden mit der ID der Basisplatine gesendet!&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Zu beachten ist noch, dass die Antenne &#039;&#039;&#039;vor&#039;&#039;&#039; dem Auflöten des Funkmoduls durch das markierte Loch der Basisplatine geführt werden muss.&lt;br /&gt;
&lt;br /&gt;
Die fertig montierte Platine muss sich leicht in das Gehäuse einsetzen lassen, anderenfalls wird der schmale Platinensteg u.U. zu stark belastet und kann brechen!&lt;br /&gt;
&lt;br /&gt;
== Betrieb mit FHEM ==&lt;br /&gt;
=== Event-Monitor ===&lt;br /&gt;
Wird z. B. das Fenster geöffnet, übermittelt das Gerät folgendes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-02-08 20:04:24 CUL_HM HM_Fensterstatus_BadEG trigger_cnt: 11&lt;br /&gt;
2015-02-08 20:04:24 CUL_HM HM_Fensterstatus_BadEG trigDst_2573FB: noConfig&lt;br /&gt;
2015-02-08 20:04:24 CUL_HM HM_Fensterstatus_BadEG battery: ok&lt;br /&gt;
2015-02-08 20:04:24 CUL_HM HM_Fensterstatus_BadEG open&lt;br /&gt;
2015-02-08 20:04:24 CUL_HM HM_Fensterstatus_BadEG contact: open (to MyHMLAN)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim schließen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-02-08 20:04:31 CUL_HM HM_Fensterstatus_BadEG trigger_cnt: 12&lt;br /&gt;
2015-02-08 20:04:31 CUL_HM HM_Fensterstatus_BadEG trigDst_2573FB: noConfig&lt;br /&gt;
2015-02-08 20:04:31 CUL_HM HM_Fensterstatus_BadEG battery: ok&lt;br /&gt;
2015-02-08 20:04:31 CUL_HM HM_Fensterstatus_BadEG closed&lt;br /&gt;
2015-02-08 20:04:31 CUL_HM HM_Fensterstatus_BadEG contact: closed (to MyHMLAN)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Bei eingeschaltetem [[autocreate]] werden die erforderlichen Definitionen beim Pairen selbstständig erstellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define HM_Fensterstatus_BadEG CUL_HM 35E390&lt;br /&gt;
attr HM_Fensterstatus_BadEG IODev MyHMLAN&lt;br /&gt;
attr HM_Fensterstatus_BadEG actCycle 000:50&lt;br /&gt;
attr HM_Fensterstatus_BadEG actStatus dead&lt;br /&gt;
attr HM_Fensterstatus_BadEG autoReadReg 4_reqStatus&lt;br /&gt;
attr HM_Fensterstatus_BadEG expert 2_full&lt;br /&gt;
attr HM_Fensterstatus_BadEG firmware 1.0&lt;br /&gt;
attr HM_Fensterstatus_BadEG model HM-SEC-SCo&lt;br /&gt;
attr HM_Fensterstatus_BadEG peerIDs 00000000,&lt;br /&gt;
attr HM_Fensterstatus_BadEG room CUL_HM&lt;br /&gt;
attr HM_Fensterstatus_BadEG serialNr LEQxxxxxxx&lt;br /&gt;
attr HM_Fensterstatus_BadEG subType threeStateSensor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Peering ===&lt;br /&gt;
Peering wie im Artikel [[Homematic Peering Beispiele]] beschrieben durchführen. Ein Beispiel könnte wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set HM_Fensterstatus_BadEG peerChan 0 HM_Heizung_Bad_WindowRec single&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Besonderheit bei den Sensoren ist dass nach dem Ausführen dieses Befehls die Taste auf dem Sensor gedrückt werden muss. Manchmal auch mehrfach nacheinander, da in der kurzen aktiven Zeit nicht alle Befehle empfangen/gesendet werden können. Fertig ist der Sensor sobald die &#039;&#039;peerList&#039;&#039; korrekt gefüllt ist und keine Befehle mehr in der Warteschlange hängen (&#039;&#039;protState&#039;&#039; &#039;&#039;= CMDs_done&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Aktionen durchführen, wenn Fenster zu lange geöffnet ist ===&lt;br /&gt;
==== DOIF-Variante ====&lt;br /&gt;
Mit der nachfolgenden [[DOIF]]-Definition wird ein [[FileLog|Log]]-Eintrag erzeugt. Eine Meldung auf der [[Enigma2 Receiver (Dreambox, VUplus etc.) steuern|Dreambox]] angezeigt, falls diese angeschaltet ist, und eine Nachricht per Prowl (funktioniert vermutlich nur unter Linux) verschickt.&lt;br /&gt;
&lt;br /&gt;
Der Code ist hier so angegeben, wie er in der Weboberfläche nach einem Klick auf das [[Konfiguration|DEF-Feld]] übernommen werden kann. Das DOIF ist vorab zu definieren, zum Beispiel mit:&lt;br /&gt;
:&amp;lt;code&amp;gt;def DOIF_FensterOffenMsg DOIF ([HM_Fensterstatus_BadEG])&amp;lt;/code&amp;gt;&lt;br /&gt;
und kann dann anschließend in den Device-Details vervollständigt werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
([HM_Fensterstatus_BadEG] eq &amp;quot;open&amp;quot;) ({&lt;br /&gt;
       Log 1, &amp;quot;Fenster seit mehr als 2 Stunden (7200 Sekunden) offen&amp;quot;;;&lt;br /&gt;
       system( &amp;quot;/path/to/prowl.pl -apikeyfile=/path/to/prowl-apikey -event=Info -notification=&#039;Fenster ist noch offen&#039; &amp;amp;&amp;quot; );;&lt;br /&gt;
       fhem( &amp;quot;set E2_Dreambox showText Fenster ist noch offen&amp;quot; ) if ReadingsVal(&amp;quot;E2_Dreambox&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;on&amp;quot;;;&lt;br /&gt;
       })&lt;br /&gt;
DOELSE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit der Code-Block erst nach 7200 Sekunden getriggert wird, ist noch Folgendes auszuführen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;attr DOIF_FensterOffenMsg wait 7200:0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Watchdog-Variante ====&lt;br /&gt;
Alternativ zu der DOIF-Lösung gibt es eine einfache Lösung mit [[Watchdog]]. Dazu legt ihr einen Watchdog an:&lt;br /&gt;
:&amp;lt;code&amp;gt;define watchdogBadEG watchdog HM_Fenster_BadEG:open 00:15 HM_Fenster_BadEG:closed set myTelegram message Das Fenster ist seit 15 min offen!&amp;lt;/code&amp;gt;&lt;br /&gt;
Der Watchdog besagt, dass er beim Status &amp;quot;open&amp;quot; des Gerätes/Devices &amp;quot;HM_Fenster_BadEG&amp;quot; (also dem Fenstersensor) aktiviert wird. Nach 15 Minuten schickt er eine Nachricht über [[Telegram]], es sei denn es kommt zwischenzeitlich der Status &amp;quot;closed&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Anzeige des Zeitpunkts der letzten Öffnung im STATE ===&lt;br /&gt;
Das Reading &#039;&#039;contact&#039;&#039; beinhaltet die Zustände &#039;&#039;open&#039;&#039; und &#039;&#039;closed&#039;&#039;. Und der Zeitstempel der Änderung wird regelmäßig aktualisiert. Aus diesem Grund fällt die Nutzung des Attributs &#039;&#039;showtime&#039;&#039; hier weg. Wenigstens, wenn man nicht den Zeitpunkt des letzten Auslesens wissen will, sondern den der letzten Öffnung.&lt;br /&gt;
&lt;br /&gt;
Folgende Schreibweise ermöglicht es, dass im STATE-Internal der Zeitpunkt des letzten &#039;&#039;open&#039;&#039; verbleibt (zum Übernehmen als Einzeiler kopieren):&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;attr Sensor stateFormat {if (ReadingsVal(&amp;quot;HM_Fensterstatus_BadEG&amp;quot;,&amp;quot;contact&amp;quot;,&amp;quot;&amp;quot;) =~ &amp;quot;open.*&amp;quot;) {&amp;quot;open &amp;quot; . ReadingsTimestamp(&amp;quot;HM_Fensterstatus_BadEG&amp;quot;,&amp;quot;contact&amp;quot;,&amp;quot;&amp;quot;)} else {InternalVal(&amp;quot;HM_Fensterstatus_BadEG&amp;quot;,&amp;quot;STATE&amp;quot;,&amp;quot;&amp;quot;)}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Thread zu diesem Thema findet sich im Forum unter dem Titel {{Link2Forum|Topic=41347|LinkText=HM-SEC-SCo: Letzte Türöffnung im State anzeigen}}.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
* Es kann vorkommen das der HM-Sec-SCo nach aufsetzen der Abdeckung scheinbar keine funktioniert hat.&amp;lt;br&amp;gt;&lt;br /&gt;
Unter {{Link2Forum|Topic=37508|LinkText=Forum}} wurde berichtet, das von EQ3/ELV repariert Geräte modifiziert zurück kamen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Reparatur bestand darin, das um den Foto-Sensor eine Abdeckung gelegt wurde.&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Problem gibt es 2019 weiterhin.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Bei (direkter) Sonneneinstrahlung kann es zu Fehlfunktionen kommen, die sich in schnell wechselnden Statusänderungen äußern.&lt;br /&gt;
&lt;br /&gt;
Teilweise (siehe Diskussion im {{Link2Forum|Topic=33264|LinkText=Forum}}) werden die Fensterkontakte regelmäßig wiederkehrend als &amp;quot;dead&amp;quot; angezeigt.&amp;lt;br&amp;gt;&lt;br /&gt;
Grund ist, dass beim Anlernen ein actCycle von 50 Minuten eingetragen wird, während die Kontakte auch gerne mal länger brauchen, um sich bei der Zentrale zu melden.&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:505px;&amp;quot;&amp;gt;&lt;br /&gt;
2015-01-31_17:57:39 Fstr_AusgTerrasse alive: yes&lt;br /&gt;
2015-01-31_17:57:39 Fstr_AusgTerrasse battery: ok&lt;br /&gt;
2015-01-31_17:57:39 Fstr_AusgTerrasse sabotageError: off&lt;br /&gt;
2015-01-31_17:57:39 Fstr_AusgTerrasse closed&lt;br /&gt;
2015-01-31_17:57:39 Fstr_AusgTerrasse contact: closed (to HMLAN1)&lt;br /&gt;
2015-01-31_18:54:09 Fstr_AusgTerrasse Activity: dead&lt;br /&gt;
2015-01-31_18:58:03 Fstr_AusgTerrasse alive: yes&lt;br /&gt;
2015-01-31_18:58:03 Fstr_AusgTerrasse battery: ok&lt;br /&gt;
2015-01-31_18:58:03 Fstr_AusgTerrasse sabotageError: off&lt;br /&gt;
2015-01-31_18:58:03 Fstr_AusgTerrasse closed&lt;br /&gt;
2015-01-31_18:58:03 Fstr_AusgTerrasse contact: closed (to HMUSB)&lt;br /&gt;
2015-01-31_19:04:09 Fstr_AusgTerrasse Activity: alive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Abhilfe zu schaffen, den actCycle auf 01:05 setzen:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;HM-SEC-SCo&amp;gt; actCycle 001:05&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save config nicht vergessen.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Anleitung [http://www.eq-3.de/Downloads/eq3/downloads_produktkatalog/homematic/bda/HM-Sec-SCo_UM_GE_eQ-3_web.pdf PDF]&lt;br /&gt;
* Datenblatt [http://www.eq-3.de/service/downloads.html?id=235&amp;amp;download=produkt&amp;amp;pid=1947 PDF] (der direkte Link auf das PDF klappt nicht, vermutlich wegen der Codierung des Umlautes :-( )&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Kontaktsensor (optisch)]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-Sec-SCo_T%C3%BCr-Fensterkontakt,_optisch&amp;diff=32718</id>
		<title>HM-Sec-SCo Tür-Fensterkontakt, optisch</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-Sec-SCo_T%C3%BCr-Fensterkontakt,_optisch&amp;diff=32718"/>
		<updated>2020-02-13T12:25:46Z</updated>

		<summary type="html">&lt;p&gt;Moontear: peering info hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=HM-SEC-SCo.jpg&lt;br /&gt;
|Bildbeschreibung=HomeMatic Tür-Fensterkontakt, optisch&lt;br /&gt;
|HWProtocol=HomeMatic&lt;br /&gt;
|HWType=Sensor&lt;br /&gt;
|HWCategory=HomeMatic&lt;br /&gt;
|HWComm=868MHz&lt;br /&gt;
|HWChannels=1&lt;br /&gt;
|HWVoltage=1,5 V DC&lt;br /&gt;
|HWPowerConsumption=max. 100 mA&lt;br /&gt;
|HWPoweredBy=Batterie (1x 1,5V LR03/Micro/AAA)&lt;br /&gt;
|HWSize=15x100x18mm&lt;br /&gt;
|HWDeviceFHEM=[[CUL_HM]]&lt;br /&gt;
|HWManufacturer=ELV / eQ-3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
[[HomeMatic]] Funk-Tür-/Fensterkontakt zur optischen Erkennung von Tür- bzw. Fensteröffnungen oder -schließungen, z.B. zur Sicherheit oder um automatisch, bei vorhandenem [[HM-CC-RT-DN]], die Heizung herunter zu regeln, sobald ein Fenster oder eine Tür geöffnet wird.&lt;br /&gt;
&lt;br /&gt;
== HM-SEC-SC und HM-SEC-SCo ==&lt;br /&gt;
Das meiste zum [[HM-SEC-SC Tür-Fensterkontakt|HM-SEC-SC]] Beschriebene zur Nutzung gilt auch für den HM-Sec-SCo.&lt;br /&gt;
&lt;br /&gt;
Wird mit aktiviertem [[AES Encryption|AES]] ausgeliefert und kann nur mit Gateways, die AES unterstützen, gepaired werden ([[HM-CFG-USB USB Konfigurations-Adapter|HM-LAN-CFG]], [[HM-CFG-LAN LAN Konfigurations-Adapter|HM-USB-CFG]] und [[CUL]] (seit Juli 2015)).&lt;br /&gt;
&lt;br /&gt;
Mindestens bei Benutzung mit einem CUL (vermutlich auch via HM-CFG-USB und HM-CFG-LAN) muss FHEM auf das Perl-Modul Crypt::Rijndael zugreifen können. Wenn es nicht zur Verfügung steht, bleibt das Pairing unvollständig. Siehe auch [[AES_Encryption#IO &amp;lt;-&amp;gt; Gerät|den Abschnitt über AES-Encryption zwischen IO-Device und Gerät]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
Das Gerät ist sowohl nutzungsbereit (ca. € 30) als auch als Bausatz (ca. € 20) verfügbar, letzterer muss selbst gelötet werden. Die Arbeitszeit sollte für erfahrende Personen unter 15 Minuten liegen. &lt;br /&gt;
[[Datei:Ansicht1.jpg|200px|thumb|left|Bestückung beider Platinen]]&lt;br /&gt;
[[Datei:Ansicht2.png|200px|thumb|right|Bestückung beider Platinen aus anderer Perspektive]]&lt;br /&gt;
Es sind nur&lt;br /&gt;
* das Funkmodul mit einer 8-poligen Stiftleiste&lt;br /&gt;
* der Batteriekontakt (Minuspol) mit einem kurzen Drahtstück&lt;br /&gt;
[[Datei:HM-Sec-SCo_Basisplatine.jpg|mini|250px|Markiert: Antennendurchführung (1), Batterieanschluss (2), sehr schmaler Platinensteg (3)]]&lt;br /&gt;
an der Basisplatine anzulöten.&lt;br /&gt;
&lt;br /&gt;
Beim Zusammenbau muss darauf geachtet werden das immer das &#039;&#039;&#039;zugehörige&#039;&#039;&#039; Funkmodul mit der Basisplatine aus der Verpackung zusammen gelötet werden!&lt;br /&gt;
Jede Platine für sich enthält die eindeutige ID. Aber nur auf dem Funkmodul ist diese erkennbar. Wenn die Module beim Zusammenbau vermischt werden, sendet das Geräte die Open/Close-Meldungen mit der ID des Funkmoduls. Die Sabotage- und vermutlich Batterie-Meldungen werden mit der ID der Basisplatine gesendet!&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Zu beachten ist noch, dass die Antenne &#039;&#039;&#039;vor&#039;&#039;&#039; dem Auflöten des Funkmoduls durch das markierte Loch der Basisplatine geführt werden muss.&lt;br /&gt;
&lt;br /&gt;
Die fertig montierte Platine muss sich leicht in das Gehäuse einsetzen lassen, anderenfalls wird der schmale Platinensteg u.U. zu stark belastet und kann brechen!&lt;br /&gt;
&lt;br /&gt;
== Betrieb mit FHEM ==&lt;br /&gt;
=== Event-Monitor ===&lt;br /&gt;
Wird z. B. das Fenster geöffnet, übermittelt das Gerät folgendes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-02-08 20:04:24 CUL_HM HM_Fensterstatus_BadEG trigger_cnt: 11&lt;br /&gt;
2015-02-08 20:04:24 CUL_HM HM_Fensterstatus_BadEG trigDst_2573FB: noConfig&lt;br /&gt;
2015-02-08 20:04:24 CUL_HM HM_Fensterstatus_BadEG battery: ok&lt;br /&gt;
2015-02-08 20:04:24 CUL_HM HM_Fensterstatus_BadEG open&lt;br /&gt;
2015-02-08 20:04:24 CUL_HM HM_Fensterstatus_BadEG contact: open (to MyHMLAN)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim schließen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-02-08 20:04:31 CUL_HM HM_Fensterstatus_BadEG trigger_cnt: 12&lt;br /&gt;
2015-02-08 20:04:31 CUL_HM HM_Fensterstatus_BadEG trigDst_2573FB: noConfig&lt;br /&gt;
2015-02-08 20:04:31 CUL_HM HM_Fensterstatus_BadEG battery: ok&lt;br /&gt;
2015-02-08 20:04:31 CUL_HM HM_Fensterstatus_BadEG closed&lt;br /&gt;
2015-02-08 20:04:31 CUL_HM HM_Fensterstatus_BadEG contact: closed (to MyHMLAN)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Bei eingeschaltetem [[autocreate]] werden die erforderlichen Definitionen beim Pairen selbstständig erstellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define HM_Fensterstatus_BadEG CUL_HM 35E390&lt;br /&gt;
attr HM_Fensterstatus_BadEG IODev MyHMLAN&lt;br /&gt;
attr HM_Fensterstatus_BadEG actCycle 000:50&lt;br /&gt;
attr HM_Fensterstatus_BadEG actStatus dead&lt;br /&gt;
attr HM_Fensterstatus_BadEG autoReadReg 4_reqStatus&lt;br /&gt;
attr HM_Fensterstatus_BadEG expert 2_full&lt;br /&gt;
attr HM_Fensterstatus_BadEG firmware 1.0&lt;br /&gt;
attr HM_Fensterstatus_BadEG model HM-SEC-SCo&lt;br /&gt;
attr HM_Fensterstatus_BadEG peerIDs 00000000,&lt;br /&gt;
attr HM_Fensterstatus_BadEG room CUL_HM&lt;br /&gt;
attr HM_Fensterstatus_BadEG serialNr LEQxxxxxxx&lt;br /&gt;
attr HM_Fensterstatus_BadEG subType threeStateSensor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Peering ===&lt;br /&gt;
Peering wie im Artikel [[Homematic Peering Beispiele]] beschrieben durchführen. Ein Beispiel könnte wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set HM_Fensterstatus_BadEG peerChan 0 HM_Heizung_Bad_WindowRec single&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Besonderheit bei den Sensoren ist dass nach dem Ausführen dieses Befehls die Taste auf dem Sensor gedrückt werden muss. Manchmal auch mehrfach nacheinander, da in der kurzen aktiven Zeit nicht alle Befehle empfangen/gesendet werden können. Fertig ist der Sensor sobald die &#039;&#039;peerList&#039;&#039; korrekt gefüllt ist und keine Befehle mehr in der Warteschlange hängen (&#039;&#039;protState&#039;&#039; &#039;&#039;= CMDs_done&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Aktionen durchführen, wenn Fenster zu lange geöffnet ist ===&lt;br /&gt;
==== DOIF-Variante ====&lt;br /&gt;
Mit der nachfolgenden [[DOIF]]-Definition wird ein [[FileLog|Log]]-Eintrag erzeugt. Eine Meldung auf der [[Enigma2 Receiver (Dreambox, VUplus etc.) steuern|Dreambox]] angezeigt, falls diese angeschaltet ist, und eine Nachricht per Prowl (funktioniert vermutlich nur unter Linux) verschickt.&lt;br /&gt;
&lt;br /&gt;
Der Code ist hier so angegeben, wie er in der Weboberfläche nach einem Klick auf das [[Konfiguration|DEF-Feld]] übernommen werden kann. Das DOIF ist vorab zu definieren, zum Beispiel mit:&lt;br /&gt;
:&amp;lt;code&amp;gt;def DOIF_FensterOffenMsg DOIF ([HM_Fensterstatus_BadEG])&amp;lt;/code&amp;gt;&lt;br /&gt;
und kann dann anschließend in den Device-Details vervollständigt werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
([HM_Fensterstatus_BadEG] eq &amp;quot;open&amp;quot;) ({&lt;br /&gt;
       Log 1, &amp;quot;Fenster seit mehr als 2 Stunden (7200 Sekunden) offen&amp;quot;;;&lt;br /&gt;
       system( &amp;quot;/path/to/prowl.pl -apikeyfile=/path/to/prowl-apikey -event=Info -notification=&#039;Fenster ist noch offen&#039; &amp;amp;&amp;quot; );;&lt;br /&gt;
       fhem( &amp;quot;set E2_Dreambox showText Fenster ist noch offen&amp;quot; ) if ReadingsVal(&amp;quot;E2_Dreambox&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;on&amp;quot;;;&lt;br /&gt;
       })&lt;br /&gt;
DOELSE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit der Code-Block erst nach 7200 Sekunden getriggert wird, ist noch Folgendes auszuführen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;attr DOIF_FensterOffenMsg wait 7200:0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Watchdog-Variante ====&lt;br /&gt;
Alternativ zu der DOIF-Lösung gibt es eine einfache Lösung mit [[Watchdog]]. Dazu legt ihr einen Watchdog an:&lt;br /&gt;
:&amp;lt;code&amp;gt;define watchdogBadEG watchdog HM_Fenster_BadEG:open 00:15 HM_Fenster_BadEG:closed set myTelegram message Das Fenster ist seit 15 min offen!&amp;lt;/code&amp;gt;&lt;br /&gt;
Der Watchdog besagt, dass er beim Status &amp;quot;open&amp;quot; des Gerätes/Devices &amp;quot;HM_Fenster_BadEG&amp;quot; (also dem Fenstersensor) aktiviert wird. Nach 15 Minuten schickt er eine Nachricht über [[Telegram]], es sei denn es kommt zwischenzeitlich der Status &amp;quot;closed&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Anzeige des Zeitpunkts der letzten Öffnung im STATE ===&lt;br /&gt;
Das Reading &#039;&#039;contact&#039;&#039; beinhaltet die Zustände &#039;&#039;open&#039;&#039; und &#039;&#039;closed&#039;&#039;. Und der Zeitstempel der Änderung wird regelmäßig aktualisiert. Aus diesem Grund fällt die Nutzung des Attributs &#039;&#039;showtime&#039;&#039; hier weg. Wenigstens, wenn man nicht den Zeitpunkt des letzten Auslesens wissen will, sondern den der letzten Öffnung.&lt;br /&gt;
&lt;br /&gt;
Folgende Schreibweise ermöglicht es, dass im STATE-Internal der Zeitpunkt des letzten &#039;&#039;open&#039;&#039; verbleibt (zum Übernehmen als Einzeiler kopieren):&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;attr Sensor stateFormat {if (ReadingsVal(&amp;quot;Sensor&amp;quot;,&amp;quot;contact&amp;quot;,&amp;quot;&amp;quot;) =~ &amp;quot;open.*&amp;quot;) {&amp;quot;open &amp;quot; . ReadingsTimestamp(&amp;quot;Sensor&amp;quot;,&amp;quot;contact&amp;quot;,&amp;quot;&amp;quot;)} else {InternalVal(&amp;quot;Sensor&amp;quot;,&amp;quot;STATE&amp;quot;,&amp;quot;&amp;quot;)}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Thread zu diesem Thema findet sich im Forum unter dem Titel {{Link2Forum|Topic=41347|LinkText=HM-SEC-SCo: Letzte Türöffnung im State anzeigen}}.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
* Es kann vorkommen das der HM-Sec-SCo nach aufsetzen der Abdeckung scheinbar keine funktioniert hat.&amp;lt;br&amp;gt;&lt;br /&gt;
Unter {{Link2Forum|Topic=37508|LinkText=Forum}} wurde berichtet, das von EQ3/ELV repariert Geräte modifiziert zurück kamen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Reparatur bestand darin, das um den Foto-Sensor eine Abdeckung gelegt wurde.&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Problem gibt es 2019 weiterhin.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Bei (direkter) Sonneneinstrahlung kann es zu Fehlfunktionen kommen, die sich in schnell wechselnden Statusänderungen äußern.&lt;br /&gt;
&lt;br /&gt;
Teilweise (siehe Diskussion im {{Link2Forum|Topic=33264|LinkText=Forum}}) werden die Fensterkontakte regelmäßig wiederkehrend als &amp;quot;dead&amp;quot; angezeigt.&amp;lt;br&amp;gt;&lt;br /&gt;
Grund ist, dass beim Anlernen ein actCycle von 50 Minuten eingetragen wird, während die Kontakte auch gerne mal länger brauchen, um sich bei der Zentrale zu melden.&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:505px;&amp;quot;&amp;gt;&lt;br /&gt;
2015-01-31_17:57:39 Fstr_AusgTerrasse alive: yes&lt;br /&gt;
2015-01-31_17:57:39 Fstr_AusgTerrasse battery: ok&lt;br /&gt;
2015-01-31_17:57:39 Fstr_AusgTerrasse sabotageError: off&lt;br /&gt;
2015-01-31_17:57:39 Fstr_AusgTerrasse closed&lt;br /&gt;
2015-01-31_17:57:39 Fstr_AusgTerrasse contact: closed (to HMLAN1)&lt;br /&gt;
2015-01-31_18:54:09 Fstr_AusgTerrasse Activity: dead&lt;br /&gt;
2015-01-31_18:58:03 Fstr_AusgTerrasse alive: yes&lt;br /&gt;
2015-01-31_18:58:03 Fstr_AusgTerrasse battery: ok&lt;br /&gt;
2015-01-31_18:58:03 Fstr_AusgTerrasse sabotageError: off&lt;br /&gt;
2015-01-31_18:58:03 Fstr_AusgTerrasse closed&lt;br /&gt;
2015-01-31_18:58:03 Fstr_AusgTerrasse contact: closed (to HMUSB)&lt;br /&gt;
2015-01-31_19:04:09 Fstr_AusgTerrasse Activity: alive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Abhilfe zu schaffen, den actCycle auf 01:05 setzen:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;HM-SEC-SCo&amp;gt; actCycle 001:05&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save config nicht vergessen.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Anleitung [http://www.eq-3.de/Downloads/eq3/downloads_produktkatalog/homematic/bda/HM-Sec-SCo_UM_GE_eQ-3_web.pdf PDF]&lt;br /&gt;
* Datenblatt [http://www.eq-3.de/service/downloads.html?id=235&amp;amp;download=produkt&amp;amp;pid=1947 PDF] (der direkte Link auf das PDF klappt nicht, vermutlich wegen der Codierung des Umlautes :-( )&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Kontaktsensor (optisch)]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_IP&amp;diff=32436</id>
		<title>HomeMatic IP</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_IP&amp;diff=32436"/>
		<updated>2020-01-14T13:27:48Z</updated>

		<summary type="html">&lt;p&gt;Moontear: links ergänzt zu Virtualiserungslösungen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Homematic IP (HM-IP) ist eine neue, kommunikationstechnisch stark veränderte Generation des Systems [[HomeMatic|Homematic]] von eQ-3.&lt;br /&gt;
&lt;br /&gt;
Das System basiert auf einer Funkkommunikation auf 868 MHz mit einem bidirektionalen (Aktoren bestätigen Empfang, Verständnis und Ausführung von Nachrichten) und verschlüsselnden (AES-128 im CCM-Modus) Protokoll (IPv6 over BidCos).&lt;br /&gt;
&lt;br /&gt;
Somit sind die Geräte aktuell nur über eine systemeigene Zentrale CCU2 oder neuer (als physisch vorhandenes Interface), oder eine virtualisierte CCU&amp;lt;ref&amp;gt;Hierfür stehen mehrere Virtualisierungsvarianten zur Verfügung; eine kurze Darstellung, wie das mittels [https://github.com/leonsio/YAHM YAHM] funktioniert, ist in diesem {{Link2Forum|Topic=79670|Message=718289|Forenbeitrag}} zu finden. Weitere Alternativen sind [https://github.com/alexreinert/piVCCU piVCCU] und [https://github.com/jens-maus/RaspberryMatic RaspberryMatic].&amp;lt;/ref&amp;gt;, jeweils zusammen mit den [[HMCCU|HomeMatic-HMCCU-Modulen]] in FHEM integrierbar und &#039;&#039;&#039;&#039;&#039;nicht&#039;&#039; unmittelbar als [[HomeMatic|Homematic-Geräte]] ansprechbar&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Zur Einbindung von Geräten, die HM-IP verwenden, ist derzeit (Stand Januar 2019) noch zwingend eine (ggf. virtualisierte) CCU2 oder neuer erforderlich.&lt;br /&gt;
&lt;br /&gt;
;Weitere Quellen:&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/download%20bereich/handbuecher/Homematic_IP-Anwenderhandbuch.pdf Anwenderhandbuch Homematic IP] bei EQ3&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Glossary]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TR%C3%85DFRI&amp;diff=32424</id>
		<title>TRÅDFRI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TR%C3%85DFRI&amp;diff=32424"/>
		<updated>2020-01-12T14:58:18Z</updated>

		<summary type="html">&lt;p&gt;Moontear: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right&amp;quot;&amp;gt;{{Infobox Modul&lt;br /&gt;
|Name=tradfri&lt;br /&gt;
|ModPurpose=Anbindung IKEA TRÅDFRI Gateway&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=tradfri&lt;br /&gt;
|ModForumArea=Zigbee&lt;br /&gt;
|ModTechName=30_tradfri.pm&lt;br /&gt;
|ModOwner=Andre ([http://forum.fhem.de/index.php?action=profile;u=430 Forum] / [[Benutzer Diskussion:justme|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TRÅDFRI&#039;&#039;&#039; bzw. &#039;&#039;&#039;IKEA Home smart&#039;&#039;&#039; ist die Serie smarter Beleuchtungslösungen von IKEA auf ZigBee-Basis, ähnlich Phillips Hue.&lt;br /&gt;
&lt;br /&gt;
== tradfri ==&lt;br /&gt;
&lt;br /&gt;
TRÅDFRI (nach Umbennung jetzt &#039;&#039;&#039;IKEA Home smart&#039;&#039;&#039;) ist die Serie smarter Beleuchtungslösungen von IKEA. Ähnlich wie von Phillips [[Hue]] gibt es diverse LEDs in Glühbirnenform, LED-Streifen-Treiber, Flächenleuchten, Wandtaster, Bewegungsmelder, Fernbedienung, Dimmer, etc. und alles via Funk gekoppelt. Außerdem ein Gateway, das sich via Ethernetstecker ins heimische LAN einbinden lässt und die Bedienung via IKEA-App auf dem Handy ermöglicht. &lt;br /&gt;
{{Hinweis|Da die Geräte über den [[ZigBee]]-Standard kommunizieren, können auch andere Gateways für diese Leuchtmittel (und andere Geräte wie Rollos) genutzt werden. Dieser Artikel behandelt ausschließlich die Verwendung zusammen mit einem IKEA-Gateway!}}&lt;br /&gt;
Mit dem IKEA-Gateway ist auch eine Anbindung in FHEM möglich, dazu funktionieren zwei &#039;&#039;&#039;alternative&#039;&#039;&#039; Lösungen:&lt;br /&gt;
&lt;br /&gt;
=== alt: IKEA Trådfri Modul ===&lt;br /&gt;
IKEA Trådfri Modul (TYPE &#039;&#039;TradfriDevice&#039;&#039; und &#039;&#039;TradfriGateway&#039;&#039;, mehr Infos: https://forum.fhem.de/index.php/topic,70653.0.html seit April 2017)&lt;br /&gt;
* Erkennt Lampen&lt;br /&gt;
* Fernbedienung erscheint zwar in der Geräteliste, lässt sich aber nicht als Gerät anlegen oder Status lesen&lt;br /&gt;
&lt;br /&gt;
Die Weiterentwicklung des Moduls durch den ursprünglichen Entwickler scheint Stand 07.19 eingestellt. Inwieweit andere am Modul weiter arbeiten ist unklar.&lt;br /&gt;
&lt;br /&gt;
=== neu: tradfri-fhem Modul ===&lt;br /&gt;
tradfri-fhem Modul (TYPE &#039;&#039;HUEDevice&#039;&#039; und &#039;&#039;tradfri&#039;&#039; Gateway, mehr Infos: https://forum.fhem.de/index.php/topic,96125.0.html seit Januar 2019, Beschreibung folgt auf dieser Seite)&lt;br /&gt;
* Unterstützt Lampen (als [[Hue#HUE-Device|HUE-Device]])&lt;br /&gt;
* Unterstützt Rollos (Fyrtur und Kadrilj) &lt;br /&gt;
* Erkennt Fernbedienung, jedoch zur Zeit Batteriestatus als einziges Reading&lt;br /&gt;
* Erstellt (wenn gewünscht) automatisch Gruppen&lt;br /&gt;
* Erkennt Bewegungsmelder, jedoch zur Zeit Batteriestatus als einziges Reading&lt;br /&gt;
* Erkennt Repeater, nur Erreichbarkeit (reachable) als Reading &lt;br /&gt;
&lt;br /&gt;
====Einrichtung in FHEM====&lt;br /&gt;
&lt;br /&gt;
# node installieren (mindestens version 8)&lt;br /&gt;
# sudo npm install -g tradfri-fhem&lt;br /&gt;
# &amp;lt;code&amp;gt;define &amp;lt;tradfri&amp;gt; tradfri&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;attr &amp;lt;tradfri&amp;gt; tradfriFHEM-securityCode &amp;lt;security code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wenn das gateway nicht automatisch erkannt wird:&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;tradfri&amp;gt; tradfriFHEM-params --ip &amp;lt;ip&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WICHTIG: danach in FHEM einmal die Konfiguration speichern damit der Pairing-Key gesichert wird. Sonst muss beim nächsten FHEM-Neustart das Pairing erneut durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==== HUE-Device ====&lt;br /&gt;
Alle auf dem Gateway bekannten Geräte automatisch als [[Hue#HUE-Device|HUEDevice]] in FHEM angelegt:&lt;br /&gt;
* Lampen, Stecker, Trafos, ...&lt;br /&gt;
: Hiermit werden die einzelnen Leuchten gesteuert&lt;br /&gt;
* Gruppen&lt;br /&gt;
: Hiermit lassen sich ganze Gruppen und Räume steuern&lt;br /&gt;
* Fernbedienungen&lt;br /&gt;
: aktuell gibt es nur ein Battery-Reading&lt;br /&gt;
&lt;br /&gt;
==== Darstellung im Webfrontend ====&lt;br /&gt;
Wenn man die SVG Icons verwendet ist es sinnvoll, das Attribut color-icons zu setzen. Mit &amp;lt;code&amp;gt;attr HUEDevice1 color-icons 2&amp;lt;/code&amp;gt; werden z.B. die Farben und der Dimmzustand der Lampe als Icon dargestellt.&lt;br /&gt;
Damit das ganze funktioniert, müsst ihr auch noch das &amp;lt;code&amp;gt;attr WEB iconPath fhemSVG:openautomation:default&amp;lt;/code&amp;gt; setzen.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/peterkappelt/Tradfri-FHEM/issues/16#issuecomment-445461242 Githubeintrag über Einstellung der Feature-Entwicklung des IKEA Trådfri Moduls].&lt;br /&gt;
* [https://wiki.fhem.de/wiki/Hue#RaspBee_.26_ConBee Betrieb von IKEA smart home Devices mit Dritthersteller Gateway wie ConBee2]&lt;br /&gt;
[[Kategorie:ZigBee]]&lt;br /&gt;
[[Kategorie:Lichteffektgeräte]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Hue&amp;diff=32410</id>
		<title>Hue</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Hue&amp;diff=32410"/>
		<updated>2020-01-11T11:01:00Z</updated>

		<summary type="html">&lt;p&gt;Moontear: /* Installation von deCONZ auf einem RaspberryPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right&amp;quot;&amp;gt;{{Infobox Modul&lt;br /&gt;
|Name=HUEBridge&lt;br /&gt;
|ModPurpose=Anbindung Bridge des Philips Hue Lighting System&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=HUEBridge&lt;br /&gt;
|ModForumArea=Zigbee&lt;br /&gt;
|ModTechName=30_HUEBridge.pm&lt;br /&gt;
|ModOwner=Andre ([http://forum.fhem.de/index.php?action=profile;u=430 Forum] / [[Benutzer Diskussion:justme|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|Name=HUEDevice&lt;br /&gt;
|ModPurpose=Ansteuerung Geräte des Philips Hue Lighting System über HUEBridge&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=HUEDevice&lt;br /&gt;
|ModForumArea=Zigbee&lt;br /&gt;
|ModTechName=31_HUEDevice.pm&lt;br /&gt;
|ModOwner=Andre ([http://forum.fhem.de/index.php?action=profile;u=430 Forum] / [[Benutzer Diskussion:justme|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HUE-Bridge ==&lt;br /&gt;
=== Einrichtung in FHEM ===&lt;br /&gt;
Die Einrichtung ist wirklich einfach. Mit&lt;br /&gt;
:&amp;lt;code&amp;gt;define Wiesollesheißen HUEBridge eu.re.ip.1&amp;lt;/code&amp;gt;&lt;br /&gt;
wird die Bridge eingebunden. Dann einfach auf den runden Knopf in der Mitte der Bridge drücken und sie wird von FHEM erkannt. Die drei Lampen des Starterkits werden automatisch erkannt und sind ansteuerbar -&amp;gt; fertig!&lt;br /&gt;
&lt;br /&gt;
WICHTIG: danach in FHEM einmal die Konfiguration speichern damit der Pairing-Key gesichert wird. Sonst muss beim nächsten FHEM-Neustart das Pairing erneut durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Falls die Hue Bridge resetet wurde bleibt der Status auf &amp;quot;paired&amp;quot; und geht nicht mehr auf connected. Um das pairing erneut durchzuführen, muss das Attribut &amp;quot;key&amp;quot; gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
=== Nonblocking ===&lt;br /&gt;
Wenn man möchte, dass die Versuche, die HUEBridge zu kontaktieren, FHEM nicht blockieren, sollte man &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;HUEBridge_Name&amp;gt; httpUtils 1&amp;lt;/code&amp;gt;&lt;br /&gt;
setzen.&lt;br /&gt;
&lt;br /&gt;
== HUE-Device ==&lt;br /&gt;
Als Gerät können alle Hue und LightLink kompatiblen Modelle verwendet werden, die sich an der Bridge anlernen lassen. Dies sind unter anderem:&lt;br /&gt;
*HueBulbs (E27, GU10, Lux, White, ...)&lt;br /&gt;
*Hue Beyond und Phoenix&lt;br /&gt;
*Friends of Hue LightStrips und LivingColors Bloom&lt;br /&gt;
*LivingColors ab gen2&lt;br /&gt;
*LivingColors Bloom, Iris und Aura&lt;br /&gt;
*LivingWhites Energiesparlampen&lt;br /&gt;
*LivingWhites Leuchtenadapter&lt;br /&gt;
*LivingWhites Bulbs&lt;br /&gt;
*[[HUE_Dimmer_Switch|Hue Tap und Hue Dimmer]] (mit Einschränkungen)&lt;br /&gt;
*dresden elektronik Vorschaltgeräte&lt;br /&gt;
*OSRAM LIGHTIFY Lampen (an der Hue Bridge angelernt)&lt;br /&gt;
*Müller Licht tint&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
Diese sind jeweils über eine Bridge (HueBridge) steuerbar. Die LivingColors und LivingWhites Geräte sind vorher mit Hilfe einer LivingColors oder LivingWhites Fernbedienung an der Bridge anzulernen.&lt;br /&gt;
&lt;br /&gt;
Es werden auch alle HUE Sensoren (Taster, Bewegungsmelder) unterstützt. Diese werden aber nicht per [[autocreate]] angelegt, sondern müssen manuell definiert werden. Hier ist auf ein passendes Polling-Intervall zu achten (siehe: [[HUE_Dimmer_Switch|HUE Dimmer Switch]]). &lt;br /&gt;
&lt;br /&gt;
Sensoren (und Aktoren) lassen sich Konfigurieren (parameter Einstellen) und eigene Set- und Get- Kommandos im definieren.&lt;br /&gt;
&lt;br /&gt;
=== Mögliche andere Gateways ===&lt;br /&gt;
HUEDevice Client-Devices können (mit leicht unterschiedlichem Funktionsumfang) auch mit den folgenden Gateways anderer Hersteller und dem zugehörigen Bridge-Device verwendet werden:&lt;br /&gt;
*[[Hue#RaspBee_.26_ConBee|RaspBee &amp;amp; ConBee mit deCONZ]] von Dresden Elektronik&lt;br /&gt;
** inklusive Push-API Erweiterung und Szenen &lt;br /&gt;
*[[TRÅDFRI| TRÅDFRI bzw. IKEA Home smart]] &lt;br /&gt;
** inklusive Rollos&lt;br /&gt;
*[https://github.com/bwssytems/ha-bridge HA-Bridge]&lt;br /&gt;
** inklusive aller [https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/Supported-Devices unterstützten Geräte] (Lampen, Sensoren, Thermostate, Rollos, ...)&lt;br /&gt;
** inklusive Update des HA-Bridge internen Gerätestatus per &amp;lt;code&amp;gt;habridgeupdate&amp;lt;/code&amp;gt; Kommando&lt;br /&gt;
*[[ZigBee#Lightify_von_Osram|OSRAM LIGHTIFY Gateway]]&lt;br /&gt;
&lt;br /&gt;
=== Grundlagen - Farbmodelle ===&lt;br /&gt;
Ein HueDevice kann per set-Befehl über unterschiedliche Farbmodelle gesteuert werden. In der folgenden Tabelle ist dargestellt, welche Werte-Kombinationen sinnvoll sind:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Farbmodell !! Bestandteile !! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| xyY || x- und y-Koordinate im Farbraum, Y ist die Helligkeit || &amp;lt;code&amp;gt; set bulb1 xy 0.4595,0.4105 : bri 220 &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| hue,sat,bri || Farbwert, Sättigung und Helligkeit || &amp;lt;code&amp;gt; set bulb1 hue 14922 : sat 144 : bri 220 &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ct || Farbwert über Farbtemperatur || &amp;lt;code&amp;gt; set bulb1 color 2600 &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| rgb || Farbbestandteile rot, grün und blau || &amp;lt;code&amp;gt; set bulb1 rgb FFC698 &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Zur Regelung der Helligkeit sind die Befehle &#039;&#039;bri&#039;&#039; und &#039;&#039;pct&#039;&#039; gleichwertig. &#039;&#039;bri&#039;&#039; hat den Bereich 0..254, &#039;&#039;pct&#039;&#039; 0..100 .&lt;br /&gt;
&lt;br /&gt;
Das Modul lässt die Mischung von Angaben aus unterschiedlichen Farbmodellen technisch zu, jedoch sind diese nicht immer sinnvoll.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HA-Bridge:&#039;&#039;&#039; In der HA-Bridge können virtuelle Devices definiert werden, welche in FHEM als &#039;&#039;Dimmable light&#039;&#039; eingebunden und verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den bereits beschriebenen set-Befehlen kann der Zustand der HA-Bridge-Devices mit Hilfe von &#039;&#039;habridgeupdate&#039;&#039; in Kombination mit &#039;&#039;on&#039;&#039;, &#039;&#039;off&#039;&#039;, &#039;&#039;pct&#039;&#039; und &#039;&#039;bri&#039;&#039; aktualisiert werden, ohne dass die HA-Bridge einen Schaltbefehl versendet. Beispiel: &amp;lt;code&amp;gt;set bulb1 habridgeupdate : on : pct 50&amp;lt;/code&amp;gt; Details siehe: [https://github.com/bwssytems/ha-bridge#update-bridge-internal-light-state].&lt;br /&gt;
&lt;br /&gt;
=== Darstellung im Webfrontend ===&lt;br /&gt;
Wenn man die SVG Icons verwendet, ist es sinnvoll, das Attribut color-icons zu setzen. Mit &lt;br /&gt;
:&amp;lt;code&amp;gt;attr HUEDevice1 color-icons 2&amp;lt;/code&amp;gt; &lt;br /&gt;
werden z.B. die Farben und der Dimmzustand der Lampe als Icon dargestellt. Damit das ganze funktioniert, muss noch &lt;br /&gt;
:&amp;lt;code&amp;gt;attr WEB iconPath fhemSVG:openautomation:default&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
== RaspBee &amp;amp; ConBee ==&lt;br /&gt;
Das HUEBridge Modul unterstützt auch die ZigBee Gateway Module RaspBee und ConBee von Dresden Elektronik über die zugehörige deCONZ Software und die Wireless Light Control WebApp und die Phoscon WebApp (kommt zusammen mit deConz). Die hierzu erhältlichen Funk-Vorschaltgeräte sind noch nicht getestet, sollten aber auch funktionieren.&lt;br /&gt;
&lt;br /&gt;
Im diesem {{Link2Forum|Topic=80985|LinkText=Forenbeitrag}} wird über Details der HUE Module diskutiert, die das deCONZ PushAPI über Websockets unterstützen (die entsprechenden Modulversionen sind mittlerweile regulär verfügbar). Sensoren müssen hier nicht mehr gepollt werden.&lt;br /&gt;
&lt;br /&gt;
Mittlerweile funktioniert die Einbindung der RaspBee und ConBee Module auf einem sehr einfachen Weg. Dieser ist in diesem {{Link2Forum|Topic=95288|LinkText=Forenbeitrag}} zusammengefasst. Zusätzliche Plugins sind nicht mehr nötig.&lt;br /&gt;
&lt;br /&gt;
=== Installation von deCONZ unter Proxmox auf einem Intel Nuc ===&lt;br /&gt;
Folgende Schritte sind notwendig, um unter Proxmox zu installieren:&lt;br /&gt;
&lt;br /&gt;
* Installation einer Ubuntu oder Debian VM:&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/lib/vz/template/iso/&lt;br /&gt;
wget http://releases.ubuntu.com/18.04/ubuntu-18.04.2-desktop-amd64.iso&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/lib/vz/template/iso/&lt;br /&gt;
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-9.8.0-amd64-xfce-CD-1.iso&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Weiterreichen des USB Devices in die VM:&lt;br /&gt;
: Auflistung der verfügbaren USB Geräte:&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
root@node1:~# lsusb&lt;br /&gt;
Bus 002 Device 004: ID 0403:6015 Future Technology Devices International, Ltd Bridge(I2C/SPI/UART/FIFO)&lt;br /&gt;
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub&lt;br /&gt;
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub&lt;br /&gt;
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:Der Conbee meldet sich als &amp;quot;Future Technology Devices International, Ltd Bridge(I2C/SPI/UART/FIFO)&amp;quot;, hier ist die ID wichtig (0403:6015).&lt;br /&gt;
:Anschließend kann das USB Gerät an die VM weitergeleitet werden. Der Wert 804 ist durch die ID der VM zu ersetzen. &lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qm set 804 -usb0 host=0403:6015&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Installation von deCONZ: &lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get update &amp;amp;&amp;amp; apt-get upgrade -y&lt;br /&gt;
wget http://www.dresden-elektronik.de/deconz/ubuntu/beta/deconz-2.05.60-qt5.deb&lt;br /&gt;
sudo dpkg -i deconz-2.05.60-qt5.deb &lt;br /&gt;
sudo apt install -f&lt;br /&gt;
sudo systemctl enable deconz&lt;br /&gt;
reboot now&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation von deCONZ unter Docker ===&lt;br /&gt;
https://hub.docker.com/r/marthoc/deconz/&lt;br /&gt;
&lt;br /&gt;
=== Installation von deCONZ auf einem RaspberryPI ===&lt;br /&gt;
Für den ConBee2 [https://phoscon.de/en/conbee2/install#raspbian kann der guten Installation von Phoscon gefolgt werden]. Entweder ihr installiert deCONZ direkt (wie hier beschrieben) oder über einen Docker Container. Der Docker Container hat ein paar Einschränkungen bzgl. Firmware Updates.&lt;br /&gt;
&lt;br /&gt;
Der ausführende Benutzer muss dialout Rechte haben um auf /dev/tty* zugreifen zu dürfen:&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo gpasswd -a pi dialout&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Im Standard wird deCONZ mit dem pi-Benutzer (user id 1000) ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Das deCONZ Repository bei APT hinzufügen (Vorteil davon ist dass später ganz normal mit sudo apt update/upgrade deCONZ aktualisieren könnt):&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget -O - http://phoscon.de/apt/deconz.pub.key | \&lt;br /&gt;
           sudo apt-key add -;&lt;br /&gt;
sudo sh -c &amp;quot;echo &#039;deb http://phoscon.de/apt/deconz \&lt;br /&gt;
            $(lsb_release -cs) main&#039; &amp;gt; \&lt;br /&gt;
            /etc/apt/sources.list.d/deconz.list&amp;quot;;&lt;br /&gt;
sudo apt update&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
deCONZ installieren:&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install deconz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn ihr euren RaspberryPI mit UI betreibt, kann deCONZ über &#039;&#039;Menu &amp;gt; Programming &amp;gt; deCONZ&#039;&#039; aufgerufen werden. Es gibt aber auch den Service-Modus, der ohne X11 funktionert. Hierfür die Datei &#039;&#039;/lib/systemd/system/deconz.service&#039;&#039; anpassen (ich habe z.B. den Port des Webservers geändert) und den Service wie folgt aktivieren:&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl enable deconz.service&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HUE auf der Fritzbox ==&lt;br /&gt;
Da auf der FB standardmäßig kein JSON installiert ist, muss dies nachinstalliert werden:  Man lädt das JSON-Paket http://search.cpan.org/CPAN/authors/id/M/MA/MAKAMAKA/JSON-2.53.tar.gz, packt es aus und kopiert den Inhalt vom &amp;lt;b&amp;gt;lib-Verzeichnis&amp;lt;/b&amp;gt; nach \fhem\lib\perl5\site_perl\5.12.2&lt;br /&gt;
&lt;br /&gt;
== HUE auf der Synology Diskstation ==&lt;br /&gt;
Da auf der DS standardmäßig kein JSON installiert ist, muss dies nachinstalliert werden, die Anleitung dazu {{Link2Forum|Topic=19093|Message=224641|LinkText=in diesem Forenbeitrag}}.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ZigBee]]&lt;br /&gt;
[[Kategorie:Lichteffektgeräte]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Hue&amp;diff=32409</id>
		<title>Hue</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Hue&amp;diff=32409"/>
		<updated>2020-01-11T10:59:55Z</updated>

		<summary type="html">&lt;p&gt;Moontear: Installation von deCONZ auf RaspberryPI ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right&amp;quot;&amp;gt;{{Infobox Modul&lt;br /&gt;
|Name=HUEBridge&lt;br /&gt;
|ModPurpose=Anbindung Bridge des Philips Hue Lighting System&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=HUEBridge&lt;br /&gt;
|ModForumArea=Zigbee&lt;br /&gt;
|ModTechName=30_HUEBridge.pm&lt;br /&gt;
|ModOwner=Andre ([http://forum.fhem.de/index.php?action=profile;u=430 Forum] / [[Benutzer Diskussion:justme|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|Name=HUEDevice&lt;br /&gt;
|ModPurpose=Ansteuerung Geräte des Philips Hue Lighting System über HUEBridge&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=HUEDevice&lt;br /&gt;
|ModForumArea=Zigbee&lt;br /&gt;
|ModTechName=31_HUEDevice.pm&lt;br /&gt;
|ModOwner=Andre ([http://forum.fhem.de/index.php?action=profile;u=430 Forum] / [[Benutzer Diskussion:justme|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HUE-Bridge ==&lt;br /&gt;
=== Einrichtung in FHEM ===&lt;br /&gt;
Die Einrichtung ist wirklich einfach. Mit&lt;br /&gt;
:&amp;lt;code&amp;gt;define Wiesollesheißen HUEBridge eu.re.ip.1&amp;lt;/code&amp;gt;&lt;br /&gt;
wird die Bridge eingebunden. Dann einfach auf den runden Knopf in der Mitte der Bridge drücken und sie wird von FHEM erkannt. Die drei Lampen des Starterkits werden automatisch erkannt und sind ansteuerbar -&amp;gt; fertig!&lt;br /&gt;
&lt;br /&gt;
WICHTIG: danach in FHEM einmal die Konfiguration speichern damit der Pairing-Key gesichert wird. Sonst muss beim nächsten FHEM-Neustart das Pairing erneut durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Falls die Hue Bridge resetet wurde bleibt der Status auf &amp;quot;paired&amp;quot; und geht nicht mehr auf connected. Um das pairing erneut durchzuführen, muss das Attribut &amp;quot;key&amp;quot; gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
=== Nonblocking ===&lt;br /&gt;
Wenn man möchte, dass die Versuche, die HUEBridge zu kontaktieren, FHEM nicht blockieren, sollte man &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;HUEBridge_Name&amp;gt; httpUtils 1&amp;lt;/code&amp;gt;&lt;br /&gt;
setzen.&lt;br /&gt;
&lt;br /&gt;
== HUE-Device ==&lt;br /&gt;
Als Gerät können alle Hue und LightLink kompatiblen Modelle verwendet werden, die sich an der Bridge anlernen lassen. Dies sind unter anderem:&lt;br /&gt;
*HueBulbs (E27, GU10, Lux, White, ...)&lt;br /&gt;
*Hue Beyond und Phoenix&lt;br /&gt;
*Friends of Hue LightStrips und LivingColors Bloom&lt;br /&gt;
*LivingColors ab gen2&lt;br /&gt;
*LivingColors Bloom, Iris und Aura&lt;br /&gt;
*LivingWhites Energiesparlampen&lt;br /&gt;
*LivingWhites Leuchtenadapter&lt;br /&gt;
*LivingWhites Bulbs&lt;br /&gt;
*[[HUE_Dimmer_Switch|Hue Tap und Hue Dimmer]] (mit Einschränkungen)&lt;br /&gt;
*dresden elektronik Vorschaltgeräte&lt;br /&gt;
*OSRAM LIGHTIFY Lampen (an der Hue Bridge angelernt)&lt;br /&gt;
*Müller Licht tint&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
Diese sind jeweils über eine Bridge (HueBridge) steuerbar. Die LivingColors und LivingWhites Geräte sind vorher mit Hilfe einer LivingColors oder LivingWhites Fernbedienung an der Bridge anzulernen.&lt;br /&gt;
&lt;br /&gt;
Es werden auch alle HUE Sensoren (Taster, Bewegungsmelder) unterstützt. Diese werden aber nicht per [[autocreate]] angelegt, sondern müssen manuell definiert werden. Hier ist auf ein passendes Polling-Intervall zu achten (siehe: [[HUE_Dimmer_Switch|HUE Dimmer Switch]]). &lt;br /&gt;
&lt;br /&gt;
Sensoren (und Aktoren) lassen sich Konfigurieren (parameter Einstellen) und eigene Set- und Get- Kommandos im definieren.&lt;br /&gt;
&lt;br /&gt;
=== Mögliche andere Gateways ===&lt;br /&gt;
HUEDevice Client-Devices können (mit leicht unterschiedlichem Funktionsumfang) auch mit den folgenden Gateways anderer Hersteller und dem zugehörigen Bridge-Device verwendet werden:&lt;br /&gt;
*[[Hue#RaspBee_.26_ConBee|RaspBee &amp;amp; ConBee mit deCONZ]] von Dresden Elektronik&lt;br /&gt;
** inklusive Push-API Erweiterung und Szenen &lt;br /&gt;
*[[TRÅDFRI| TRÅDFRI bzw. IKEA Home smart]] &lt;br /&gt;
** inklusive Rollos&lt;br /&gt;
*[https://github.com/bwssytems/ha-bridge HA-Bridge]&lt;br /&gt;
** inklusive aller [https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/Supported-Devices unterstützten Geräte] (Lampen, Sensoren, Thermostate, Rollos, ...)&lt;br /&gt;
** inklusive Update des HA-Bridge internen Gerätestatus per &amp;lt;code&amp;gt;habridgeupdate&amp;lt;/code&amp;gt; Kommando&lt;br /&gt;
*[[ZigBee#Lightify_von_Osram|OSRAM LIGHTIFY Gateway]]&lt;br /&gt;
&lt;br /&gt;
=== Grundlagen - Farbmodelle ===&lt;br /&gt;
Ein HueDevice kann per set-Befehl über unterschiedliche Farbmodelle gesteuert werden. In der folgenden Tabelle ist dargestellt, welche Werte-Kombinationen sinnvoll sind:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Farbmodell !! Bestandteile !! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| xyY || x- und y-Koordinate im Farbraum, Y ist die Helligkeit || &amp;lt;code&amp;gt; set bulb1 xy 0.4595,0.4105 : bri 220 &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| hue,sat,bri || Farbwert, Sättigung und Helligkeit || &amp;lt;code&amp;gt; set bulb1 hue 14922 : sat 144 : bri 220 &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ct || Farbwert über Farbtemperatur || &amp;lt;code&amp;gt; set bulb1 color 2600 &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| rgb || Farbbestandteile rot, grün und blau || &amp;lt;code&amp;gt; set bulb1 rgb FFC698 &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Zur Regelung der Helligkeit sind die Befehle &#039;&#039;bri&#039;&#039; und &#039;&#039;pct&#039;&#039; gleichwertig. &#039;&#039;bri&#039;&#039; hat den Bereich 0..254, &#039;&#039;pct&#039;&#039; 0..100 .&lt;br /&gt;
&lt;br /&gt;
Das Modul lässt die Mischung von Angaben aus unterschiedlichen Farbmodellen technisch zu, jedoch sind diese nicht immer sinnvoll.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HA-Bridge:&#039;&#039;&#039; In der HA-Bridge können virtuelle Devices definiert werden, welche in FHEM als &#039;&#039;Dimmable light&#039;&#039; eingebunden und verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den bereits beschriebenen set-Befehlen kann der Zustand der HA-Bridge-Devices mit Hilfe von &#039;&#039;habridgeupdate&#039;&#039; in Kombination mit &#039;&#039;on&#039;&#039;, &#039;&#039;off&#039;&#039;, &#039;&#039;pct&#039;&#039; und &#039;&#039;bri&#039;&#039; aktualisiert werden, ohne dass die HA-Bridge einen Schaltbefehl versendet. Beispiel: &amp;lt;code&amp;gt;set bulb1 habridgeupdate : on : pct 50&amp;lt;/code&amp;gt; Details siehe: [https://github.com/bwssytems/ha-bridge#update-bridge-internal-light-state].&lt;br /&gt;
&lt;br /&gt;
=== Darstellung im Webfrontend ===&lt;br /&gt;
Wenn man die SVG Icons verwendet, ist es sinnvoll, das Attribut color-icons zu setzen. Mit &lt;br /&gt;
:&amp;lt;code&amp;gt;attr HUEDevice1 color-icons 2&amp;lt;/code&amp;gt; &lt;br /&gt;
werden z.B. die Farben und der Dimmzustand der Lampe als Icon dargestellt. Damit das ganze funktioniert, muss noch &lt;br /&gt;
:&amp;lt;code&amp;gt;attr WEB iconPath fhemSVG:openautomation:default&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
== RaspBee &amp;amp; ConBee ==&lt;br /&gt;
Das HUEBridge Modul unterstützt auch die ZigBee Gateway Module RaspBee und ConBee von Dresden Elektronik über die zugehörige deCONZ Software und die Wireless Light Control WebApp und die Phoscon WebApp (kommt zusammen mit deConz). Die hierzu erhältlichen Funk-Vorschaltgeräte sind noch nicht getestet, sollten aber auch funktionieren.&lt;br /&gt;
&lt;br /&gt;
Im diesem {{Link2Forum|Topic=80985|LinkText=Forenbeitrag}} wird über Details der HUE Module diskutiert, die das deCONZ PushAPI über Websockets unterstützen (die entsprechenden Modulversionen sind mittlerweile regulär verfügbar). Sensoren müssen hier nicht mehr gepollt werden.&lt;br /&gt;
&lt;br /&gt;
Mittlerweile funktioniert die Einbindung der RaspBee und ConBee Module auf einem sehr einfachen Weg. Dieser ist in diesem {{Link2Forum|Topic=95288|LinkText=Forenbeitrag}} zusammengefasst. Zusätzliche Plugins sind nicht mehr nötig.&lt;br /&gt;
&lt;br /&gt;
=== Installation von deCONZ unter Proxmox auf einem Intel Nuc ===&lt;br /&gt;
Folgende Schritte sind notwendig, um unter Proxmox zu installieren:&lt;br /&gt;
&lt;br /&gt;
* Installation einer Ubuntu oder Debian VM:&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/lib/vz/template/iso/&lt;br /&gt;
wget http://releases.ubuntu.com/18.04/ubuntu-18.04.2-desktop-amd64.iso&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/lib/vz/template/iso/&lt;br /&gt;
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-9.8.0-amd64-xfce-CD-1.iso&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Weiterreichen des USB Devices in die VM:&lt;br /&gt;
: Auflistung der verfügbaren USB Geräte:&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
root@node1:~# lsusb&lt;br /&gt;
Bus 002 Device 004: ID 0403:6015 Future Technology Devices International, Ltd Bridge(I2C/SPI/UART/FIFO)&lt;br /&gt;
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub&lt;br /&gt;
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub&lt;br /&gt;
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:Der Conbee meldet sich als &amp;quot;Future Technology Devices International, Ltd Bridge(I2C/SPI/UART/FIFO)&amp;quot;, hier ist die ID wichtig (0403:6015).&lt;br /&gt;
:Anschließend kann das USB Gerät an die VM weitergeleitet werden. Der Wert 804 ist durch die ID der VM zu ersetzen. &lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qm set 804 -usb0 host=0403:6015&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Installation von deCONZ: &lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get update &amp;amp;&amp;amp; apt-get upgrade -y&lt;br /&gt;
wget http://www.dresden-elektronik.de/deconz/ubuntu/beta/deconz-2.05.60-qt5.deb&lt;br /&gt;
sudo dpkg -i deconz-2.05.60-qt5.deb &lt;br /&gt;
sudo apt install -f&lt;br /&gt;
sudo systemctl enable deconz&lt;br /&gt;
reboot now&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation von deCONZ unter Docker ===&lt;br /&gt;
https://hub.docker.com/r/marthoc/deconz/&lt;br /&gt;
&lt;br /&gt;
=== Installation von deCONZ auf einem RaspberryPI ===&lt;br /&gt;
Für den ConBee2 [https://phoscon.de/en/conbee2/install#raspbian kann der guten Installation von Phoscon gefolgt werden]. Hier einmal kopiert:&lt;br /&gt;
&lt;br /&gt;
Der ausführende Benutzer muss dialout Rechte haben um auf /dev/tty* zugreifen zu dürfen:&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo gpasswd -a pi dialout&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Im Standard wird deCONZ mit dem pi-Benutzer (user id 1000) ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Das deCONZ Repository bei APT hinzufügen (Vorteil davon ist dass später ganz normal mit sudo apt update/upgrade deCONZ aktualisieren könnt):&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget -O - http://phoscon.de/apt/deconz.pub.key | \&lt;br /&gt;
           sudo apt-key add -;&lt;br /&gt;
sudo sh -c &amp;quot;echo &#039;deb http://phoscon.de/apt/deconz \&lt;br /&gt;
            $(lsb_release -cs) main&#039; &amp;gt; \&lt;br /&gt;
            /etc/apt/sources.list.d/deconz.list&amp;quot;;&lt;br /&gt;
sudo apt update&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
deCONZ installieren:&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install deconz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn ihr euren RaspberryPI mit UI betreibt, kann deCONZ über &#039;&#039;Menu &amp;gt; Programming &amp;gt; deCONZ&#039;&#039; aufgerufen werden. Es gibt aber auch den Service-Modus, der ohne X11 funktionert. Hierfür die Datei &#039;&#039;/lib/systemd/system/deconz.service&#039;&#039; anpassen (ich habe z.B. den Port des Webservers geändert) und den Service wie folgt aktivieren:&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl enable deconz.service&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HUE auf der Fritzbox ==&lt;br /&gt;
Da auf der FB standardmäßig kein JSON installiert ist, muss dies nachinstalliert werden:  Man lädt das JSON-Paket http://search.cpan.org/CPAN/authors/id/M/MA/MAKAMAKA/JSON-2.53.tar.gz, packt es aus und kopiert den Inhalt vom &amp;lt;b&amp;gt;lib-Verzeichnis&amp;lt;/b&amp;gt; nach \fhem\lib\perl5\site_perl\5.12.2&lt;br /&gt;
&lt;br /&gt;
== HUE auf der Synology Diskstation ==&lt;br /&gt;
Da auf der DS standardmäßig kein JSON installiert ist, muss dies nachinstalliert werden, die Anleitung dazu {{Link2Forum|Topic=19093|Message=224641|LinkText=in diesem Forenbeitrag}}.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ZigBee]]&lt;br /&gt;
[[Kategorie:Lichteffektgeräte]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SONOS&amp;diff=31353</id>
		<title>SONOS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SONOS&amp;diff=31353"/>
		<updated>2019-10-14T11:21:22Z</updated>

		<summary type="html">&lt;p&gt;Moontear: Ganzer Artikel kaputt durch fehlende Klammern. Korrigiert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right&amp;quot;&amp;gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung des Sonos-Systems via UPnP&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=00_SONOS.pm&lt;br /&gt;
|ModOwner=Reinerlein&lt;br /&gt;
}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|Name=SONOSPLAYER&lt;br /&gt;
|ModPurpose=Steuerung eines Sonos Zoneplayer&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=SONOSPLAYER&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=21_SONOSPLAYER.pm&lt;br /&gt;
|ModOwner=Reinerlein&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sonos ist ein Multiroom-Musiksystem der kalifornischen Firma [http://www.sonos.com Sonos].&lt;br /&gt;
Es bietet die Möglichkeit der verteilten Musikabspielung und Steuerung, sowie der Verknüpfung von mehreren Playern, um diese dasselbe abspielen zu lassen. Hierfür gibt es verschiedene Abspiel-Komponenten, die in einem eigenen Netzwerk miteinander kommunizieren und für verschiedene Anwendungsfälle konzipiert wurden.&lt;br /&gt;
&lt;br /&gt;
Diese Beschreibung soll den Einstieg in die Steuerung der heimischen Zoneplayer erleichtern. Es werden die Verwendung und Einrichtung der dazugehörenden FHEM-Module &#039;&#039;&#039;SONOS&#039;&#039;&#039; und &#039;&#039;&#039;SONOSPLAYER&#039;&#039;&#039; beschrieben, und einige Beispiele für eine mehr oder weniger sinnvolle Nutzung von Events und Steuerungsmöglichkeiten gegeben.&lt;br /&gt;
&lt;br /&gt;
Sollte etwas fehlen oder unklar sein, dann einfach eine kurze Nachricht an den Autor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 0; margin-top:10px; margin-right: 315px; border: 1px solid #dfdfdf; padding: 0 1em 0.3em 1em; background-color:#fff0e0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&#039;&#039;&#039;! Achtung !&#039;&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
Obwohl die Module in FHEM mitgeliefert werden, sind trotzdem die Vorbedingungen bzgl. der Perl-Installation unter [[#Softwarevoraussetzungen|Softwarevoraussetzungen]] einzuhalten, da das Modul sonst nicht lauffähig ist.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kurzüberblick ==&lt;br /&gt;
Hier soll nur ein kurzer Überblick über die mittlerweile doch recht umfangreichen Möglichkeiten geboten werden:&lt;br /&gt;
*Automatisches Erkennen aller ZonePlayer im lokalen Netzwerk. Dabei werden alle Player einer Paarung zusammengehörig benannt und gruppiert&lt;br /&gt;
*Automatische Aktualisierung aller aktuellen (und wenn verfügbar: der nächsten) Titelinformationen innerhalb von FHEM&lt;br /&gt;
**Dabei wird für jede veränderte Information ein Event erzeugt, man kann also dediziert darauf reagieren&lt;br /&gt;
**Bei normalen Abspiellisten werden auch die Informationen zum nächsten Titel ermittelt und angezeigt&lt;br /&gt;
**Es können auch verschiedene Zusammenfassungen der bestehenden Informationen zusammengestellt werden&lt;br /&gt;
*Anzeige des aktuellen (oder auch nächsten) Covers als Weblink oder [[readingsGroup]]&lt;br /&gt;
*Steuern der ZonePlayer: Play, Pause, Nächster Titel, Vorheriger Titel, Lautstärke Lauter/Leiser (auch als vordefinierte Rampe), Stummschalten&lt;br /&gt;
*Alle Player auf einen Befehl hin stoppen, pausieren oder stummschalten lassen&lt;br /&gt;
*Einstellen und Abfragen der Abspielparameter Repeat, RepeatOne, Shuffle, CrossfadeMode, Loudness, Bass und Treble&lt;br /&gt;
*Festlegen einer minimalen und maximalen Lautstärke für jeden ZonePlayer (getrennt zwischen Normalbetrieb und Kopfhörernutzung)&lt;br /&gt;
*Laden, Speichern und Löschen von Playlisten (Laden und Speichern: auch M3U-Dateien aus dem Filesystem)&lt;br /&gt;
*Abspielen eines Sonos-Favoriten (z.B. Playlist, Spotify-Playlist, Titel, Radiosender, usw.)&lt;br /&gt;
*Abspielen beliebiger Titel (auch von Freigaben, die nicht von Sonos indiziert wurden)&lt;br /&gt;
*Abspielen beliebiger Radiostationen über deren HTTP-Link&lt;br /&gt;
*Hinzufügen beliebiger Titel und Radiostationen zur aktuellen Abspielliste&lt;br /&gt;
*Temporäres Abspielen von Dateien, mit nachfolgender Wiederherstellung des vorherigen Titels inkl. genauer Position im vorherigen Titel und der Lautstärke&lt;br /&gt;
*Füllen der aktuellen Abspielliste mit nach diversen Kriterien zusammengesuchten Titeln aus der Sonos Bibliothek&lt;br /&gt;
*Erzeugen und temporäres Abspielen von Sprachdurchsagen auf Basis von eingegebenen Texten und vorhandenen MP3-Dateien&lt;br /&gt;
**Wird standardmäßig über die Google-Übersetzungsmaschine realisiert&lt;br /&gt;
**Kann auch über eine eigenständige, lokale Installation eines Text2Speech-Tools realisiert werden&lt;br /&gt;
*Auslesen und Setzen/Starten der verfügbaren gespeicherten Playlisten, Radiofavoriten und Sonos-Favoriten&lt;br /&gt;
*Erzeugung und Bearbeitung von Alarmen, sowie Event bei Veränderung der Alarme duch andere Controller&lt;br /&gt;
*Setzen des Sleeptimer inkl. FHEM-Event bei Veränderung durch andere Controller und Ablauf des Timers&lt;br /&gt;
*Setzen und Auslesen der Gruppierungskonfiguration, sowie einzelnes Hinzufügen und Entfernen von Gruppenmitgliedern&lt;br /&gt;
*Bildung und Trennung von Stereopaaren&lt;br /&gt;
*Erzeugen von Events nach festgelegten Tastensequenzen (am Player)&lt;br /&gt;
*Umbenennen der Zonen und festlegen der Zonenicons&lt;br /&gt;
*Standardanzeige eines Player als ReadingsGroup mit automatischem Titel- und Coverwechsel sowie einer RemoteControl zum Steuern&lt;br /&gt;
*Anzeigemöglichkeit einer Vollbilddarstellung ähnlich dem Original-Controller&lt;br /&gt;
*Definitionsmöglichkeit von automatischen Bookmarks, die beim Aufrufen derselben Playliste oder Titel die gespeicherte Position anspringen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kurze Anmerkungen zur Sonos-Landschaftsgestaltung ==&lt;br /&gt;
Es ist im allgemeinen besser, die Sonos-Landschaft mit allen Paarungen vor dem Einrichten des Moduls zu erzeugen. &lt;br /&gt;
Dieses Modul benennt die FHEM-Playerdevices nach den Zonennamen und der jeweiligen Funktion des Players innerhalb der Paarung.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet aber auch, dass in diesem Augenblick möglichst keine Player gruppiert sein sollten (mehrere Zonen spielen dasselbe ab), da diese sonst komische Namen erhalten könnten (es geht hier ausschliesslich um die FHEM-interne Device-Benennung, natürlich bleiben die Zoneplayer selbst wie sie sind).&amp;lt;br /&amp;gt;Insbesondere gilt das für temporäre Stereopaare. Diese nicht ständigen Paare sollten erst getrennt werden, bis das Modul alle Player erkannt und angelegt hat.&lt;br /&gt;
&lt;br /&gt;
Damit man nun eine einigermaßen passende Bezeichnung in FHEM erhält, sollte also die Gestaltung der Sonos-Player abgeschlossen sein. Natürlich funktioniert das System nach einer FHEM-Einrichtung und anschließender Sonos-Umbenennung immer noch, da intern alles mittels der eindeutigen Bezeichner gehandhabt wird, allerdings wird es u.U. etwas unübersichtlich bzgl. der FHEM-Device-Namen. Diese passen dann nicht mehr zu den Zonennamen (die entsprechenden Readings werden aber natürlich korrekt besetzt), was man aber natürlich auch nachträglich wieder anpassen kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Man kann das Attribut &#039;&#039;disable&#039;&#039; am Sonos-Device setzen, um den Subprozess zu beenden. Damit kann man seine Zonenlandschaft später erweitern, ohne FHEM komplett abschalten zu müssen.&lt;br /&gt;
Nachdem die Einrichtung des neuen Zoneplayers abgeschlossen ist, löscht man das Attribut &#039;&#039;disable&#039;&#039; einfach wieder - der Subprozess startet und beginnt mit der Erkennung der neuen Komponenten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einbindung von Sonos in FHEM ==&lt;br /&gt;
Die Einbindung erfolgt über die beiden Module &#039;&#039;&#039;SONOS&#039;&#039;&#039; und &#039;&#039;&#039;SONOSPLAYER&#039;&#039;&#039;. Dabei ist Hauptsächlich das Modul &#039;&#039;&#039;SONOS&#039;&#039;&#039; einzurichten. Alle Zoneplayer werden automatisch erkannt, und dann entsprechend angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;Devicename&amp;gt; SONOS [&amp;lt;Hostname:Port&amp;gt; [Prüfintervall [WaitTime [DelayTime]]]]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiele für die Einbindung ===&lt;br /&gt;
Einfachste Einbindung mit Standardwerten:&lt;br /&gt;
&amp;lt;pre&amp;gt;define Sonos SONOS&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einbindung mit Kontrolle über den verwendeten Port und das IsAlive Prüfintervall:&lt;br /&gt;
&amp;lt;pre&amp;gt;define Sonos SONOS localhost:4711 45&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Name dieses Devices ist automatisch das Namensprefix beim Anlegen der SonosPlayer. In diesem Fall werden alle erkannten Zoneplayer mit dem Prefix &amp;quot;&amp;lt;code&amp;gt;Sonos_&amp;lt;/code&amp;gt;&amp;quot; anfangen. Natürlich kann man das nach dem Anlegen einfach umbenennen.&amp;lt;br /&amp;gt;Als Prüfintervall wurde hier 45s angegeben. Wenn kein Intervall angegeben wird, dann werden 30s verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define Sonos SONOS localhost:4711 30 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wurde eine verkürzte Wartezeit für den Subprozess von einer Sekunde angegeben. Bei schnellen Systemen wird dadurch der gesamte Startmechanismus schneller verarbeitet.&amp;lt;br /&amp;gt;Wenn nichts angegeben wird, dann wird 8s verwendet, was einen guten Wert für einen Raspberry Pi darstellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define Sonos SONOS localhost:4711 30 1 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wurde noch eine zusätzliche Verzögerung von 5s eingebaut, da manche Systeme bei einem FHEM-Restart oder ähnlichem die belegten Ports nicht schnell genug wieder freigeben.&amp;lt;br /&amp;gt;Hier kann diese Verzögerung helfen, da erst nach Ablauf dieser Zeitspanne ein Verbindungsversuch zum SubProzess unternommen wird (und auch erst dann der Versuch einen eigenen Prozess zu Starten unternommen wird).&amp;lt;br /&amp;gt;Wenn nichts angegeben wird, dann wird keine Verzögerung durchgeführt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Namensvergabe der automatischen Erkennung ===&lt;br /&gt;
Der automatische Erkennungsmechanismus vergibt Devicenamen auf Basis der Zonennamen und der Funktion eines Players innerhalb eines Stereopaares oder einer Surroundkonstellation.&lt;br /&gt;
Dabei wird immer ein Player (der Master dieser Konstellationen) nur den Namen der Zone erhalten (ohne Anhängekürzel) und die anderen werden mit Kürzel versehen. Dadurch ist der Master der Zone automatisch dasjenige Playerdevice, welches gesteuert werden muss. Alle anderen Player leiten Steueranfragen automatisch an den Master weiter.&lt;br /&gt;
Besteht eine Zone nur aus einem Player, so gibt es natürlich auch nur diesen einen als Master.&lt;br /&gt;
&lt;br /&gt;
Als Anhängekürzel wird immer der Inhalt des Readings &#039;&#039;&#039;fieldType&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Bei der Funktion gibt es später dann zwei Fälle zu unterscheiden:&lt;br /&gt;
*Stereopaare werden von Sonos intern als Gruppe behandelt. Das bedeutet, dass der zweite Player (der nicht-Master) immer &#039;&#039;PLAYING&#039;&#039; als Status anzeigt, und nur der Master den korrekten Wert. Stereopaare haben, wie normale Gruppen oder Einzelplayer auch, eine Verzögerung von 70ms zu einem Eingangssignal.&lt;br /&gt;
*Surroundsysteme werden als Satelliten angebunden, und werden vom Modul nur mit &#039;&#039;intialized&#039;&#039; angegeben, da Sonos für diese nie eine Statusmeldung sendet. Diese Playersysteme haben eine verkürzte Verzögerung von 30ms zu einem Eingangssignal.&lt;br /&gt;
&lt;br /&gt;
Dabei ist ein Eingangsignal so etwas wie ein Line-In- oder SPDIF-Eingang.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Beispiel für eine Zonenlandschaft ====&lt;br /&gt;
Folgende Landschaft mit Status könnte es geben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sonos_Schlafzimmer      (STOPPED =&amp;gt; [Keine Musikdatei])&lt;br /&gt;
Sonos_Schlafzimmer_RF   (PLAYING =&amp;gt;  &#039;Keine Titelinformation bei Gruppenwiedergabe&#039;)&lt;br /&gt;
Sonos_Kinderzimmer      (PAUSED_PLAYBACK =&amp;gt;  &#039;Titelinformation&#039;)&lt;br /&gt;
Sonos_Gaestezimmer      (STOPPED =&amp;gt; [Keine Musikdatei])&lt;br /&gt;
Sonos_Wohnzimmer        (STOPPED =&amp;gt; [Keine Musikdatei])&lt;br /&gt;
Sonos_Wohnzimmer_LR     (initialized)&lt;br /&gt;
Sonos_Wohnzimmer_RR     (initialized)&lt;br /&gt;
Sonos_Wohnzimmer_SW     (initialized)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dabei wäre Schlafzimmer ein Stereopaar, Kinder- und Gästezimmer jeweils ein einzelner Player und Wohnzimmer z.B. eine Playbar mit zwei Rear-Lautsprechern und Subwoofer. In keiner Zone läuft eine aktive Wiedergabe.&lt;br /&gt;
Hier kann man schön die einzelnen Zustände und die erzeugten Namen erkennen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Zusammenfassung der Spracheinrichtung ===&lt;br /&gt;
Um die Sprachausgabe des Moduls nutzen zu können, müssen einige Grundvoraussetzungen geschaffen werden.&lt;br /&gt;
Hier soll nur eine kurze Übersicht geschaffen werden, was alles getan werden muss. Die einzelnen Themen selbst sind in diesem Wiki-Artikel bereits beschrieben.&lt;br /&gt;
*Es muss einen Speicherplatz für Dateien geben, wo das Sonos-Modul (also FHEM) schreibend zugreifen kann, und das Sonos-System selbst lesend zugreifen kann. Das Sonos-System versucht immer ohne Passwort zuzugreifen, FHEM mit seinem Benutzerkontext&lt;br /&gt;
**Dafür kann man sich z.B. auf dem lokalen Debian-System (sofern FHEM darauf läuft) eine Samba-Freigabe einrichten. Das ist unter &amp;quot;[[#Einrichtung von Samba für Sprachausgabemöglichkeit|Einrichtung von Samba für Sprachausgabemöglichkeit]]&amp;quot; beschrieben.&lt;br /&gt;
**Man kann sich auch auf einem bestehenden NAS-System einen Ordner extra für diesen Zweck anlegen und entsprechend freigeben&lt;br /&gt;
**Bei Problemen bitte die Datei-/Ordnerrechte genauestens prüfen, notfalls mit einem Windows-/Macrechner einen direkten Zugriffstest durchführen. Hier sind die häufigsten Fehlerquellen zu suchen.&lt;br /&gt;
*Es müssen mindestens die Attribute &#039;&#039;&#039;targetSpeakDir&#039;&#039;&#039; und &#039;&#039;&#039;targetSpeakURL&#039;&#039;&#039; am FHEM-Sonos-Device gesetzt werden. Diese Attribute werden bei den &amp;quot;[[#Sprachattribute|Sonos Sprachattributen]]&amp;quot; beschrieben.&lt;br /&gt;
*Empfehlenswert ist auch das Setzen eines der Attribute &#039;&#039;&#039;targetSpeakFileTimestamp&#039;&#039;&#039; oder &#039;&#039;&#039;targetSpeakFileHashCache&#039;&#039;&#039; am FHEM-Sonos-Device. Damit werden Indizierungsprobleme des Sonos-Systems umgangen. Es ist nicht sinnvoll beide Attribute gleichzeitig zu setzen. Auch diese Attribute werden bei den &amp;quot;[[#Sprachattribute|Sonos Sprachattributen]]&amp;quot; beschrieben.&lt;br /&gt;
*Wenn man die Möglichkeit der in den Text eingebetteten MP3-Dateien nutzen möchte, ist es empfehlenswert, das Attribut &#039;&#039;&#039;targetSpeakMP3FileDir&#039;&#039;&#039; für den Standardpfad der Jingles zu setzen. Damit werden die einzugebenden Texte deutlich übersichtlicher.&lt;br /&gt;
*Bei Bedarf kann man sich ein lokales Programm installieren und dem Modul angeben, welches die Sprachausgabedatei erzeugt.&amp;lt;br /&amp;gt;Das sollte man nicht als Anfänger tun!&lt;br /&gt;
**Unter [[#Beispiel für einen Offline-Sprachsynthetisierer|Beispiel für einen Offline-Sprachsynthetisierer]] ist das am Beispiel von &#039;&#039;espeak&#039;&#039; beschrieben.&lt;br /&gt;
**Das Programm kann man dem Modul mit den Attributen &#039;&#039;Speak1&#039;&#039;, &#039;&#039;Speak2&#039;&#039;, &#039;&#039;Speak3&#039;&#039; und &#039;&#039;Speak4&#039;&#039; einstellen. Also bis zu vier verschiedene. Diese Attribute werden ebenfalls bei den &amp;quot;[[#Sprachattribute|Sonos Sprachattributen]]&amp;quot; beschrieben.&lt;br /&gt;
*Mit einem Shell-Skript kann man den Cacheordner für die Sprachausgabe bereinigen lassen. Unter [[#Beispiel für ein Shell-Skript zum Aufräumen eines Speak-Verzeichnisses|Beispiel für ein Shell-Skript zum Aufräumen eines Speak-Verzeichnisses]] gibt es den Code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Zusammenfassung der Bookmarkeinrichtung ===&lt;br /&gt;
Da die Möglichkeiten mit den Bookmarks sehr vielfältig sind, soll in dieser kleinen Zusammenfassung ein Überblick gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich muss zwischen den beiden Grundbereichen für Bookmarks unterschieden werden. Diese können unabhängig voneinander verwendet werden:&lt;br /&gt;
*Bookmarks für die aktuelle Abspielliste/Playlisten&lt;br /&gt;
*Bookmarks für Titel&lt;br /&gt;
&lt;br /&gt;
Bei den Listen wird über die aktuelle Abspielliste (also alle Titel die gerade so abgespielt werden sollen) ein Hashwert gebildet, und mit diesem der aktuelle Titel (genauer: die Tracknummer) zusammen mit einem Zeitstempel gespeichert.&lt;br /&gt;
&lt;br /&gt;
Bei den Titeln wird für jeden Titel die genaue Position im Titel zusammen mit einem Zeitstempel gespeichert, wenn der Titel gewechselt wird.&lt;br /&gt;
&lt;br /&gt;
Beide Bereiche behandeln also getrennte Situationen und können jeder für sich, aber auch gemeinsam, sinnvoll eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration der Bookmarks wird erst bei einem Neustart des SubProzesses (also durch einen FHEM-Neustart (vorher Speichern nicht vergessen) oder dem Setzen/Zurücksetzen des Attributs &#039;&#039;&#039;disable&#039;&#039;&#039; am Sonos-Device) berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
Mit den Befehlen &#039;&#039;DisableBookmark&#039;&#039; und &#039;&#039;EnableBookmark&#039;&#039; können Bookmark-Gruppen (temporär) deaktiviert bzw. wieder aktiviert werden.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Diese Änderung gilt nur bis zum nächsten FHEM Neustart, da dieser Zustand nicht in die Definition (also das Attribut) zurückgeschrieben wird.&lt;br /&gt;
&lt;br /&gt;
Die im Arbeitsspeicher gehaltenen Bookmarks werden beim Starten des SubProzesses aus den vorhandenen Dateien geladen, und beim Beenden entsprechend dort gespeichert.&lt;br /&gt;
Man kann mit dem Befehl &#039;&#039;&#039;SaveBookmarks&#039;&#039;&#039; (oder entsprechend &#039;&#039;&#039;LoadBookmarks&#039;&#039;&#039;) diesen Vorgang selber anstossen.&lt;br /&gt;
Bei einem globalen Save-Aufruf (also dem FHEM-Befehl &#039;&#039;&#039;&#039;save&#039;&#039;&#039;&#039;) werden die Bookmark-Daten ebenfalls gesichert.&lt;br /&gt;
&lt;br /&gt;
Die komplette Verarbeitung der Bookmarks erfolgt im SubProzess (zunächst mal ohne FHEM-Interaktion) und damit sehr nah an den Ereignissen des Players.&lt;br /&gt;
Im Normalfall hört man z.B. beim Sprung innerhalb eines Titel (nach einem Wechsel des Titels) gerade mal ein kurzes Zucken des Titels, bevor dieser schon &#039;&#039;vorgespult&#039;&#039; wird.&lt;br /&gt;
Beim Anspringen eines Titels in der aktuellen Abspielliste (wegen der Hash-Berechnung, je nach Länge der aktuellen Abspielliste) etwas länger, aber bei mir deutlich unter einer Sekunde.&lt;br /&gt;
FHEM ist nur insoweit involviert, da die Sprungaktionen abschließend als &#039;&#039;&#039;LastActionResult&#039;&#039;&#039;-Aktualisierungen gemeldet werden.&lt;br /&gt;
&lt;br /&gt;
==== Attribute für Bookmarks am Sonos-Device ====&lt;br /&gt;
*&amp;lt;code&amp;gt;bookmarkSaveDir&amp;lt;/code&amp;gt;: Verzeichnis, wo die Bookmarkdateien abgelegt und geladen werden sollen&lt;br /&gt;
*&amp;lt;code&amp;gt;bookmarkPlaylistDefinition&amp;lt;/code&amp;gt;: Definition für Playlist-Bookmarks&lt;br /&gt;
*&amp;lt;code&amp;gt;bookmarkTitleDefinition&amp;lt;/code&amp;gt;: Definition für Titel-Bookmarks&lt;br /&gt;
&lt;br /&gt;
==== Readings für Bookmarks am Sonosplayer-Device ====&lt;br /&gt;
*&amp;lt;code&amp;gt;QueueHash&amp;lt;/code&amp;gt;: Der Hash-Wert für die aktuelle Abspielliste. Damit kann man in eigenen Events bei Bedarf Dinge selber entsprechend verarbeiten.&lt;br /&gt;
&lt;br /&gt;
==== Bookmarks für die aktuelle Abspielliste/Playlisten ====&lt;br /&gt;
Attributname am Sonos-Device:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;bookmarkPlaylistDefinition&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Definition:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;Groupname&amp;gt;:&amp;lt;PlayerDeviceRegEx&amp;gt;:&amp;lt;MinListLength&amp;gt;:&amp;lt;MaxListLength&amp;gt;:&amp;lt;MaxAge&amp;gt; [...]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bedeutung:&lt;br /&gt;
*&amp;lt;code&amp;gt;Groupname&amp;lt;/code&amp;gt;: Ein beliebiger Name, der auch als Dateiname verwendet werden kann und keinerlei Sonder-/Leerzeichen enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;PlayerDeviceRegEx&amp;lt;/code&amp;gt;: Ein regulärer Ausdruck, der für das Matching der zu berücksichtigten Player verwendet wird. Das Matching erfolgt auf dem FHEM-Devicenamen. Wenn nicht angegeben, dann wird &#039;&#039;&#039;&#039;.*&#039;&#039;&#039;&#039; verwendet.&lt;br /&gt;
*&amp;lt;code&amp;gt;MinListLength&amp;lt;/code&amp;gt;: Eine Zahl die angibt, wieviel Titel eine aktuelle Abspielliste mindestens haben muss, um berücksichtigt zu werden. Wenn nicht angegeben, dann wird &#039;&#039;&#039;&#039;0&#039;&#039;&#039;&#039; verwendet.&lt;br /&gt;
*&amp;lt;code&amp;gt;MaxListLength&amp;lt;/code&amp;gt;: Eine Zahl die angibt, wieviel Titel eine aktuelle Abspielliste maximal haben darf, um berücksichtigt zu werden. Wenn nicht angegeben, dann wird &#039;&#039;&#039;&#039;99999&#039;&#039;&#039;&#039; verwendet.&lt;br /&gt;
*&amp;lt;code&amp;gt;MaxAge&amp;lt;/code&amp;gt;: Das maximale Alter für die Verwendung eines gespeicherten Bookmarks in Sekunden. Hier kann ein beliebiger Perl-Ausdruck (natürlich ohne Doppelpunkte) verwendet werden, der zu einer Zahl evaluierbar sein muss. Wenn nicht angegeben, dann wird &#039;&#039;&#039;&#039;28*24*60*60&#039;&#039;&#039;&#039; (also vier Wochen) verwendet.&lt;br /&gt;
&lt;br /&gt;
Nach hinten hin dürfen die Doppelpunkte von leergelassenen Werten ebenfalls weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
Es können beliebig viele Gruppen mit diversen (auch überlappenden) Bereichen gebildet werden. Diese verschiedenen Gruppen werden mit Leerzeichen getrennt, sodass innerhalb einer Bookmarkdefinition selbst keinerlei Leerzeichen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
Die Dateinamen für das Speichern und Laden werden wie folgt gebildet: &amp;amp;lt;bookmarkSaveDir&amp;amp;gt;/BookmarkPlaylist_&amp;amp;lt;BookmarkGroupName&amp;amp;gt;.save&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
*&amp;lt;code&amp;gt;Eltern:Sonos_(Schlaf|Wohn|Ess)zimmer&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Hiermit wird eine Gruppe mit dem Namen &#039;&#039;&#039;Eltern&#039;&#039;&#039; definiert, die alle Listen, die auf den drei Playern &#039;&#039;&#039;Schlafzimmer&#039;&#039;&#039;, &#039;&#039;&#039;Wohnzimmer&#039;&#039;&#039; und &#039;&#039;&#039;Esszimmer&#039;&#039;&#039; verwendet werden, beachtet.&lt;br /&gt;
*&amp;lt;code&amp;gt;Kind1:Sonos_Kind1:0:5&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Hiermit wird eine Gruppe &#039;&#039;&#039;Kind1&#039;&#039;&#039; definiert, die alle Listen, die mindestens 0 und maximal 5 Titel haben, berücksichtigt.&lt;br /&gt;
*&amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Alle Listen aller Player werden berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
==== Bookmarks für Titel ====&lt;br /&gt;
Attributname am Sonos-Device:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;bookmarkTitleDefinition&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Definition:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;Groupname&amp;gt;:&amp;lt;PlayerdeviceRegEx&amp;gt;:&amp;lt;TrackURIRegEx&amp;gt;:&amp;lt;MinTitleLength&amp;gt;:&amp;lt;RemainingLength&amp;gt;:&amp;lt;MaxAge&amp;gt;:&amp;lt;ReadOnly&amp;gt; [...]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bedeutung:&lt;br /&gt;
*&amp;lt;code&amp;gt;Groupname&amp;lt;/code&amp;gt;: Ein beliebiger Name, der auch als Dateiname verwendet werden kann und keinerlei Sonder-/Leerzeichen enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;PlayerDeviceRegEx&amp;lt;/code&amp;gt;: Ein regulärer Ausdruck, der für das Matching der zu berücksichtigten Player verwendet wird. Das Matching erfolgt auf dem FHEM-Devicenamen. Wenn nicht angegeben, dann wird &#039;&#039;&#039;&#039;.*&#039;&#039;&#039;&#039; verwendet.&lt;br /&gt;
*&amp;lt;code&amp;gt;TrackURIRegEx&amp;lt;/code&amp;gt;: Ein regulärer Ausdruck, der für das Matching der zu berücksichtigten Titel verwendet wird. Wenn nicht angegeben, dann wird &#039;&#039;&#039;.*&#039;&#039;&#039;&#039; verwendet.&lt;br /&gt;
*&amp;lt;code&amp;gt;MinTitleLength&amp;lt;/code&amp;gt;: Die minimale Lieddauer in Sekunden, die der Titel lang sein muss, um berücksichtigt zu werden. Wenn nicht angegeben, dann wird &#039;&#039;&#039;&#039;60&#039;&#039;&#039;&#039; verwendet.&lt;br /&gt;
*&amp;lt;code&amp;gt;RemainingLength&amp;lt;/code&amp;gt;: Die minimale Restspielzeit in Sekunden, die ein Titel noch haben muss, um berücksichtigt zu werden. Wenn nicht angegeben, dann wird &#039;&#039;&#039;&#039;10&#039;&#039;&#039;&#039; verwendet.&lt;br /&gt;
*&amp;lt;code&amp;gt;MaxAge&amp;lt;/code&amp;gt;: Das maximale Alter für die Verwendung eines gespeicherten Bookmarks in Sekunden. Hier kann ein beliebiger Perl-Ausdruck (natürlich ohne Doppelpunkte) verwendet werden, der zu einer Zahl evaluierbar sein muss. Wenn nicht angegeben, dann wird &#039;&#039;&#039;&#039;28*24*60*60&#039;&#039;&#039;&#039; (also vier Wochen) verwendet.&lt;br /&gt;
*&amp;lt;code&amp;gt;ReadOnly&amp;lt;/code&amp;gt;: Wenn hier etwas angegeben wird, was von Perl als &#039;&#039;&#039;true&#039;&#039;&#039; erkannt wird, dann wird diese Gruppe beim Aufruf von &#039;&#039;&#039;SaveBookmarks&#039;&#039;&#039; (also auch beim Beenden von FHEM) nicht berücksichtigt. Wenn nicht angegeben, dann wird &#039;&#039;&#039;&#039;0&#039;&#039;&#039;&#039; verwendet (die Gruppe wird also gespeichert).&lt;br /&gt;
&lt;br /&gt;
Nach hinten hin dürfen die Doppelpunkte von leergelassenen Werten ebenfalls weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
Es können beliebig viele Gruppen mit diversen (auch überlappenden) Bereichen gebildet werden. Diese verschiedenen Gruppen werden mit Leerzeichen getrennt, sodass innerhalb einer Bookmarkdefinition selbst keinerlei Leerzeichen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
Die Dateinamen für das Speichern und Laden werden wie folgt gebildet: &amp;amp;lt;bookmarkSaveDir&amp;amp;gt;/Bookmark_&amp;amp;lt;BookmarkGroupName&amp;amp;gt;.save&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
*&amp;lt;code&amp;gt;Eltern:Sonos_(Schlaf|Wohn|Ess)zimmer&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Hiermit wird eine Gruppe mit dem Namen &#039;&#039;&#039;Eltern&#039;&#039;&#039; definiert, die alle Titel, die auf den drei Playern &#039;&#039;&#039;Schlafzimmer&#039;&#039;&#039;, &#039;&#039;&#039;Wohnzimmer&#039;&#039;&#039; und &#039;&#039;&#039;Esszimmer&#039;&#039;&#039; laufen, beachtet.&lt;br /&gt;
*&amp;lt;code&amp;gt;Kind1:Sonos_Kind1:.*?\/Hörspiele\/.*:240:30&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Hiermit wird eine Gruppe &#039;&#039;&#039;Kind1&#039;&#039;&#039; definiert, die alle Titel, die im Pfad den Teil &#039;&#039;&#039;/Hörspiele/&#039;&#039;&#039; enthalten, mindestens 240 Sekunden (also vier Minuten) lang und mehr als 30 Sekunden vom Ende entfernt sind, berücksichtigt.&lt;br /&gt;
*&amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Alle Titel aller Player werden berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
==== Hinweise ====&lt;br /&gt;
*Beim Speichern/Laden kann der Einfachheit halber nur der Gruppenname mitgegeben werden. Gibt es sowohl im Bereich Playlist als auch im Bereich Titel eine Gruppe mit diesem Namen, dann werden beide gespeichert/geladen. Wenn man das verhindern möchte, dann müssen die Gruppennamen global eindeutig sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware-/Betriebssystemvoraussetzungen ==&lt;br /&gt;
Diese Liste sollte im Laufe der Zeit fortgeführt werden. Es soll die Hardware-/Softwarevoraussetzungen festhalten, um Probleme im Vorfeld erkennen zu können.&lt;br /&gt;
&lt;br /&gt;
Funktionierende Kombinationen:&lt;br /&gt;
*Windows, ActivePerl 32Bit (zusätzliche Pakete sollten dort mit Hilfe des mitgelieferten, grafischen Paketmanagers installiert werden)&lt;br /&gt;
*Raspberry Pi, Default-Perl&lt;br /&gt;
*Mac Mini, Perl 5.18 mit &#039;&#039;-useThreads&#039;&#039; kompiliert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problematische Kombinationen:&lt;br /&gt;
*FritzBox: Anscheinend ist Perl dort ohne Thread-Möglichkeit kompiliert. Diese sind aber essentiell notwendig für dieses Modul.&lt;br /&gt;
*Windows, ActivePerl 64Bit (das Paket SOAP::Lite gibt es momentan nicht für 64Bit)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Anpassungen bei Nutzung von IPTables als Firewall ==&lt;br /&gt;
Benutzt man bereits IPTables, so müssen folgende Regeln hinzugefügt werden. z.B. unter /etc/defauts/iptables&lt;br /&gt;
&lt;br /&gt;
 *filter&lt;br /&gt;
 :INPUT DROP [0:0]&lt;br /&gt;
 :FORWARD DROP [0:0]&lt;br /&gt;
 :OUTPUT ACCEPT [0:0]&lt;br /&gt;
 &lt;br /&gt;
 # Sonos Kommunikation&lt;br /&gt;
 -A INPUT -m pkttype --pkt-type multicast -j ACCEPT&lt;br /&gt;
 -A INPUT -s 224.0.0.0/8 -j ACCEPT&lt;br /&gt;
 &lt;br /&gt;
 # alles im lokalen LAN&lt;br /&gt;
 -A INPUT -s 192.168.0.0/16 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Softwarevoraussetzungen ==&lt;br /&gt;
Für die Verwendung sind Perlmodule notwendig, die unter Umständen noch nachinstalliert werden müssen:&lt;br /&gt;
*&#039;&#039;&#039;LWP::Simple&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;LWP::UserAgent&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;SOAP::Lite&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;HTTP::Request&#039;&#039;&#039;&lt;br /&gt;
*(&#039;&#039;&#039;XML::Parser::Lite&#039;&#039;&#039;)&amp;lt;br /&amp;gt;Ist im Normalfall im Standardpaket von Perl enthalten. Kann aber u.U. fehlen (scheint unter Ubuntu und verschiedenen Debian-Systemen so zu sein), und muss dann manuell nachinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Installation dieser Module geht in der Regel per CPAN. Das bedeutet das zum Beispiel mit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo cpan LWP::Simple&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
das Modul &amp;quot;&amp;lt;code&amp;gt;LWP::Simple&amp;lt;/code&amp;gt;&amp;quot; installiert wird. Wenn man bereits als Benutzer &#039;&#039;&#039;root&#039;&#039;&#039; arbeitet, dann ist das &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; natürlich nicht nötig.&lt;br /&gt;
&lt;br /&gt;
Sollte es bei der Installation mittels CPAN zu Problemen kommen, dann folgt hier eine Beschreibung der manuellen Installation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hinweis für Debian-Systeme ===&lt;br /&gt;
Bei Debian-basierten Systemen (also auch Raspbian für den Raspberry Pi oder Ubuntu usw.) kann auch mittels&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install &amp;lt;paketname&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
installiert werden. Manchmal ist es etwas schwieriger, die Paketnamen zu ermitteln, aber Google ist da sehr hilfreich.&lt;br /&gt;
&lt;br /&gt;
Hier mal die Liste für die oben genannten Pakete:&lt;br /&gt;
*&#039;&#039;&#039;LWP::Simple&#039;&#039;&#039;-Paketname (inkl. &#039;&#039;&#039;LWP::UserAgent&#039;&#039;&#039; und &#039;&#039;&#039;HTTP::Request&#039;&#039;&#039;): &amp;lt;code&amp;gt;libwww-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;SOAP::Lite&#039;&#039;&#039;-Paketname: &amp;lt;code&amp;gt;libsoap-lite-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;XML::Parser::Lite&#039;&#039;&#039;-Paketname: &amp;lt;code&amp;gt;libxml-parser-lite-perl&amp;lt;/code&amp;gt; oder falls nicht verfügbar &amp;lt;code&amp;gt;libxml-parser-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hinweis für Windows-Systeme mit ActivePerl ===&lt;br /&gt;
Bei Windows Systemen mit ActivePerl kann man die Installation über den ActivePerl Packagemanager durchführen:&lt;br /&gt;
*Installation von Package LWP (inkl. LWP::UserAgent und HTTP::Request)&lt;br /&gt;
*Installation von Package SOAP::Lite&lt;br /&gt;
**SOAP::Lite-Besonderheit für Versionen nach 5.18:&lt;br /&gt;
***Eine neue Paketquelle aus den Vorschlägen oder manuell hinzufügen: Bribes de Perl (http://www.bribes.org/perl/ppm)&lt;br /&gt;
***Installation von Package: SOAP::Lite&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Windows ActivePerl 64Bit kann momentan nicht verwendet werden, da es das Paket SOAP::Lite aktuell nicht gibt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Installation LWP::Simple ===&lt;br /&gt;
Wenn sich dieses Paket nicht einfach per CPAN-Anweisung installieren läßt, dann hilft folgende Anleitung weiter. &lt;br /&gt;
Beim Abbruch der Installation mittels CPAN erscheint mittendrin ein Fehler, das die Datei nicht entpackt werden könne (couldn&#039;t untar). Da scheint es einen Fehler im Installationsskript zu geben.&lt;br /&gt;
&lt;br /&gt;
Man kann das aber auch Manuell installieren:&lt;br /&gt;
*Am Einfachsten ist ein Wechsel in den Kontext des Benutzers &#039;&#039;&#039;root&#039;&#039;&#039;: &amp;quot;&amp;lt;code&amp;gt;sudo su -&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Erstellen eines Ordners, z.B. &amp;quot;&amp;lt;code&amp;gt;mkdir lwpsimple&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Wechsel in diesen Ordner &amp;quot;&amp;lt;code&amp;gt;cd lwpsimple&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Herunterladen der Datei von [http://search.cpan.org/~gaas/libwww-perl-6.04/ libwww-perl-6.04] oder direkter Link: [http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/libwww-perl-6.04.tar.gz libwww-perl-6.04.tar.gz]: z.B. &amp;quot;&amp;lt;code&amp;gt;wget http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/libwww-perl-6.04.tar.gz&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Entpacken der Datei: &amp;quot;&amp;lt;code&amp;gt;tar -xzvf libwww-perl-6.04.tar.gz&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Wechsel in das neu entstandene Verzeichnis: &amp;quot;&amp;lt;code&amp;gt;cd libwww-perl-6.04&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Nun kann es nach dem Standardvorgehen weitergehen:&lt;br /&gt;
**&amp;quot;&amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
**&amp;quot;&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
**&amp;quot;&amp;lt;code&amp;gt;make install&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Installation SOAP::Lite ===&lt;br /&gt;
Wenn sich dieses Paket nicht einfach per CPAN-Anweisung installieren läßt, dann hilft folgende Anleitung weiter. &lt;br /&gt;
Beim Abbruch der Installation mittels CPAN erscheint mittendrin ein Fehler, das die Datei nicht entpackt werden könne (couldn&#039;t untar). Da scheint es einen Fehler im Installationsskript zu geben.&lt;br /&gt;
&lt;br /&gt;
Man kann das aber auch Manuell installieren:&lt;br /&gt;
*Am Einfachsten ist ein Wechsel in den Kontext des Benutzers &#039;&#039;&#039;root&#039;&#039;&#039;: &amp;quot;&amp;lt;code&amp;gt;sudo su -&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Erstellen eines Ordners, z.B. &amp;quot;&amp;lt;code&amp;gt;mkdir soaplite&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Wechsel in diesen Ordner &amp;quot;&amp;lt;code&amp;gt;cd soaplite&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Herunterladen der Datei von [http://search.cpan.org/~mkutter/SOAP-Lite-0.715/ CPAN-SOAP-Lite-0.715] oder direkter Link: [http://mirror.informatik.uni-mannheim.de/pub/mirrors/CPAN/authors/id/M/MK/MKUTTER/SOAP-Lite-0.715.tar.gz SOAP-Lite-0.715.tar.gz]: z.B. &amp;quot;&amp;lt;code&amp;gt;wget http://mirror.informatik.uni-mannheim.de/pub/mirrors/CPAN/authors/id/M/MK/MKUTTER/SOAP-Lite-0.715.tar.gz&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Entpacken der Datei: &amp;quot;&amp;lt;code&amp;gt;tar -xzvf SOAP-Lite-0.715.tar.gz&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Wechsel in das neu entstandene Verzeichnis: &amp;quot;&amp;lt;code&amp;gt;cd SOAP-Lite-0.715&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Nun kann es nach der [http://www.soaplite.com/2003/06/installation_in.html Anleitung] weitergehen:&lt;br /&gt;
**&amp;quot;&amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
**Dann kommt eine Nachfrage, was zusammengebaut werden soll. An dieser Stelle ist es jetzt wie eine normale CPAN Installation. Einfach mit &amp;lt;Enter&amp;gt; weitermachen lassen.&lt;br /&gt;
**&amp;quot;&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
**&amp;quot;&amp;lt;code&amp;gt;make install&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung von Samba für Sprachausgabemöglichkeit ===&lt;br /&gt;
Wenn die Sprachausgabe verwendet werden soll, muss ein lokaler Samba-Daemon (Server für Windowsfreigaben) laufen oder eine für FHEM beschreibbare (Windows-)Freigabe woanders existieren, da Sonos nur auf eine solche lesend zugreifen kann.&lt;br /&gt;
&lt;br /&gt;
Diese Beschreibung soll anhand des Raspberry-Pi (und anderer Debian-Systeme) zeigen, wie man einen solchen lokalen Samba-Server schnell für diesen Zweck einrichten kann:&lt;br /&gt;
*Lokales Verzeichnis für die Ablage der Tondateien erzeugen. z.B.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mkdir /mnt/SonosSpeak&lt;br /&gt;
sudo chmod 777 /mnt/SonosSpeak/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Installation der notwendigen Pakete für Samba: &amp;lt;pre&amp;gt;sudo apt-get install samba samba-common-bin&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Starten des Editors zum Anpassen der Konfigurationsdatei: &amp;lt;pre&amp;gt;sudo nano /etc/samba/smb.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Ist die Datei Original von der Raspbian Installation, muss außer dem Eintrag für das Share nichts geändert werden! Folgende Zeilen am Ende der smb.conf hinzufügen (Pfade müssen natürlich u.U. angepasst werden): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[SonosSpeak]&lt;br /&gt;
  comment = Audio-Files for SonosPlayer to Speak&lt;br /&gt;
  read only = false&lt;br /&gt;
  path = /mnt/SonosSpeak&lt;br /&gt;
  guest ok = yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Falls der Zugriff nicht funktioniert, ist eventuell die smb.conf nicht im Originalzustand:&lt;br /&gt;
**Sicherstellen, dass in der &#039;&#039;Global&#039;&#039;-Sektion der Parameter &#039;&#039;Security&#039;&#039; nicht definiert wurde oder auf &#039;&#039;security = user&#039;&#039; steht und der Eintrag &#039;&#039;map to guest = bad user&#039;&#039; noch vorhanden ist.&lt;br /&gt;
{{Randnotiz|RNText=Hinweis: Siehe auch https://forum.fhem.de/index.php/topic,79335.msg719716.html#msg719716}}&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
  security = user&lt;br /&gt;
  map to guest = bad user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Samba-Server neustarten:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo systemctl restart smbd&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ältere Systeme &lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /etc/init.d/samba restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird eine Freigabe mit dem Namen &#039;&#039;&#039;SonosSpeak&#039;&#039;&#039; erzeugt, die von allen ohne Anmeldung gelesen und beschrieben werden kann.&lt;br /&gt;
&lt;br /&gt;
== Interner Aufbau ==&lt;br /&gt;
Um die Kommunikation mit dem UPnP-Netzwerk parallel zum normalen Betrieb von FHEM zu ermöglichen, werden [http://perldoc.perl.org/threads.html Threads] eingesetzt. Dadurch sind manche Hardwareplattformen leider überfordert und können u.U. nicht mit diesem Modul verwendet werden.&amp;lt;br /&amp;gt;Das läßt sich aus technologischen Gründen auch nicht umgehen.&lt;br /&gt;
&lt;br /&gt;
Dabei wird der SubThread verwendet um die Callback-Aufrufe, die erfolgen, wenn z.B. eine Statusänderung eines Players erfolgt, zu verarbeiten. Die Aktualisierung der Daten selbst wird dann über eine interne [http://perldoc.perl.org/Thread/Queue.html Queue] &amp;quot;nach oben&amp;quot; zum Hauptthread übertragen, und dann mittels einer bestehenden TCP-Verbindung zur Verarbeitung in FHEM übertragen.&amp;lt;br /&amp;gt; Dadurch wird gewährleistet, dass die Daten immer im Hauptthread (also dem &amp;quot;eigentlichen&amp;quot; FHEM-Thread) verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Da dieser SubThread auch die Kommandoübergabe an den Player übernimmt, gibt es auch eine Kommando-Queue in die andere Richtung, die dann mittels eines Thread-Signals im SubThread-Kontext ausgeführt wird. &lt;br /&gt;
&lt;br /&gt;
Dieser Aufbau sorgt natürlich dafür, dass man auf die üblichen Nebenläufigskeitsprobleme achten muss (in der Hauptsache sind das Dead-Locks, da man oftmals über drei Ecken aufeinander wartet, ohne das direkt zu sehen). Deswegen wird in allen Log-Ausgaben des Moduls ein Kürzel vorangestellt: &amp;quot;&amp;lt;code&amp;gt;SONOS_&amp;lt;/code&amp;gt;&amp;quot;, wobei der Unterstrich durch die Nummer des aktiven, loggenden, Threads ersetzt wird. Damit kann man sehr leicht feststellen, auf welcher &amp;quot;Ebene&amp;quot; diese Ausgabe erfolgt ist, und ob das alles so seine Richtigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Der Rest sind nur viele Zeilen, die XML-Strukturen (mittels regulärer Ausdrücke) parsen oder erzeugen, und die entsprechenden Informationen setzen oder abfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installation des Moduls selbst ==&lt;br /&gt;
Hier wird die Installation des eigentlichen Moduls beschrieben, sowie ein Changelog ausgegeben, damit man nachvollziehen kann, was am Modul so passiert ist. Dieser Changelog steht auch in der Datei 00_SONOS.pm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Installation mittels FHEM-Updatemechanismus ===&lt;br /&gt;
Dieses Modul wird seit Dezember 2014 zusammen mit FHEM ausgeliefert. Es sind keine weiteren Schritte zur Installation des Moduls selbst notwendig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Fehlersuche ===&lt;br /&gt;
Da das Modul noch in der Entwicklung steht, und natürlich sowieso immer wieder Probleme auftauchen können, hier ein paar Hinweise zur Fehlersuche:&lt;br /&gt;
Das Modul besteht zunächst aus zwei Ebenen:&lt;br /&gt;
*Eine Ebene, die innerhalb von FHEM selbst läuft&lt;br /&gt;
*Eine Ebene, die als eigenständiger Prozess läuft (entweder durch FHEM selbst oder manuell angestartet)&lt;br /&gt;
&lt;br /&gt;
Die Logausgaben der ersten Ebene landen direkt im FHEM-Log, die der zweiten Ebene können dort nicht reingeschrieben werden, und landen dementsprechend auf der Konsole (genauer: auf STDOUT).&lt;br /&gt;
Wenn man also die Log-Ausgaben dieses Sub-Prozesses sehen möchte, muss man im Startskript den STDOUT entsprechend umlenken, oder einen manuellen Start ausführen:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo perl fhem.pl fhem.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
Dazu muss man natürlich vorher in das entsprechende Verzeichnis wechseln.&lt;br /&gt;
&lt;br /&gt;
Die Menge der Logausgaben werden, wie in FHEM üblich, über das Attribut Verbose am Sonos-Device gesteuert (Bis auf wenige Zeilen beim Start des Sub-Prozesses, die nur mit dem globalen Verbose-Attribut gesteuert werden können, da noch keine Verbindung besteht).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis!&#039;&#039;&#039;: &amp;lt;br /&amp;gt;In neueren Versionen von FHEM wird die Konsolenlogausgabe in das normale FHEMlog umgeleitet, sodass man das nicht mehr umständlich selber umlenken und suchen muss.&lt;br /&gt;
&lt;br /&gt;
Im Normalfall sollte Anhand der Ausgabe erkennbar sein, was das jeweilige Problem ist. Bei Unklarheiten am Besten im Forum suchen/posten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Hinweise / Häufige Fehler / FAQ ====&lt;br /&gt;
Hier soll mal eine Liste mit häufigen Fehlern, Problemen und Hinweisen entstehen.&lt;br /&gt;
&lt;br /&gt;
*In neueren Versionen von FHEM werden die Konsolen-Logausgaben in das FHEMlog umgeleitet. Dadurch wird die Logdatei in der Standardeinstellung von (3) ziemlich voll. Wenn man das verhindern möchte, dann muss man das Attribut &#039;&#039;verbose&#039;&#039; am Sonos-Device auf einen Wert kleiner 3 setzen (z.B. 0).&lt;br /&gt;
*Das Modul wird im Normalfall stets an die aktuelle Sonos-Firmwareversion angepasst. Es empfiehlt sich also im Normalfall bei komischem Verhalten des Moduls, welches auf eine solche Inkompatibilität hindeutet, auf die neueste Sonos-Firmware upzudaten.&amp;lt;br /&amp;gt;Ein Beispiel ist hierfür die Verarbeitung der Alarme. Dort wurde bei einem Sonos-Update die Logik verändert, sodass das Modul nun eine Inkompatibilität mit der Vorgängerfirmwareversion hat.&lt;br /&gt;
*Allgemein läuft das Modul besser, wenn es im Benutzerkontext &#039;&#039;root&#039;&#039; läuft. Für diverse Funktionalitäten ist das sogar notwendig (z.B. Pingtype auf &#039;&#039;icmp&#039;&#039; konfiguriert).&lt;br /&gt;
**Um FHEM als &#039;&#039;root&#039;&#039; laufen lassen zu können, kann es notwendig sein, den Benutzer &#039;&#039;fhem&#039;&#039; in der Datei &#039;&#039;&#039;/etc/passwd&#039;&#039;&#039; auszumarkieren oder mittels &#039;&#039;&#039;deleteuser&#039;&#039;&#039; zu löschen. FHEM schaltet in den Benutzerkontext &#039;&#039;fhem&#039;&#039; um, wenn es diesen Benutzer beim Start findet.&lt;br /&gt;
*Wenn man das Problem hat, dass Befehle an den falschen Player gesendet werden, sollte man das Reading &#039;&#039;&#039;ZoneGroupID&#039;&#039;&#039; prüfen. Bei ungruppierten Playern sollte es die eigene UDN enthalten, bei gruppierten Playern die UDN des Gruppenmaster.&amp;lt;br /&amp;gt;Sollte das mal nicht der Fall sein, so kann es sein, dass im Sonos-System eine Falschinformation vorliegt. Da es jetzt nicht so einfach ist, die bei Sonos dazu zu bewegen, diesen Fehler zu beseitigen, gibt es u.U. eine Workaround-Möglichkeit mit dem Modul.&amp;lt;br /&amp;gt;Wenn wir z.B. zwei Player haben: &#039;&#039;Sonos_Bad&#039;&#039; und &#039;&#039;Sonos_Kueche&#039;&#039;, und dort die Steuerung nicht korrekt funktioniert, dann einmal die folgenden Schritte versuchen (bei mehr oder anderen Playern natürlich analog dazu).&amp;lt;br /&amp;gt;Dadurch werden die Gruppen gebildet, und nochmal explizit aufgelöst.&lt;br /&gt;
**&amp;lt;code&amp;gt;set Sonos Groups [Sonos_Bad, Sonos_Kueche]&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;set Sonos Groups [Sonos_Kueche, Sonos_Bad]&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;set Sonos Groups [Sonos_Bad], [Sonos_Kueche]&amp;lt;/code&amp;gt;&lt;br /&gt;
*Es ist wichtig, dass erst das &#039;&#039;&#039;Sonos&#039;&#039;&#039;-Device definiert wird, und dann erst die entsprechenden &#039;&#039;&#039;Sonosplayer&#039;&#039;&#039;-Devices dazu. Sonst kann es u.U. zu einer Verdoppelung des SubProzesses kommen.&lt;br /&gt;
*Manchmal bleiben &#039;Reste&#039; beim Beenden von FHEM. Dann kann es sinnvoll sein, erst alle Perl-Prozesse zu beenden. Diese kann man mit &amp;lt;pre&amp;gt;sudo ps -aux | grep perl&amp;lt;/pre&amp;gt; finden, und dann einzeln mittels &amp;lt;pre&amp;gt;sudo kill ID&amp;lt;/pre&amp;gt; beenden (die ID steht in der ersten Spalte des Ergebnisses des vorherigen Befehls).&lt;br /&gt;
&lt;br /&gt;
Einträge, die mittlerweile behoben wurden:&lt;br /&gt;
*&#039;&#039;&#039;Fehler&#039;&#039;&#039;-Ausgaben beim FHEM-Start: Einige Readings dürfen bei einem Neustart von FHEM nicht bereits vorbelegt sein, da der entsprechende Zoneplayer mittlerweile andere Informationen haben könnte, bzw. einige Events sonst nicht erzeugt werden. Aus diesem Grund werden diese beim Start auch nicht geladen.&amp;lt;br /&amp;gt;Folgende Meldung erscheint z.B.:&amp;lt;code&amp;gt;Reading Sonos_Wohnzimmer-&amp;gt;AlarmListVersion must not be used out of statefile.&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Diese Meldungen kann man getrost ignorieren, da sie nicht auf einen Fehler hindeuten, sondern nur klarstellen, dass diese Readings eben nicht aus dem Statefile verwendet werden dürfen (was durch Ausgabe dieser Meldung auch nicht passiert).&lt;br /&gt;
**Das konnte mittlerweile durch ein Setzen eines &amp;quot;Lademarkers&amp;quot; verhindert werden. Dadurch wird das Laden des Readings nicht mehr unterbunden, sondern auf einen sicher ungültigen Wert gesetzt. Damit funktionieren die folgenden Readings-Update Aufrufe wieder.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Changelog ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:10%&amp;quot; | Datum !! style=&amp;quot;width:8%&amp;quot; | Version !! style=&amp;quot;width:82%&amp;quot; | Änderungen&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;vertical-align:top&amp;quot; | SVN-History&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 25.04.2018&lt;br /&gt;
| &lt;br /&gt;
*&amp;quot;Deep Recursion&amp;quot;-Warnung beim loggen wird nun verhindert&lt;br /&gt;
*Beim Erzeugen der Gruppen-ReadingsGroup ist bei der Verwendung eines Boosts ab und zu ein Fehler aufgetreten&lt;br /&gt;
*Beim Erzeugen eines ControlPoint-Objekts kann man nun das Envelope-Prefix angeben (nicht für das Sonos-Modul relevant)&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 15.04.2018&lt;br /&gt;
| &lt;br /&gt;
*Streams über Alexa (z.B. Sonos One) werden nun korrekt als Radiostreams dargestellt&lt;br /&gt;
*Es werden nun auch Updateinformationen und die interne Softwareversionsnummer gesucht und als Reading gesetzt: &amp;quot;softwareRevisionAvailable&amp;quot;, &amp;quot;softwareRevisionInternal&amp;quot; und &amp;quot;softwareRevisionInternalAvailable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 24.03.2018&lt;br /&gt;
| &lt;br /&gt;
*Einige Log-Ausgaben haben bei undefinierten Default-Übergaben Fehlermeldungen verursacht.&lt;br /&gt;
*Bei einigen Positionsabfragen an die Player wurden Sonderfälle (wie NOT_IMPLEMENTED) nicht berücksichtigt.&lt;br /&gt;
*Slider-Wertebereich für Bass und Treble auf den Bereich -10..10 korrigiert.&lt;br /&gt;
*Es gibt jetzt ein Reading &amp;quot;IsZoneGroup&amp;quot;, das 0 oder 1 sein kann. Danach wird jetzt auch entschieden, ob eine Playersteuerung dargestellt wird, oder nicht.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 10.03.2018&lt;br /&gt;
| &lt;br /&gt;
*Die PlayBase kann nun auch den SPDIF-Eingang aktivieren (wie die PlayBar)&lt;br /&gt;
*Wenn man über Alexa Musik hört, wird das aktuelle Cover nun auch angezeigt.&lt;br /&gt;
*Wenn ein Player nach einem Neustart disabled war, und während des Betriebs enabled wird, wird nun versucht ihn wiederzufinden.&lt;br /&gt;
*Wenn ein Player disabled oder disappeared ist, wird ein Proxy-Cover-Zugriffsversuch auf diesen Player unterbunden.&lt;br /&gt;
*Ein Modify-Befehlsaufruf wird nun am Vorhandensein von $hash-&amp;gt;{OLDDEF} erkannt.&lt;br /&gt;
*Bei einigen PERL-Installationen stand im Reading &#039;currentTrackPositionSimulatedSec&#039; eine Kommazahl (da sie von time() aus berechnet wird). Diese Zahl wird nun gerundet.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 26.02.2018&lt;br /&gt;
| &lt;br /&gt;
*ComObjectTransportQueue in Client_ReceiveQueue umbenannt.&lt;br /&gt;
*If-Abfrage um die can_read-Schleife im SubProzess eingebaut, Um Signalunterbrechungen zu berücksichtigen.&lt;br /&gt;
*Neuer Getter &amp;quot;WifiPortStatus&amp;quot;. Liefert Active, wenn das WLAN aktiviert ist, sonst Inactive.&lt;br /&gt;
*Drei neue (automatisch ermittelte) Readings &amp;quot;Orientation&amp;quot;, &amp;quot;WifiEnabled&amp;quot; und &amp;quot;WirelessMode&amp;quot;.&lt;br /&gt;
*Warnung mit &amp;quot;unescaped left brace&amp;quot; in Tag.pm wurde korrigiert.&lt;br /&gt;
*ExportSonosBibliothek wird nun in einem eigenen Thread (LongJobs-Thread) ausgeführt. Dadurch bleibt das System steuerbar, auch wenn gerade ein langwieriger Export läuft.&lt;br /&gt;
*Prüfmethode eingebaut, um verlorengegangene Fhem-Prozessverbindungen (aus Sicht des SubProzesses) zu erkennen, und entsprechende Thread-Bereinigungmaßnahmen durchführen zu können.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 07.01.2018&lt;br /&gt;
| &lt;br /&gt;
*Der Initialwert von LastProcessAnswer (wird beim Start auf 0 gesetzt) wird nun korrekt berücksichtigt&lt;br /&gt;
*Bei ignoredIPs und bei usedOnlyIPs kann jetzt für jedes Komma-Getrennte Element auch ein regulärer Ausdruck stehen. Wird mit // umschlossen, und darf keine Doppelpunkte enthalten.&lt;br /&gt;
*Logausgabe im UPnP-Modul, welche Devices mit welchen Header-Angaben nun akzeptiert wurden (Ausgabe auf Level 5)&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 23.12.2017&lt;br /&gt;
| &lt;br /&gt;
*Subscriptions-Refresh umgebaut.&lt;br /&gt;
*Devicenamen mit Punkt (.) funktionieren nun.&lt;br /&gt;
*Fehler mit &amp;quot;undefined value $value&amp;quot; behoben.&lt;br /&gt;
*GetTrackProvider liefert bei Nichtfinden in der MusicServicesList nun eine leere Angabe, und keine undefined.&lt;br /&gt;
*Die Angabe in LastProcessAnswer ist nicht Zeitumstellungsfest. Der Wert wurde nun umgestellt auf epoch-Zeit.&lt;br /&gt;
*Der Verweis auf %intAt wurde entfernt. Die Variable wurde sowieso nie verwendet.&lt;br /&gt;
*Warnungsunterdrückung von &#039;mumpitzstuff&#039; eingebaut.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 28.09.2017&lt;br /&gt;
| &lt;br /&gt;
*Provider-Icons werden wieder korrekt ermittelt&lt;br /&gt;
*Das Verarbeiten der Arbeitsschlange im SubProcess wurde optimiert&lt;br /&gt;
*Die Fehlermeldung mit den redundanten Argumenten bei sprintf wurde umgestellt.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 14.07.2017&lt;br /&gt;
| &lt;br /&gt;
*Änderung in der ControlPoint.pm: Es wurden zuviele Suchantworten berücksichtigt.&lt;br /&gt;
*Bei einem Modify wird von Fhem nur die DefFn aufgerufen (und nicht vorher UndefFn). Dadurch blieben Reste, die aber vor einer Definition aufgeräumt werden müssen. Resultat war eine 100%-CPU-Last.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 09.07.2017&lt;br /&gt;
| &lt;br /&gt;
*BulkUpdate: Beginn und Ende sind nun sicher davor einen vom SubProzess gestarteten BulkUpdate vorzeitig zu beenden.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 05.07.2017&lt;br /&gt;
| &lt;br /&gt;
*Neue Variante für das Ermitteln der laufenden Favoriten, Radios oder Playlists&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 05.07.2017&lt;br /&gt;
| &lt;br /&gt;
*Veralteten Mechanismus für das Unterbrechen der Sendeschleife aufgeräumt.&lt;br /&gt;
*SONOS_ConvertNumToWord kann nun mit undef-Übergaben umgehen.&lt;br /&gt;
*Andere Methodik zum Ermitteln von FavouriteName, RadioName und PlaylistName eingebaut.&lt;br /&gt;
*Es gibt ein neues Attribut &amp;quot;SubProcessLogfileName&amp;quot;. Damit kann die Logausgabe des SubProzesses in eine eigene Datei umgeleitet werden. Unter Windows z.B. gibt es sonst keine saubere Darstellungsmöglichkeit für die Logausgabe, da die beiden Prozesse sich gegenseitig die Ausgaben im Fhem-Log überschreiben. Bei Angabe von &#039;-&#039; wird wie bisher auf STDOUT (und damit im Fhem-Log) geloggt.&lt;br /&gt;
*Kleinere Fehler bei einzelnen Reading-Aktualisierungen behoben.&lt;br /&gt;
*Beim Zerlegen der MusicServicesList gab es einen Fehler, der z.B. dafür gesorgt hatte, dass Apple Music nicht erkannt wurde.&lt;br /&gt;
*Umbau der Verarbeitungslogik in Richtung SubProzess. Das sollte nun schneller und sicher sequentiell verarbeitet werden.&lt;br /&gt;
*Die Aktualisierung des Readings &amp;quot;LastProcessAnswer&amp;quot; wird jetzt während eines laufenden Bulkupdates auch als solches durchgeführt, und zerstört damit nicht mehr dieses laufende Update.&lt;br /&gt;
*Alle noch vorhandenen ReadingsSingleUpdate-Aufrufe wurden BulkUpdate-Sicher gemacht.&lt;br /&gt;
*Die prozentuale Fortschrittsanzeige hat bei Streams negative, hohe Werte angezeigt. Steht jetzt wieder auf 0.&lt;br /&gt;
*Beim Löschen blieb noch die automatisch angelegte ReadingsGroup für die aktuelle Abspielliste bestehen.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 21.06.2017&lt;br /&gt;
| &lt;br /&gt;
*Bei der ersten Verbindung war das Reading für die letzte SubProzess-Antwort eventuell bereits veraltet. Das wird nun durch ein Datum in der Zukunft verhindert.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 20.06.2017&lt;br /&gt;
| &lt;br /&gt;
*Die Verarbeitung des Notify-Events für die Anzeigeaktualisierung ist in das SONOSPLAYER-Modul umgezogen (wo es auch logisch hingehört).&lt;br /&gt;
*Die Zeitkonvertierung hatte einen Sekundenfehler.&lt;br /&gt;
*Durch eine fehlerhafte IF-Verschachtelung in der ControlPoint.pm gab es komische Log-Augaben.&lt;br /&gt;
*Die lokalen Cover werden nur noch heruntergeladen, wenn das Attribut &amp;quot;getLocalCoverArt&amp;quot; am Sonos-Device gesetzt ist. Normalerweise merkt man davon nichts, da die eingebauten Coveranzeigen diese nicht verwenden. Wenn man diese heruntergeladenen Cover selbst noch verwendet werden, dann muss dieses Attribut gesetzt werden!&lt;br /&gt;
*Das Problem mit den Wide-Character bei der Hashwert-Berechnung von ProxyCache und SpeakBuffer wird abgefangen, und ein Versuch mit einem dazwischenliegenden Konverter durchgeführt.&lt;br /&gt;
*Das Subscribing für Rendering-Events wird in einem Eval durchgeführt, sodass eine abgefangene Fehlermeldung bei nicht-Erfolg ausgegeben wird. Das passiert z.B. bei einem Sub- oder Surroundlautsprecher.&lt;br /&gt;
*Die Simulation der aktuellen TrackPosition lief weiter, wenn der Player vor einem disappeared nicht gestoppt wurde.&lt;br /&gt;
*Bei der Verarbeitung eines Befehls im SubProzess wurde in einigen Fällen die Befehlsqueue nicht korrekt verringert, was zu Folgefehlern führte.&lt;br /&gt;
*Wenn der RestoreThread einen ungültigen Datensatz in der RestoreQueue vorfindet, überspringt er ihn...&lt;br /&gt;
*Bessere Behandlung der TrackProviderermittlung&lt;br /&gt;
*Bei MakeCoverURL gab es Logausgaben mit dem falschen Level.&lt;br /&gt;
*Es gibt vier neue Attribute am Sonosdevice: &amp;quot;getFavouritesListAtNewVersion&amp;quot;, &amp;quot;getPlaylistsListAtNewVersion&amp;quot;, &amp;quot;getRadiosListAtNewVersion&amp;quot; und &amp;quot;getQueueListAtNewVersion&amp;quot;. In Zusammenarbeit mit &amp;quot;getListsDirectlyToReadings&amp;quot; wird dann bei Änderung der entsprechenden Liste automatisch das entsprechende Reading aller Sonosplayer-Devices aktualisiert. Hierbei entfallen dann etwaige eigene Notifies, die eine Aktualisierung der Readings veranlassen. Diese sollten dann natürlich auch entfernt werden.&lt;br /&gt;
*Die Überprüfung, ob der SubProzess noch lebt, wird nun über die bereits bestehende Verbindung abgewickelt. Dadurch entfallen die ständigen Verbindungsversuche zum SubProzess. Dazu wird ein Reading &#039;LastProcessAnswer&#039; am zentralen Sonos-Device geführt.&lt;br /&gt;
*Bei Verlust der Verbindung zum SubProzess wird nun keine 100% Systemlast mehr verursacht.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 14.05.2017&lt;br /&gt;
| &lt;br /&gt;
*FHEMWEB-Anzeige der Player auf die neu möglichen, nicht quadratischen, Radiocover angepasst.&lt;br /&gt;
*In der Datei ControlPoint.pm wurde beim Öffnen des SSDP-Ports das Attribut ReusePort hinzugefügt (sofern das Betriebssystem das unterstützt).&lt;br /&gt;
*Es gibt ein neues Reading &amp;quot;currentEnqueuedTransportHandle&amp;quot;, welches zur Weitergabe der aktuellen Quelle des aktuellen Titels verwendet werden kann.&lt;br /&gt;
*Es gibt zwei neue Readings &amp;quot;currentTrackHandle&amp;quot; und &amp;quot;nextTrackHandle&amp;quot;, welche zur Weitergabe der aktuellen bzw. nächsten Wiedergabe geeignet sind.&lt;br /&gt;
*Es gibt ein neues Reading &amp;quot;currentSource&amp;quot;, welches (wenn beliefert) den Namen der Quelle des Titels angibt. Bei Spotify z.B. die gewählte Playliste oder das Album, oder die gewählte Sonos-Playliste.&lt;br /&gt;
*Die Trackprovider werden jetzt über die verfügbaren, von Sonos bereitgestellten, MusicServices ermittelt.&lt;br /&gt;
*(Fehlende) Radiocover werden nun über den offiziellen Webservice von Sonos ermittelt, und werden wieder geladen.&lt;br /&gt;
*Etwaige, immer noch, fehlende Radiocover werden als Fallback wie bisher geladen. Das sollte aber nicht mehr vorkommen.&lt;br /&gt;
*Spotify-Playlisten-Cover werden wieder geladen.&lt;br /&gt;
*Teilweise wurden Bibliothekscover nicht geladen, das sollte wieder gehen.&lt;br /&gt;
*Die Verbindungsprüfung zwischen Fhem-Modul und SubProzess erfolgt nur noch, wenn nicht sowieso schon Daten übertragen werden, und sollte dementsprechend nicht mehr dazwischenfunken.&lt;br /&gt;
*Die Verbindungsprüfung und der grundsätzliche Verbindungsaufbau zum SubProzess wurden umgestellt.&lt;br /&gt;
*Fehlermeldungen bei Fhem-Player-Such-Prozeduren verbessert.&lt;br /&gt;
*Es gibt zwei (bzw. vier) neue Readings &amp;quot;TrackProviderIconRoundURL&amp;quot; und &amp;quot;TrackProviderIconQuadraticURL&amp;quot; (jeweils für &amp;quot;current&amp;quot; und für &amp;quot;next&amp;quot;). Mit diesen lassen sich die entsprechenden Provider-Icons anzeigen.&lt;br /&gt;
*Die Titelanzeige in FhemWeb enthält nun auch die neuen Provider-Icons.&lt;br /&gt;
*Detaildarstellung der SonosPlayer-Devices enthält jetzt auch die Coverdarstellung.&lt;br /&gt;
*Bug in &amp;quot;SONOS_GetTimeFromString&amp;quot; behoben.&lt;br /&gt;
*Es gibt zwei neue Attribute &amp;quot;simulateCurrentTrackPosition&amp;quot; und &amp;quot;simulateCurrentTrackPositionPercentFormat&amp;quot;. Mit diesen kann man eine Simulation des Fortschritts von currentTrackPosition im gewählten Intervall aktivieren. Dabei werden die Readings &amp;quot;currentTrackPositionSimulated&amp;quot;, &amp;quot;currentTrackPositionSimulatedSec&amp;quot; und &amp;quot;currentTrackPositionSimulatedPercent&amp;quot; (nur bei gelieferter &amp;quot;currentTrackDuration&amp;quot;) aktualisiert.&lt;br /&gt;
*Es gibt zwei neue Readings &amp;quot;currentTrackDurationSec&amp;quot; und &amp;quot;nextTrackDurationSec&amp;quot;, welche die jeweilige Tracklänge in Sekunden angeben.&lt;br /&gt;
*Durch ein mittlerweile verändertes Notify-Event-Handling in Fhem wurden die Bookmarks nicht immer zusammen mit dem globalen Save-Befehl gespeichert.&lt;br /&gt;
*Die Cover-/Titelanzeige wird nun intern vom Modul durchgeführt. Deshalb ist keine zusätzliche ReadingsGroup für die Anzeige und Aktualisierung mehr notwendig. In der Raumansicht kann man das Verhalten für alle Sonosplayer einheitlich mit dem Attribut &amp;quot;deviceRoomView&amp;quot; beeinflussen. Es kann die Zustände &amp;quot;Both&amp;quot; und &amp;quot;DeviceLineOnly&amp;quot; annehmen.&lt;br /&gt;
*Die Steuermöglichkeiten werden nun intern vom Modul dargestellt. Dazu muss die Cover-/Titelanzeige aktiviert sein. Will man die Steuerung ausblenden, kann man das Attribut &amp;quot;suppressControlButtons&amp;quot; für Sonosplayer einzeln setzen setzen.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 09.04.2017&lt;br /&gt;
| &lt;br /&gt;
*Beim Maskieren der Anzeigelisten für Playlisten, Radios oder Favoriten werden Klammern und andere Sonderzeichen für reguläre Ausdrücke nun auch in Punkte umgewandelt, da diese sonst den regulären Such-Ausdruck stören.&lt;br /&gt;
*Beim Starten/Laden von Playlisten, Radios oder Favoriten werden, vor der eigentlichen Suche im Sonossystem, einfache Anführungszeichen (&#039;) in die HTML-Schreibweise (&amp;amp;apos;) übersetzt, da diese so auch von Sonos verwendet werden.&lt;br /&gt;
*Radiocover werden nun in höherer Auflösung von einer TuneIn-API-Schnittstelle geladen (von dort wo auch der Controller selbst die Cover lädt).&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 04.04.2017&lt;br /&gt;
| &lt;br /&gt;
*Es gibt zwei neue Readings &amp;quot;AvailablePlayerList&amp;quot; und &amp;quot;AvailablePlayerListAlias&amp;quot; am Sonosplayer-Device, wenn das Attribut &amp;quot;getListsDirectlyToReadings&amp;quot; am Sonos-Device gesetzt wurde. Diese Reading geben die anderen noch verfügbaren, nicht gebundenen, Player an. Das ist die Grundlage für eine Player-zur-Abspielgruppe-hinzufügen-Funktion als Listendarstellung.&lt;br /&gt;
*Es gibt zwei neue Readings &amp;quot;AllPlayerNotBonded&amp;quot; und &amp;quot;AllPlayerNotBondedCount&amp;quot; am Sonos-Device, welche alle Masterplayer angibt, die nicht gebunden sind.&lt;br /&gt;
*Es gibt ein neues Reading &amp;quot;IsBonded&amp;quot; am Sonosplayer-Device, welches angibt, ob der Player in einer Bindung zum Masterplayer steht (anstatt ein einfaches Gruppenmitglied zu sein). Gebundene Player sind z.B. der rechte Player im Stereoverbund, sowie die Satellitenplayer in einem 5.1er Surroundsystem (also Subwoofer, hintere Lautsprecher und vordere Lautsprecher).&lt;br /&gt;
*Es gibt drei neue Readings &amp;quot;SlavePlayerNotBonded&amp;quot;, &amp;quot;SlavePlayerNotBondedList&amp;quot; und &amp;quot;SlavePlayerNotBondedListAlias&amp;quot; am Sonosplayer-Device, wobei die beiden letzteren nur erzeugt werden, wenn das Attribut &amp;quot;getListsDirectlyToReadings&amp;quot; am Sonos-Device gesetzt wurde.&lt;br /&gt;
*Es gibt jetzt ein Attribut &amp;quot;getTitleInfoFromMaster&amp;quot; am Sonosplayer-Device, mit welchem man ein Slave-Device (auch gebundene) dazu bringen kann, die wichtigsten Abspielreadings automatisch vom Master zu duplizieren.&lt;br /&gt;
*Die Oberflächenauswahl für &amp;quot;AddMember&amp;quot;, &amp;quot;RemoveMember&amp;quot; und &amp;quot;CreateStereoPair&amp;quot; wurde auf die nicht bereits gebundenen Player bzw. die Teilnehmer deer Gruppe beschränkt.&lt;br /&gt;
*Es gibt zwei neue Readings &amp;quot;AllPlayer&amp;quot; und &amp;quot;AllPlayerCount&amp;quot; am Sonos-Device. Damit erhält man eine komplette Liste aller Player (und deren Anzahl), egal wie sie gerade verwendet werden.&lt;br /&gt;
*Die mitgelieferte Prozedur für die ReadingsGroup-Anzeigen wurde für das neue Reading &amp;quot;Queue&amp;quot; erweitert, außerdem wurde ein Darstellungsproblem der Gruppierungsanzeige mit aktuellen Versionen von FHEMWEB behoben&lt;br /&gt;
*Es gibt zwei neue Readings &amp;quot;ButtonState&amp;quot; und &amp;quot;ButtonLockState&amp;quot;, sowie einen Setter für &amp;quot;ButtonLockState&amp;quot;.&lt;br /&gt;
*Es gibt ein neues Reading &amp;quot;LineInPlayer&amp;quot; am Sonos-Device, und wenn das Attribut &amp;quot;getListsDirectlyToReadings&amp;quot; gesetzt ist, auch &amp;quot;LineInPlayerList&amp;quot; und &amp;quot;LineInPlayerListAlias&amp;quot;. Diese Liste enthält die gültigen LineIn-Eingänge aller Player, die für die Wiedergabe ausgewählt werden können.&lt;br /&gt;
*Es gibt zwei neue Attribute &amp;quot;stopSleeptimerInAction&amp;quot; und &amp;quot;saveSleeptimerInAction&amp;quot; am Sonosplayer-Device. Mit &amp;quot;stopSleeptimerInAction&amp;quot; wird das Modul dazu angehalten, bei einem Wechsel des TransportState auf &amp;quot;STOPPED&amp;quot; oder &amp;quot;PAUSED_PLAYBACK&amp;quot; einen etwaig aktivierten SleepTimer zu deaktivieren. Mit dem Attribut &amp;quot;saveSleeptimerInAction&amp;quot; kann man dieses Verhalten (z.B. temporär) wieder unterdrücken.&lt;br /&gt;
*Es gibt jetzt ein Reading &amp;quot;ZoneGroupNameDetails&amp;quot; am Sonosplayer-Device, welches die Slavezonen als textuelle Auflistung mittels &#039;+&#039; enthält. Ist leer, wenn es keine Slaveplayer gibt. Enthält den Namen des Gruppenmasters, wenn es einen solchen gibt.&lt;br /&gt;
*Interne Aufräumarbeiten: Mittlerweile überflüssige Codeteile wurden entfernt, und einige Single-Readingsupdates zu einem Bulk-Readingsupdate zusammengefasst.&lt;br /&gt;
*Die Readings &amp;quot;currentFavouriteNameMasked&amp;quot;, &amp;quot;currentPlaylistNameMasked&amp;quot; und &amp;quot;currentRadioNameMasked&amp;quot; werden automatisch gesetzt, wenn das Attribut &amp;quot;getListsDirectlyToReadings&amp;quot; gesetzt ist.&lt;br /&gt;
*Tippfehler bei den Readings &amp;quot;RadioList&amp;quot; und &amp;quot;RadioListAlias&amp;quot; korrigiert. Korrekt ist nun &amp;quot;RadiosList&amp;quot; und &amp;quot;RadiosListAlias&amp;quot; (also Mehrzahl bei Radios).&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 19.03.2017&lt;br /&gt;
| &lt;br /&gt;
*Es gibt ein neues Attribut &amp;quot;getListsDirectlyToReadings&amp;quot;, mit welchem die UserReadings bzgl. Favourites, Playlists und Radios (sowie currentTrackPosition) obsolet werden, da sie dann direkt in die passenden Readings geschrieben werden. Wenn man selber beeinflussen möchte, auf welche Weise und mit welchem Namen diese Readings gefüllt werden, dann darf dieses Attribut nicht gesetzt werden (es bleibt dann das bisherige Verhalten)&lt;br /&gt;
*Es gibt zwei neue Getter &amp;quot;Queue&amp;quot; und &amp;quot;QueueWithCovers&amp;quot;, welche die aktuelle Abspielliste liefern. Diese können wieder mit UserReadings oder dem neuen Attribut &amp;quot;getListsDirectlyToReadings&amp;quot; in entsprechende Readings übertragen werden. Hierbei werden auch zwei neue Readings &amp;quot;QueueDuration&amp;quot; und &amp;quot;QueueDurationSec&amp;quot; gefüllt, die die gesamte Abspieldauer der Abspielliste enthalten.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 13.03.2017&lt;br /&gt;
| &lt;br /&gt;
*Saubere Fehlerbehandlung bei der Verarbeitung von currentFavouriteName, currentPlaylistName und currentRadioName.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 12.03.2017&lt;br /&gt;
| &lt;br /&gt;
*NotifyFn und NotifyDev werden nun im Define des Moduls festgelegt (anstatt wie vorher im Initialize). Dadurch sollten deutlich weniger Notify-Anfragen beim Modul ankommen.&lt;br /&gt;
*Es gibt nun einen Set-Befehl &amp;quot;RefreshShareIndex&amp;quot; zum Aktualisieren der Bibliothek und ein Reading &amp;quot;ShareIndexInProgress&amp;quot;, welches angibt, ob eine Aktualisierung gerade in Ausführung ist.&lt;br /&gt;
*Die Fehlermeldung beim Verbinden zum Device wurde um die Zieladresse erweitert.&lt;br /&gt;
*Es gibt drei neue Readings, die sich auf Spotify-Direct-Play beziehen: DirectControlClientID, DirectControlIsSuspended und DirectControlAccountID&lt;br /&gt;
*Man kann beim Setzen der Titelposition nun auch relative Angaben machen, also z.B. &#039;+0:00:15&#039; oder auch &#039;+10%&#039;. Geht natürlich auch mit &#039;-&#039;.&lt;br /&gt;
*Man kann beim Setzen der Titelposition nun auch eine ganze Zahl als Sekundenangabe  machen. Dabei gehen auch Relativangaben&lt;br /&gt;
*Beim Cover-Download wird nun ein Standard_Timeout von 5s verwendet, sodass ein fehlender Player keine Blockade mehr verursachen sollte. Dafür gibt es auch ein neues Attribut &#039;coverLoadTimeout&#039;, womit dieser Wert eingestellt werden kann. Das ganze geht nur für Nicht-Windows-Systeme, da der Timeout über einen Alarm realisiert wird.&lt;br /&gt;
*Wenn während eines Subscriptions-Renews ein Timeout-Fehler auftreten sollte, wird nun der Discovery-Prozess neu angestartet, um sicherzustellen, daß der Player wieder gefunden und neu initialisiert wird.&lt;br /&gt;
*In der ControlPoint.pm wurde eine Sicherheitsabfrage eingebaut, wenn total verstümmelte Pakete beim SSDP-Recover ankommen.&lt;br /&gt;
*Es gibt ein neues Reading &amp;quot;currentEnqueuedTransportURI&amp;quot;, welches den TransportURI des hinzugefügten Paketes enthält, aus welchem der Titel gerade abgespielt wird (z.B. der Identifier der Spotify-Playliste)&lt;br /&gt;
*Es gibt ein neues Reading &amp;quot;currentFavouriteName&amp;quot;, welches versucht den &amp;quot;currentEnqueuedTransportURI&amp;quot; in den Favoriten zu finden, und enthält dann den gefundenen Favoritennamen. Dazu müssen die Favoriten einmal mittels &amp;quot;get FavouritesWithCover&amp;quot; ermittelt worden sein, und im Reading &amp;quot;Favourites&amp;quot; bereitstehen.&lt;br /&gt;
*Es gibt ein neues Reading &amp;quot;currentPlaylistName&amp;quot;, welches versucht den &amp;quot;currentEnqueuedTransportURI&amp;quot; in den Playlisten zu finden, und enthält dann den gefundenen Playlistnamen. Dazu müssen die Playlisten einmal mittels &amp;quot;get PlaylistsWithCover&amp;quot; ermittelt worden sein, und im Reading &amp;quot;Playlists&amp;quot; bereitstehen.&lt;br /&gt;
*Es gibt ein neues Reading &amp;quot;currentRadioName&amp;quot;, welches versucht den &amp;quot;currentEnqueuedTransportURI&amp;quot; in den Radios zu finden, und enthält dann den gefundenen Radionamen. Dazu müssen die Radios einmal mittels &amp;quot;get RadiosWithCover&amp;quot; ermittelt worden sein, und im Reading &amp;quot;Radios&amp;quot; bereitstehen.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 19.03.2016&lt;br /&gt;
| &lt;br /&gt;
*Bei der Alarmbearbeitung kann man nun mehrere Alarm-IDs mit Komma getrennt angeben, und das Schlüsselwort &amp;quot;All&amp;quot; verwenden, um alle Alarme dieses Players anzusprechen.&lt;br /&gt;
*Man kann bei der Alarmbearbeitung nun auch zwei neue, direkte und kürzere, Befehle für Standardaufgaben verwenden: &amp;quot;Enable&amp;quot;, &amp;quot;Disable&amp;quot;.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 06.02.2016&lt;br /&gt;
| &lt;br /&gt;
*Zusätzlich zu &amp;quot;Mute&amp;quot; (mit Parameter) am Sonos-Device gibt es jetzt auch &amp;quot;MuteOn&amp;quot; und &amp;quot;MuteOff&amp;quot; (jeweils ohne Parameter) zur Verwendung als WebCmd.&lt;br /&gt;
*Es gibt ein neues Reading &amp;quot;IsMaster&amp;quot; am Sonosplayer-Device, welches angibt, ob der Player gerade ein Masterplayer ist&lt;br /&gt;
*Es gibt ein neues Reading &amp;quot;MasterPlayer&amp;quot; am Sonosplayer-Device, welches angibt, wie der aktuelle MasterPlayer zu diesem Player heißt. Ist der Player selber der Master (also IsMaster = 1), so steht dort der eigene Name drin.&lt;br /&gt;
*Es gibt ein neues Reading &amp;quot;SlavePlayer&amp;quot; am Sonosplayer-Device, welches angibt, welche Slaveplayer zu diesem Player zugeordnet sind. Enthält nur Playerdevicenamen, wenn dieser Player ein Masterplayer ist, und dann auch nicht sich selber.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 31.01.2016&lt;br /&gt;
| &lt;br /&gt;
*Im Modul ControlPoint.pm gab es eine fehlerhafte Bearbeitung des Arrays @LWP::Protocol::http::EXTRA_SOCK_OPTS, welche in manchen Fällen zu der Fehlermeldung &amp;quot;Odd number of elements in hash assignment&amp;quot; geführt hat.&lt;br /&gt;
*Der Anbieter SoundCloud wird als Quelle erkannt und angezeigt&lt;br /&gt;
*Es gibt drei neue Readings &amp;quot;MasterPlayer&amp;quot;, &amp;quot;MasterPlayerPlaying&amp;quot; und &amp;quot;MasterPlayerNotPlaying&amp;quot; am Sonos-Device (zzgl. der jeweiligen Angabe der Anzahl)&lt;br /&gt;
*Die Ausgabe von &amp;quot;get Sonos Groups&amp;quot; liefert nun stets eine normalisierte Liste (also sortiert).&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 31.12.2015 &lt;br /&gt;
| &lt;br /&gt;
*Das Reading ZoneGroupID wurde immer länger (mit &amp;quot;:__&amp;quot;), wenn Gruppierungen anderer Player verändert wurden.&lt;br /&gt;
*Bei den Settern von &amp;quot;SleepTimer&amp;quot; und &amp;quot;SnoozeAlarm&amp;quot; kann man jetzt auch eine Zahl als Dauer in Sekunden angeben. Dazu wurde auch die Doku entsprechend angepasst.&lt;br /&gt;
*In der ControlPoint.pm wurde eine Fehlermeldung korrigiert&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 24.12.2015 &lt;br /&gt;
| &lt;br /&gt;
*Wenn ein Player ein &amp;quot;ß&amp;quot; (oder auch andere besondere Zeichen, wie Smilies o.ä.) im Namen hatte, funktionierte die Erkennung nicht mehr, und der SubThread verstarb.&lt;br /&gt;
*Man kann nun mittels dem Setter &amp;quot;Name&amp;quot; auch &amp;quot;ß&amp;quot; und Smilies o.ä. im Playernamen setzen.&lt;br /&gt;
*Bei der Namensvergabe des Sonosplayer-FHEM-Device wird jetzt ein bißchen besser umgewandelt. Erst werden alle Sonderzeichen entfernt, dann Leerzeichen an den Rändern entfernt, und dann die restlichen Leerzeichen in &amp;quot;_&amp;quot; umgewandelt&lt;br /&gt;
*Das Attribut &amp;quot;characterDecoding&amp;quot; wurde entfernt, da es keine Funktion mehr hatte.&lt;br /&gt;
*Der UPnP-Teil verwendet nun einen beliebigen freien Port für die Kommunikation mit den Playern. Dadurch sind auch mehrere Instanzen auf ein und derselben Maschine möglich.&lt;br /&gt;
*Es gibt jetzt einen neuen Setter &amp;quot;RescanNetwork&amp;quot; am Sonos-Device. Damit kann man den Erkennungsprozess des UPnP-Moduls neu anstarten.&lt;br /&gt;
*Es gibt jetzt eine Get-Anweisung &amp;quot;SupportLinks&amp;quot; am Playerdevice, die direkte Links (momentan zwei) zu den Player-Support-Seiten liefert.&lt;br /&gt;
*Ein Datei-Ordner als Favorit konnte nicht sauber gestartet werden. Es wurde nicht als Album in die aktuelle Abspielliste übertragen, sondern als ein Titel direkt abgespielt. Des Weiteren wurde dafür kein Coverbild ermittelt.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 15.12.2015 &lt;br /&gt;
| &lt;br /&gt;
*Es gibt eine neue Funktionalität an den Sonosplayern: Repeat für einen einzelnen Titel. Durch diese Umstellung wurde der Repeat-Zustand nicht korrekt erkannt. Dafür gibt es jetzt noch einen zusätzlichen Setter und ein zusätzliches Reading: &amp;quot;RepeatOne&amp;quot;.&lt;br /&gt;
*Es gibt eine neue Funktion &amp;quot;DeleteFromQueue&amp;quot;, die Titel aus der aktuellen Abspielliste entfernen kann. Angegeben wird der Index des Elements / der Elemente.&lt;br /&gt;
*Das Reading &amp;quot;fieldType&amp;quot; wurde nicht ordnungsgemäß auf Leer gesetzt, wenn die Gruppierung aufgelöst wurde.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 08.12.2015 &lt;br /&gt;
| &lt;br /&gt;
*Bei der Erkennung von Streams beim Restore von PlayURITemp wurde ein neues Format nicht berücksichtigt.&lt;br /&gt;
*Bei der Verwendung von &amp;quot;set Sonos Groups Reset&amp;quot; tauchte eine Fehlermeldung wegen eines Leerstrings auf.&lt;br /&gt;
*Es wurde ein neuer Setter &amp;quot;LoadFavourite&amp;quot; eingebaut, der einem StartFavourite mit der Angabe von NoStart entspricht.&lt;br /&gt;
*Man kann bei LoadSearchList nun auch an das Ende der aktuellen Abspielliste anhängen lassen. Dazu muss man an den Parameter maxElem ein &amp;quot;+&amp;quot; anhängen.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 07.12.2015 &lt;br /&gt;
| &lt;br /&gt;
*Zwei neue Setter &amp;quot;DialogLevel&amp;quot; und &amp;quot;NightMode&amp;quot;, die an einer PlayBar ausgeführt werden können.&lt;br /&gt;
*&amp;quot;Set Sonos Groups&amp;quot; hat eine neue Option &amp;quot;Reset&amp;quot;, mit der alle Gruppen in einem Rutsch aufgelöst werden können.&lt;br /&gt;
*ControlPoint.pm: Bei einem Fehler beim Verbindungsaufbau zum Player wurde aus dem &amp;quot;carp&amp;quot; ein &amp;quot;croak&amp;quot; gemacht. Dadurch greifen die Auffangmechanismen.&lt;br /&gt;
*Beim Verlieren des Gruppenmaster stand der TransportState bei allen zukünftigen NICHT-Gruppenmastern bis zum nächsten Titelwechsel auf &amp;quot;ERROR&amp;quot;.&lt;br /&gt;
*Man kann bei einer Speak-Definition nun auch den Parameter %textescaped% verwenden, um den URL-Enkodierten Text einzufügen.&lt;br /&gt;
*Die Smartmatch-Fehlermeldung wird nun unterdrückt&lt;br /&gt;
*Die Fehlerausgabe bei fehlenden Set- oder Get-Parametern enthält jetzt auch den zulässigen Wertebereich des Parameters (z.B. &#039;(0..100)&#039; für die Lautstärke), sowie die optionalen Parameter&lt;br /&gt;
*StartSearchList hat die Wiedergabe immer neu gestartet, obwohl das u.U. gar nicht nötig war.&lt;br /&gt;
*Die Attribute für die Lautstärke (minVolume, maxVolume, minVolumeHeadphone und maxVolumeHeadphone) können nun im laufenden Betrieb geändert werden und die neuen Grenzen werden sofort sichergestellt.&lt;br /&gt;
*Es gibt einen neuen Setter &#039;MakeStandaloneGroup&#039;, mit dem man einen Player aus seiner Gruppe lösen kann.&lt;br /&gt;
*Es wird der Provider Amazon nun mit angezeigt.&lt;br /&gt;
*Es gibt nun ein Attribut usedonlyIPs, mit dem man die IP-Adressen der zu verwendenden Player angeben kann. Damit ist man manchmal besser dran, als mit dem Ausschluss von einzelnen Adressen&lt;br /&gt;
*Es gibt einen neuen Setter &amp;quot;TruePlay&amp;quot;.&lt;br /&gt;
*Es gibt ein neues Attribut &#039;SpeakGoogleURL&#039; für die Definition der zu verwendenden Google-URL für die Sprachausgabe&lt;br /&gt;
*Die Standard-Google-URL wurde nach neuen Hinweisen angepasst.&lt;br /&gt;
*Es gibt neue Setter &amp;quot;AudioDelayLeftRear&amp;quot; (Abstand hinterer linker Lautsprecher), &amp;quot;AudioDelayRightRear&amp;quot; (Abstand hinterer rechter Lautsprecher) und &amp;quot;SubPolarity&amp;quot; (Sub Aufstellung) bei einem 5.1 Surroundsystem.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 02.08.2015 &lt;br /&gt;
| &lt;br /&gt;
*uri_escape() umgestellt, sodass auch UTF8-Sonderzeichen übersetzt werden&lt;br /&gt;
*Google-Translator-URL parametrisiert und um die mittlerweile notwendigen Parameter &#039;client=t&#039; und &#039;prev=input&#039; erweitert&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 12.07.2015 &lt;br /&gt;
| &lt;br /&gt;
*Es gibt zwei neue Setter &amp;quot;GroupVolumeU&amp;quot; und &amp;quot;GroupVolumeD&amp;quot;, um die Gruppenlautstärke um &#039;VolumeStep&#039;-Einheiten zu erhöhen oder zu verringern.&lt;br /&gt;
*Innerhalb des SubProzesses wurden die Devicenamen der bereits in FHEM definierten Player nicht korrekt verwendet. Das machte sich erst mit dem neuen Feature Bookmarks bemerkbar.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 14.06.2015 &lt;br /&gt;
| &lt;br /&gt;
*Zwei weitere Ausnahmen für das Neustarten des SubThreads eingefügt.&lt;br /&gt;
*ControlPoint.pm: Beim Renew von Subscription wurde aus dem &amp;quot;carp&amp;quot; ein &amp;quot;croak&amp;quot; gemacht. Dadurch greifen die darüberliegenden Auffangmassnahmen.&lt;br /&gt;
*Neues Feature: Bookmarks für Playlisten und Titel&lt;br /&gt;
*Changelog in der Quelltextdatei enthält nur noch für die letzten vier Veröffentlichungen. Die komplette Liste ist nur noch im Wiki vorhanden. Dadurch wird die Dateigröße geringer.&lt;br /&gt;
*SetEQ eingebaut, um Subwoofer und Surroundeinstellungen vornehmen zu können: &amp;quot;SurroundEnable&amp;quot;, &amp;quot;SurroundLevel&amp;quot;, &amp;quot;SubEnable&amp;quot;, &amp;quot;SubGain&amp;quot; und &amp;quot;AudioDelay&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 02.05.2015 &lt;br /&gt;
| &lt;br /&gt;
*Es gibt drei neue Readings &amp;quot;FavouritesVersion&amp;quot;, &amp;quot;RadiosVersion&amp;quot; und &amp;quot;PlaylistsVersion&amp;quot;, die bei einer Änderung des jeweiligen Bereichs durch einen Sonos Controller aktualisiert werden, und auf die man mit einem Notify reagieren kann, um z.B. ein &amp;quot;get player FavouritesWithCovers&amp;quot; ausführen zu können. Damit entfällt die Notwendigkeit von zeitgesteuerten Aktualisierungen.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 14.04.2015 &lt;br /&gt;
| &lt;br /&gt;
*Zusätzliche Fehlerüberprüfung und -ausgabe beim Herunterladen der Cover-Bilder eingebaut, sowie relative URLs unterbunden&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 07.04.2015 &lt;br /&gt;
| &lt;br /&gt;
*Neues Feature &#039;ExportSonosBibliothek&#039;: Hiermit kann eine Datei mit der textuellen Darstellung eines Struktur- und Titelhashs erzeugt werden, das die komplette Navigationsstruktur aus der Sonos-Bibliothek abbildet. Richtwerte bei ca. 22.000 Titeln auf einem Windows-Server mit Intel Core i5 mit 2.8GHz: Laufzeit: ca. 28Min, Arbeitsspeicher: ca. 1GB, Resultierende Datei: ca. 90MB&lt;br /&gt;
*Neues Feature &#039;DeletePlaylist&#039;: Hiermit kann eine Playlist gelöscht werden. Genauso wie bei LoadPlaylist kann man hier URL-Encoded arbeiten, oder einen regulären Ausdruck verwenden&lt;br /&gt;
*Neues Feature &#039;SnoozeAlarm&#039;: Hiermit kann ein gerade abspielender Alarm für die übergebene Zeit unterbrochen werden&lt;br /&gt;
*Neues Feature bei &#039;LoadPlaylist&#039;: Man kann nun einen Devicenamen angeben, dann wird dessen aktuelle Abspielliste kopiert&lt;br /&gt;
*Bei der Titelanzeige wird der Numerische Vergleichsfehler abgefangen, der auftritt, wenn der Player keinerlei aktuelle Abspielinformationen hat&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 03.04.2015 &lt;br /&gt;
| &lt;br /&gt;
*IsAlive-Check Anpassungen: Bei einer Antwort wird nun nicht mehr geprüft, ob diese von derselben Netzwerkschnittstelle stammt, an die der Ping gesendet wurde. Damit werden Player besser erkannt, die sowohl am Funknetz als auch am LAN angeschlossen sind.&lt;br /&gt;
*IsAlive-Check Anpassungen: Bei der Option &#039;tcp&#039; wird nun versucht auf den Standard-Webport des Players zu verbinden (1400)&lt;br /&gt;
*Callback-Aufrufmethoden: Wenn ein Player eine Nachricht an FHEM sendet und dieser Player in FHEM als &#039;disappeared&#039; geführt wird, dann wird der Discovery-Process neu angestartet, um diesen Player wieder sauber zu erkennen&lt;br /&gt;
*Sonos hat das Verfahren zum Hinzufügen von Spotify-Titeln angepasst. Jetzt kann man diese Titel auch wieder mit dem Modul einfügen und abspielen lassen&lt;br /&gt;
*Das Heraussuchen der Spotify-Cover (z.B. für Playlisten) schlug fehl, wenn die API kein Bild mit 640er Höhe angeboten hat. Nun wird das erste Cover verwendet, welches immer das größte sein sollte&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 28.03.2015 &lt;br /&gt;
| &lt;br /&gt;
*Die Wiederholungsintervalle (Tage) von Alarmen werden wieder korrekt erkannt, und gesetzt&lt;br /&gt;
*Bei PlaylistWithCovers wird nun auch ein Cover angezeigt, wenn der erste Titel ein Spotify-Titel ist&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 28.02.2015 &lt;br /&gt;
| &lt;br /&gt;
*Der Speak-Befehl kann jetzt auch eingeschobene MP3-Datei-Verweise verarbeiten. Diese werden im Text mit &amp;quot;|&amp;quot; eingeschlossen, und mit Leerzeichen abgetrennt. z.B.: &amp;quot;Dies ist ein |/path/to/tada.mp3| Test.&amp;quot;. Funktioniert nur bei &amp;quot;Speak&amp;quot; (und nicht bei eigenen Programmaufrufen wie &amp;quot;Speak1&amp;quot;)&lt;br /&gt;
*Es gibt für die einfachere Handhabung der neuen Speakmöglichkeiten zwei neue Attribute &amp;quot;targetSpeakMP3FileDir&amp;quot; und &amp;quot;targetSpeakMP3FileConverter&amp;quot;. Mit &amp;quot;targetSpeakMP3FileDir&amp;quot; kann ein Standardverzeichnis für die eingschobenen MP3-Dateien angegeben werden, und mit &amp;quot;targetSpeakMP3FileConverter&amp;quot; kann ein MP3-Konverter definiert werden, der am Ende die zusammengebaute Durchsage-MP3-Datei nochmal sauber durchkodiert (um z.B. Restzeitanzeigeprobleme zu beheben).&lt;br /&gt;
*Beim internen Entfernen der Player-Objekte (wenn z.B. die Subscription nicht erneuert werden konnte), werden nun alle Referenzen entfernt. Teilweise wurden Subscription-Referenzen noch aufbewahrt.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 19.02.2015 &lt;br /&gt;
| &lt;br /&gt;
*Das Attribut &amp;quot;verbose&amp;quot; am Sonos-Device wird nun zur Laufzeit an den SubProzess übertragen und wirkt dort sofort.&lt;br /&gt;
*Beim initialen Erkennen der wichtigsten Abspielparameter während des Discover-Prozesses gab es einen Fehler, der das Setzen verhindert hat&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 14.02.2015 &lt;br /&gt;
| &lt;br /&gt;
*Festen Lib-Pfad für Synology-Stations hinzugefügt.&lt;br /&gt;
*Im Modul 21_SONOSPLAYER wurde ein require auf das Modul 00_SONOS eingefügt.&lt;br /&gt;
*Es gibt jetzt einen neuen Setter &amp;quot;ResetAttributesToDefault&amp;quot;, mit dem man die Attribute eines Devices auf den Standard beim Anlegen zurücksetzen lassen kann. Die notwendigen Informationen werden frisch vom Player angefordert, und können sich somit, auf den ursprünglichen Anlege-Zeitpunkt bezogen, verändert haben.&lt;br /&gt;
*Ein Fehler bei der Verarbeitung von Devicebeschreibungen wurde in der Datei &amp;quot;Common.pm&amp;quot; des UPnP-Moduls behoben.&lt;br /&gt;
*Es gibt jetzt zwei neue Readings &amp;quot;GroupVolume&amp;quot; und &amp;quot;GroupMute&amp;quot;, die automatisch aktualisiert werden. Damit passt jetzt auch die Anzeige des Slider beim Setter &amp;quot;GroupVolume&amp;quot; und die Vorauswahl beim Setter &amp;quot;GroupMute&amp;quot;.&lt;br /&gt;
*Fehlermeldungen für Speak wurden erweitert.&lt;br /&gt;
*Bei der Verwendung von &amp;quot;targetSpeakFileHashCache&amp;quot; wird nun auch Digest::SHA versucht, wenn Digest::SHA1 nicht funktioniert.&lt;br /&gt;
*Es gibt zwei neue Reading &amp;quot;currentTrackProvider&amp;quot; und &amp;quot;nextTrackProvider&amp;quot;, in dem die &#039;Quelle&#039; der aktuellen (bzw. nächsten) Wiedergabe abgelegt wird. Damit kann man sich Anzeigen lassen, ob der aktuelle Titel z.B. von Spotify oder aus der hausinternen Bibliothek kommt.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 06.02.2015 &lt;br /&gt;
| &lt;br /&gt;
*Der Getter &amp;quot;EthernetPortStatus&amp;quot; hat jetzt auch die Portnummern 2 und 3 zur Auswahl.&lt;br /&gt;
*Es gibt ein neues Reading &amp;quot;OutputFixed&amp;quot; sowie ein zugehöriger Setter zum Setzen des Wertes.&lt;br /&gt;
*Es wurde im Standard-RemoteControl-Design ein :blank zwischen den Steuerbefehlen und den drei Umschaltbefehlen (&amp;quot;MuteT&amp;quot;, &amp;quot;ShuffleT&amp;quot; und &amp;quot;RepeatT&amp;quot;) eingefügt.&lt;br /&gt;
*Es gibt ein neues Reading &amp;quot;roomNameAlias&amp;quot;, das den Namen enthält, der für das Attribut &amp;quot;alias&amp;quot; beim Erkennen des Players verwendet werden würde (z.B. &amp;quot;Wohnzimmer - Rechts&amp;quot;). Wird zu Laufzeit mit aktualisiert.&lt;br /&gt;
*Es gibt zwei neue Setter-Befehle &amp;quot;LoadSearchlist&amp;quot; und &amp;quot;StartSearchlist&amp;quot;. Mit diesen kann eine dynamisch erzeugte Playliste mit Titeln aus der Sonos-Bibliothek geladen werden. Nähere Informationen dazu im Wiki.&lt;br /&gt;
*Es gibt einen neuen Getter-Befehl &amp;quot;SearchlistCategories&amp;quot;, mit dem die möglichen Kategorien für den Aufruf von &amp;quot;LoadSearchlist&amp;quot; oder &amp;quot;StartSearchlist&amp;quot; ermittelt werden können.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 01.02.2015 &lt;br /&gt;
| &lt;br /&gt;
*Es gibt nun zwei neue Befehle &amp;quot;ShuffleT&amp;quot; und &amp;quot;RepeatT&amp;quot;, die jeweils den aktuellen Zustand von &amp;quot;Shuffle&amp;quot; und &amp;quot;Repeat&amp;quot; umschalten&lt;br /&gt;
*Das angelegte RemoteControl sowie die RemoteControl Vorlagen enthalten nun zwei neue Icons für Shuffle-Umschaltung und Repeat-Umschaltung&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 31.01.2015 &lt;br /&gt;
| &lt;br /&gt;
*Es gibt jetzt drei Sonos-Vorlagen für RemoteControl: &amp;quot;Sonos&amp;quot;, &amp;quot;SonosSVG_Buttons&amp;quot; und &amp;quot;SonosSVG_Icons&amp;quot;. &lt;br /&gt;
*Es gibt jetzt ein neues Standardlayout (SonosSVG_Buttons) für die Erzeugung der RemoteControl.&lt;br /&gt;
*Es gibt jetzt ein Attribut &amp;quot;ignoredIPs&amp;quot;, mit dem man problematische oder unerwünschte IPs bei der UPnP-Erkennung ausschließen kann.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 30.01.2015 &lt;br /&gt;
| &lt;br /&gt;
*Commandref wurde optisch übersichtlicher gestaltet, und die Windows-Hinweise eingefügt.&lt;br /&gt;
*Bei der Anzeige des nächsten Titels in der Standard-ReadingsGroup stand &amp;quot;Artist&amp;quot;. Das wurde auf &amp;quot;Interpret&amp;quot; korrigiert.&lt;br /&gt;
*Es gibt jetzt eine Prozedur &amp;quot;SONOSPLAYER_GetSlavePlayerNames()&amp;quot;, mit der man sich die Teilnehmer einer Gruppe liefern lassen kann. Der Master wird nicht mit zurückgegeben. Man kann den Namen eines beliebigen Teilnehmers angeben.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 27.01.2015 &lt;br /&gt;
| &lt;br /&gt;
*Bei den Befehlen &amp;quot;AddMember&amp;quot;, &amp;quot;RemoveMember&amp;quot; und &amp;quot;CreateStereoPair&amp;quot; werden nun alle in FHEM verfügbaren Sonosplayer in einer Auswahl angeboten. Das erfolgt allerdings ungeachtet der Gültigkeit eines Players in diesem Kontext (z.B. kann man keinen Player aus der Gruppe entfernen, der nicht in der Gruppe ist, die Auswahl bietet aber alle an).&lt;br /&gt;
*Es gibt jetzt eine Prozedur &amp;quot;SONOSPLAYER_GetMasterPlayerName()&amp;quot; mit der man sich den Devicenamen des Masterplayer zu dem übergebenen Playernamen geben lassen kann.&lt;br /&gt;
*Es gibt einen neuen Setter &amp;quot;Mute&amp;quot; am Sonos-Device. Damit kann man mit einem Schritt bei allen Playern den Mute-Zustand setzen.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 26.01.2015 &lt;br /&gt;
| &lt;br /&gt;
*Beim Setzen von &amp;quot;disable&amp;quot; am Sonos-Device wurde der &amp;quot;state&amp;quot; und &amp;quot;STATE&amp;quot; der Player nicht korrekt gesetzt. &lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 24.01.2015 &lt;br /&gt;
| &lt;br /&gt;
*Wenn man seine Player umbenannt hatte, wurde ein Attribut-Kommando (für das Model-Attribut) falsch aufgerufen und hat eine Fehlermeldung im FHEM-Log verursacht (z.B. &amp;quot;Please define Sonos_Wohnzimmer first&amp;quot;)&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 19.01.2015 &lt;br /&gt;
| &lt;br /&gt;
*Verweise auf die &amp;quot;alte&amp;quot; Wikiseite &amp;quot;Sonos Anwendungsbeispiel&amp;quot; in der commandref durch die &amp;quot;neue&amp;quot; Seite &amp;quot;SONOS&amp;quot; ersetzt.&lt;br /&gt;
*Wenn kein Pingtype definiert wurde, dann wurde fälschlicherweise nicht der Standard &amp;quot;syn&amp;quot; verwendet, sondern &amp;quot;none&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 16.01.2015 &lt;br /&gt;
| &lt;br /&gt;
*Speak hatte eine fehlerhafte Überprüfung der Attribute, und konnte nicht ausgeführt werden.&lt;br /&gt;
*Bei Streams wird das Reading &amp;quot;currentTrackPosition&amp;quot; nun fest auf &amp;quot;0:00:00&amp;quot; gesetzt, und nicht mehr beim Player angefragt&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 15.01.2015&lt;br /&gt;
| &lt;br /&gt;
*Für die Setter &amp;quot;LoadPlaylist&amp;quot;, &amp;quot;StartPlaylist&amp;quot;, &amp;quot;LoadRadio&amp;quot;, &amp;quot;StartRadio&amp;quot; und &amp;quot;StartFavourite&amp;quot; kann man jetzt anstatt des Namens einen regulären Ausdruck verwenden.&lt;br /&gt;
*Beim Erkennen der Player werden einige Abspielreadings (&amp;quot;transportState&amp;quot;, &amp;quot;currentTrackURI&amp;quot;, &amp;quot;currentTrackDuration&amp;quot;, &amp;quot;currentTrackPosition&amp;quot;, &amp;quot;currentTrack&amp;quot;, &amp;quot;numberOfTracks&amp;quot;, &amp;quot;currentStreamAudio&amp;quot; und &amp;quot;currentNormalAudio&amp;quot;) nun direkt abgeholt, und werden somit aktuell korrekt gesetzt.&lt;br /&gt;
*Beim Anlegen der neuen Devices werden die Aliasnamen nun mit der Funktion im Team erweitert&lt;br /&gt;
*Der Mechanismus zum Starten des SubProzesses wurde angepasst, um auf Synology-Begebenheiten Rücksicht zu nehmen&lt;br /&gt;
*Die Coverdarstellung für einige Spotify-Titel wurde korrigiert, indem eine andere Spotify-API verwendet wird&lt;br /&gt;
*Bei Playlist-Covern wird nun das Cover des ersten Titels mit AlbumArt angezeigt&lt;br /&gt;
*Bei Favourite-Covern werden nun Album-Favoriten auch mit Cover dargestellt (das Cover des ersten Titels mit AlbumArt)&lt;br /&gt;
*Ein Album aus der lokalen Bibliothek konnte mittels &amp;quot;StartFavourite&amp;quot; nicht korrekt gestartet werden (es wurde nicht als Liste übertragen, sondern als Titel gestartet)&lt;br /&gt;
*LogLevel für die &amp;quot;Connection accepted&amp;quot;-Meldungen auf 3 hochgesetzt&lt;br /&gt;
*Es gibt jetzt ein Attribut &amp;quot;disable&amp;quot; am Sonos-Device. Wird es auf 1 gesetzt, wird der SubProzess beendet und verarbeitet somit keine Sonos-Nachrichten mehr. Wird es auf 0 gesetzt (oder gelöscht), wird der SubProzess wieder gestartet.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 08.01.2015 &lt;br /&gt;
| &lt;br /&gt;
*Bei der Wiedergabeanweisung &amp;quot;PlayURI&amp;quot; gab es einen Fehler&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 05.01.2015 &lt;br /&gt;
| &lt;br /&gt;
*Die Cover beim Abspielen &amp;quot;von diesem Gerät&amp;quot; (also iPad, oder Android-Tablet) wurden nicht angezeigt.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 04.01.2015 &lt;br /&gt;
| &lt;br /&gt;
*Bei der Ermittlung des Readings &amp;quot;AlbumArtist&amp;quot; gab es einen Fehler, wenn dieser von Sonos nicht übermittelt wurde.&lt;br /&gt;
*Wenn ein Player einen Dock (iPod) wiedergibt, dann werden die Titelinformationen dort mitgesetzt. Damit entfällt die Anzeige des Titels z.B. mit &#039;iPod von Reinerlein&#039;.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 03.01.2015 &lt;br /&gt;
| &lt;br /&gt;
*Dokumentation angepasst (commandref und Installationsdoku im Dateiheader)&lt;br /&gt;
*Fehler bei der Dockbehandlung behoben&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 02.01.2015 &lt;br /&gt;
| &lt;br /&gt;
*Anzeige bei der Wiedergabe eines Docks verbessert. Dort werden nun der Titel und Album/Artist-Informationen und ein Dock-Cover angezeigt.&lt;br /&gt;
*Getter/Setter bei Bedarf um &amp;quot;:noArg&amp;quot; erweitert.&lt;br /&gt;
*Getter/Setter sind nun nicht mehr CaseSensitive&lt;br /&gt;
*Getter/Setter habe nun soweit möglich eine Auswahlliste der möglichen Werte (alle on/off Setter, sowie Wifi und RoomIcon)&lt;br /&gt;
*Setter für &amp;quot;Treble&amp;quot; und &amp;quot;Bass&amp;quot; haben nun auch einen Slider&lt;br /&gt;
*Setter &amp;quot;Icon&amp;quot; in &amp;quot;RoomIcon&amp;quot; umbenannt, damit die Auswahlliste den aktuellen vorauswählt&lt;br /&gt;
*Beim Erzeugen der Sonosplayer-Devices wird nun das Attribut &amp;quot;alias&amp;quot; auf den Sonos-Raumnamen gesetzt.&lt;br /&gt;
*Zusätzlich zu &amp;quot;StopAll&amp;quot; oder &amp;quot;PauseAll&amp;quot; gibt es am Sonos-Device nun auch &amp;quot;Stop&amp;quot; und &amp;quot;Pause&amp;quot; mit der gleichen Funktionalität&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 01.01.2015 &lt;br /&gt;
| &lt;br /&gt;
*Anzeige in der Player-ReadingsGroup für die Darstellung von disappeared angepasst, dabei auch gleich die Höhenverhältnisse etwas angepasst.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 31.12.2014 &lt;br /&gt;
| &lt;br /&gt;
*Das Bilden von Stereopaaren wird nun unterstützt. Dafür gibt es die Anweisungen &#039;CreateStereoPair&#039; und &#039;SeparateStereoPair&#039; an einem Playerdevice.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 28.12.2014&lt;br /&gt;
| &lt;br /&gt;
*Umlaute: Die Erkennung von Umlauten war wegen der Quelltextumstellung auf UTF8 fehlerhaft. Das betraf nur die Zonennamenumwandlung, wo z.B. aus &#039;Küche&#039; ein &#039;Kueche&#039; gemacht wird.&lt;br /&gt;
*Sonos-Coverlieferung: Es waren noch ein paar Return-Anweisungen zuviel drin.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 26.12.2014&lt;br /&gt;
| &lt;br /&gt;
*DeleteFn für Sonos wurde implementiert. Das Sonos-Device löscht erst alle SonosPlayer-Devices und beendet den selbst gestarteten SubProzess. Danach wird das Sonos-Device selber von FHEM abgeräumt.&lt;br /&gt;
*DeleteFn für SonosPlayer wurde implementiert. Es werden erst alle automatisch erzeugten Devices (RemoteControl und ReadingsGroups) entfernt, sofern sie noch unter dem Originalnamen existieren.&lt;br /&gt;
*ReportUnresponsiveDevice hat manchmal versucht, die Mitteilung an &amp;quot;sich selbst&amp;quot; zu senden, was naturgemäß nicht klappen kann.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;vertical-align:top&amp;quot; | Versionen von fhem.lmsoft.de&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 17.12.2014 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 2.6 &lt;br /&gt;
| &lt;br /&gt;
*Die Zeichenkodierung bei Datenübernahme vom Zoneplayer kann nun über das Attribut characterDecoding eingestellt werden&lt;br /&gt;
*Bei Gruppen-/LineIn-/SPDIF-Wiedergabe wird wieder die liefernde Zone angezeigt (als Albumname)&lt;br /&gt;
*SetCurrentPlaylist hatte einen Tippfehler, und konnte dementsprechend nicht ausgeführt werden&lt;br /&gt;
*Unter Ubuntu gibt es die SHA1-Library nicht mehr, sodass man dort eine andere einbinden muss (SHA)&lt;br /&gt;
*Wenn bei den Methoden zum heraussuchen der FHEM-Devices etwas nicht gefunden wurde, dann wird jetzt eine Fehlermeldung mit dem gesuchten Merkmal ausgegeben&lt;br /&gt;
*Es können jetzt IP-Adressen von der UPnP-Verarbeitung ausgeschlossen werden&lt;br /&gt;
*Es wird nun ein fester Mimetype &#039;jpg&#039; für Google Music und Simfy festgelegt&lt;br /&gt;
*Beim Alarm-Reading-Setzen wurde etwas doppelt gesetzt, was u.U. zu Fehlern führen konnte&lt;br /&gt;
*Die Read-Function wurde robuster gegen Übertragungsprobleme gemacht&lt;br /&gt;
*Das Wiederherstellen des Playerzustands nach einem PlayURITemp sieht nun auch den PlayBar-Eingang vor&lt;br /&gt;
*Es wird nun anstatt der WebCmd-Auflistung ein RemoteControl beim Erstellen der Komponenten erzeugt&lt;br /&gt;
*Wenn sich doch noch ein UPnP-Device als Player ausgibt, dann wird dies nun etwas sicherer erkannt&lt;br /&gt;
*Der Eingang einer Playbar kann nun auf anderen Playern wiedergegeben werden (mittels des FHEM-Namens)&lt;br /&gt;
*Lesen wurde auf DevIo_SimpleRead umgestellt (stand auf DevIo_DoSimpleRead). Dadurch wird das Fehlerhandling vereinfacht.&lt;br /&gt;
*Man kann die Zeit für das Warten auf den Subprozess nun beim Define mit angeben. Standardmäßig wird 8 verwendet.&lt;br /&gt;
*Es wird nun in regelmäßigen Abständen (Intervall wie bei der Prüfung der Sonosplayer) geprüft, ob die Verbindung zum Subprozess noch funktioniert&lt;br /&gt;
*Die Readings, die beim Start nicht geladen werden dürfen, werden beim Start von FHEM nun initialisiert. Damit wird die Fehlermeldung in MOTD verhindert&lt;br /&gt;
*Der Zeitstempel in der Konsolenausgabe berücksichtigt nun auch die Global-Angabe, ob Millisekunden mit ausgegeben werden sollen&lt;br /&gt;
*Der Start wurde komplett überarbeitet. Nun sind die einzelnen Wartebereiche in Timer ausgelagert, sodass FHEM nicht mit warten blockiert wird.&lt;br /&gt;
*Die Wiederherstellung des alten Playerzustands nach einem PlayURITemp (und damit auch bei Speak) wird nun auch bei Dateien gemacht, die mit 0s Dauer ermittelt werden (da sie sehr kurz sind).&lt;br /&gt;
*Der Aufruf der Google Text2Speech-Engine wird nun bei mehr als 95 Zeichen in mehrere Aufrufe aufgeteilt. Damit sind nun auch lange Texte über Google möglich, allerdings geht die Textmelodie u.U. verloren.&lt;br /&gt;
*Man kann jetzt für die Speak-Erzeugung ein JPG- oder PNG-Bild angeben. Dies kann für jedes Speak-Programm getrennt erfolgen.&lt;br /&gt;
*Beim Speak-Aufruf werden Umlaute nun auch korrekt an den Text2Speech-Generator (z.B. Google) übergeben, und korrekt in den MP3-Tag geschrieben&lt;br /&gt;
*Spotify-Cover werden nun in größerer Auflösung (meist 640x640 Pixel) direkt von Spotify heruntergeladen, und enthalten dann nicht mehr das Spotify-Logo&lt;br /&gt;
*Es gibt zwei neue Readings &#039;AlbumArtURL&#039; und &#039;nextAlbumArtURL&#039;, die die Originalpfade zum eigenen Download darstellen&lt;br /&gt;
*Es gibt nun zwei Prozeduren, die als Grundlage oder Beispiel für die Verwendung von ReadingsGroups dienen können: &#039;SONOS_getTitleRG&#039; und &#039;SONOS_getCoverRG&#039;&lt;br /&gt;
*Beim automatischen Erzeugen der Sonos-Devices werden nun ReadingsGroups mit mehr Informationen erzeugt. Dies kann (und soll) auch als Vorlage für eigene Ideen Verwendet werden&lt;br /&gt;
*Es gibt eine weitere ReadingsGroup-Vorlage (steht auch im Wiki), mit der Listen (Playlisten, Favoriten und Radios) dargestellt werden können&lt;br /&gt;
*Es gibt zwei neue Attribute &amp;quot;proxyCacheTime&amp;quot; und &amp;quot;proxyCacheDir&amp;quot;, die einen Cache im Proxy aktivieren&lt;br /&gt;
*Es gibt drei neue Getter am Sonosplayer-Device: &amp;quot;FavouritesWithCover&amp;quot;, &amp;quot;PlaylistsWithCover&amp;quot; und &amp;quot;RadiosWithCovers&amp;quot;. Diese geben eine Datenstruktur zurück, die den Titel und das Cover des Elements enthält.&lt;br /&gt;
*Die Prozeduren für die Anzeige des aktuellen und nächsten Titels verwenden nun ausschließlich DIV-Container (anstatt Tabellen). Dadurch klappt die Anzeige auch in einem Dashboard.&lt;br /&gt;
*Die Standard-ReadingsGroup-Anzeige durch die Prozeduren sind nun Parametrisiert. Man kann die minimale Breite der Anzeige sowie den Abstand zwischen aktuellem und nächstem Titel in Pixel festlegen&lt;br /&gt;
*Manche Sender (z.B. Capital Radio Türkiye) haben verbotene Newlines in den Titelinformationen mitgesendet. Diese werden nun entfernt.&lt;br /&gt;
*Man kann das Cover nun anklicken (oder antippen), und erhält dann die Coverdarstellung in einer Vollbilddarstellung mit Abspielstatus und Titelinformationen&lt;br /&gt;
*Es gibt zwei neue Befehle &#039;StartPlaylist&#039; und &#039;StartRadio&#039;, die die gleichen Parameter wie ihre Pendants mit &#039;Load&#039; am Anfang haben, nur dass hier das Abspielen gleich gestartet wird.&lt;br /&gt;
*Es gibt jetzt ein Reading &#039;currentTrackPosition&#039;, welches bei jedem Transportstate-Wechsel (neuer Titel, Play/Pause/Stop usw.) gesetzt wird. Damit kann man die verbleibende Restzeit eines laufenden Titels ermitteln, bzw. den Pausezeitpunkt anzeigen.&lt;br /&gt;
*Beim Wiedergeben von TV oder sonstigen externen Quellen, wird jetzt nicht mehr das &#039;leere&#039; Cover angezeigt, sondern ein TV-Cover bzw. ein Default-Input-Cover&lt;br /&gt;
*Aufnahme in das offizielle Release von FHEM&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 07.03.2014 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 2.5 &lt;br /&gt;
| &lt;br /&gt;
*Verwendung und Speicherung der Benutzer-IDs für Spotify und Napster wurden stabiler gegenüber Sonderzeichen gemacht&lt;br /&gt;
*Spotify-URLs werden im Reading &#039;currentTrackURI&#039; und &#039;nextTrackURI&#039; lesbarer abgelegt&lt;br /&gt;
*Ein Fehler beim Öffnen von M3U-Playlistdateien wurde behoben (dafür Danke an John)&lt;br /&gt;
*Überholt: Für die Informationsanfragen an FHEM durch den SubProzess wird nun standardmäßig der Telnet-Port von FHEM verwendet. Wenn das fehlschlägt, wird auf den alten Mechanismus zurückgeschaltet&lt;br /&gt;
*Neu: Es werden keine Informationsanfragen mehr zwischen FHEM und dem SubProzess ausgetauscht. Notwendige Informationen müssen vorher übertragen werden. Das bedeutet, dass bei einer Attributänderung ein Neustart von FHEM erfolgen muss.&lt;br /&gt;
*Es wurde ein Standard-Layout für das RemoteControl-Hilfsmodul angelegt&lt;br /&gt;
*Der Verbose-Level des Sonos-Devices wird nun auch an den SubProzess weitergereicht (auch zur Laufzeit), und beim initialen Start des SubProzess-Threads mitgegeben.&lt;br /&gt;
*AlbumArt von Napster erhält nun den festen Mimetype &#039;jpg&#039;, da dieser nicht übertragen wird&lt;br /&gt;
*Es werden nun die durch FHEM definierten Standard-Attribute mit angeboten&lt;br /&gt;
*Es gab ein Problem mit der Befehlsverarbeitung, wenn das Verbose-Attribut an einem Sonos-Device gesetzt war.&lt;br /&gt;
*Es wird nun auf Änderungsevents für den Zonennamen und das Zonenicon reagiert, und die entsprechenden Readings aktualisiert&lt;br /&gt;
*Es gibt jetzt zwei neue Setter: &#039;Name&#039; und &#039;Icon&#039;, mit dem der Name und das Icon der Zone eingestellt werden kann&lt;br /&gt;
*Es gibt jetzt einen Getter &#039;PossibleRoomIcons&#039;, welcher die möglichen Angaben für den neuen Setter &#039;Icon&#039; liefert&lt;br /&gt;
*Das Reading &#039;ZoneGroupID&#039; wird nun auf eine andere Weise ermittelt und gesetzt&lt;br /&gt;
*Es gib jetzt ein neues Reading &#039;AlarmRunning&#039;, welches auf &#039;1&#039; steht, wenn gerade eine Alarmabspielung aktiv ist&lt;br /&gt;
*Die Namens- und Aufgabenerkennung beim Ermitteln der Player wurde angepasst&lt;br /&gt;
*Der Aufruf von AddMember und RemoveMember wurde bzgl. des SonosDevice-Namen abgesichert, sodass hier kein Absturz mehr bei einer falschen Deviceangabe erfolgt&lt;br /&gt;
*Es gibt jetzt ein neues Reading &#039;AlarmRunningID&#039;, welches bei einer Alarmausführung die ID des aktiven Alarms enthält&lt;br /&gt;
*Das Senden von Aktualisierungen an FHEM wurde etwas sicherer gemacht, wenn FHEM auf der anderen Seite gerade nicht zuhören kann&lt;br /&gt;
*Die Readings &#039;AlarmList&#039;, &#039;AlarmListIDs&#039; und &#039;AlarmListVersion&#039; werden nicht mehr aus dem Statefile geladen, da dort Sonderzeichen wie &#039;#&#039; zum Abschneiden der restlichen Zeile führen&lt;br /&gt;
*Anpassung der UPnP-Klasse, damit das Device-Beschreibungsdokument nur noch einmal geladen wird (anstatt wie bisher zweimal)&lt;br /&gt;
*Anpassung im Bereich der Cover Aktualisierung über FHEMWeb. Das geht jetzt mit viel weniger Aufwand durch.&lt;br /&gt;
*Es gibt jetzt einen Setter &#039;SnapshotGroupVolume&#039;, der das aktuelle Lautstärkenverhältnis der einzelnen Player einer Gruppe für die folgenden Aufrufe des Setter &#039;GroupVolume&#039; festhält. Die Anweisungen &#039;PlayURI&#039; und &#039;PlayURITemp&#039; (sowie darauf aufbauende Aufrufe wie &#039;Speak&#039;) führen diese Anweisung selbsttätig beim Starten durch.&lt;br /&gt;
*Wenn beim Auffrischen der Subscriptions ein Fehler auftritt, der darauf schließen läßt, dass der Player weg ist, dann wird die entsprechende Referenz aufgeräumt&lt;br /&gt;
*Man kann als relative Angabe bei setVolume nun einen Prozentwert angeben, z.B. &#039;+20%&#039;. Damit wird die Lautstärke um den jeweiligen prozentualen Anteil erhöht oder abgesenkt.&lt;br /&gt;
*Es gibt jetzt ein Reading &#039;LineInConnected&#039;, welches eine &#039;1&#039; enthält, wenn der Line-In-Eingang angeschlossen wurde, sonst &#039;0&#039;.&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 31.12.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 2.4 &lt;br /&gt;
| &lt;br /&gt;
*Initiale Lautstärkenermittlung wurde nun abgesichert, falls die Anfrage beim Player fehlschlägt&lt;br /&gt;
*Verbesserte Gruppenerkennung für die Anzeige der Informationen wie Titel usw.&lt;br /&gt;
*Fallback (Log) für den Aufruf von Log3 geschaffen, damit auch alte FHEM-Versionen funktionieren&lt;br /&gt;
*Es wurde eine Korrektur im verwendetetn UPnP-Modul gemacht, die eine bessere Verarbeitung der eingehenden Datagramme gewährleistet (dafür Danke an Sacha)&lt;br /&gt;
*Es werden nun zusätzliche Readings (beginnend mit &#039;next&#039;) mit den Informationen über den nächsten Titel befüllt. Diese können natürlich auch für InfoSummarize verwendet werden&lt;br /&gt;
*Es kann nun ein Eintrag aus der Sonos-Favoritenliste gestartet werden (Playlist oder Direkteintrag)&lt;br /&gt;
*Das Benennen der Sonos-FHEM-Devices wird nun auf Namensdoppelungen hin überprüft, und der Name eindeutig gemacht. Dabei wird im Normalfall das neue Reading &#039;fieldType&#039; an den Namen angehangen. Nur der Master einer solchen Paarung bekommt dann den Original-Raumnamen als FHEM-Devicenamen&lt;br /&gt;
*Es gibt ein neues Reading &#039;fieldType&#039;, mit dem man erkennen kann, an welcher Position in einer Paarung dieser Zoneplayer steht&lt;br /&gt;
*Diverse Probleme mit Gruppen und Paarungen beim neu Erkennen der Sonos-Landschaft wurden beseitigt&lt;br /&gt;
*Es gibt jetzt einen Getter &#039;EthernetPortStatus&#039;, der den Status des gewünschten Ethernet-Ports liefert&lt;br /&gt;
*Es gibt jetzt einen Setter &#039;Reboot&#039;, der einen Neustart des Zoneplayers durchführt&lt;br /&gt;
*Es gibt jetzt einen Setter &#039;Wifi&#039;, mit dem der Zustand des Wifi-Ports eines Zoneplayers gesetzt werden kann&lt;br /&gt;
*Wenn ein Player als &amp;quot;Disappeared&amp;quot; erkannt wird, wird dem Sonos-System dies mitgeteilt, sodass er aus allen Listen und Controllern verschwindet&lt;br /&gt;
*Kleinere Korrektur, die eine bessere Verarbeitung der Kommunikation zwischen FHEM und dem Subprozess bewirkt&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 02.12.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 2.3 &lt;br /&gt;
| &lt;br /&gt;
*Die Antwort von &#039;SetCurrentPlaylist&#039; wurde korrigiert. Dort kam vorher &#039;SetToCurrentPlaylist&#039; zurück.&lt;br /&gt;
*VolumeStep kann nun auch als Attribut definiert werden. Das fehlte in der zulässigen Liste noch.&lt;br /&gt;
*Speak kann nun auch für lokale Binary-Aufrufe konfiguriert werden.&lt;br /&gt;
*Speak kann nun einen Hash-Wert auf Basis des gegebenen Textes in den Dateinamen einarbeiten, und diese dann bei Gleichheit wiederverwenden (Caching)&lt;br /&gt;
*Sonos kann nun ein &amp;quot;set StopAll&amp;quot; oder &amp;quot;set PauseAll&amp;quot; ausführen, um alle Player/Gruppen auf einen Schlag zu stoppen/pausieren&lt;br /&gt;
*Beim Discover-Event wird nun genauer geprüft, ob sich überhaupt ein ZonePlayer gemeldet hat&lt;br /&gt;
*Die UserIDs für Napster und Spotify werden wieder korrekt ermittelt. Damit kann auch wieder ein Playlistenimport erfolgen.&lt;br /&gt;
*Loudness Einstell- und Abfragbar&lt;br /&gt;
*Bass Einstell- und Abfragbar&lt;br /&gt;
*Treble Einstell- und Abfragbar&lt;br /&gt;
*Volume kann nun auch als RampToVolume ausgeführt werden&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 12.10.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 2.2 &lt;br /&gt;
| &lt;br /&gt;
*Befehlswarteschlange wieder ausgebaut. Dadurch gibt es nur noch das Reading LastActionResult, und alles wird viel zügiger ausgeführt, da FHEM nicht auf die Ausführung warten muss.&lt;br /&gt;
*TempPlaying berücksichtigt nun auch die Wiedergabe von Line-In-Eingängen (also auch Speak)&lt;br /&gt;
*Veraltete, mittlerweile unbenutzte, Readings werden nun gelöscht&lt;br /&gt;
*SetLEDState wurde hinzugefügt&lt;br /&gt;
*Die IsAlive-Überprüfung kann mit &#039;none&#039; abgeschaltet werden&lt;br /&gt;
*CurrentTempPlaying wird nicht mehr benötigt&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 23.09.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 2.1 &lt;br /&gt;
| &lt;br /&gt;
*Neuen Befehl &#039;CurrentPlaylist&#039; eingeführt&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 15.09.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 2.0 &lt;br /&gt;
| &lt;br /&gt;
*Neue Konzeptbasis eingebaut&lt;br /&gt;
*Man kann Gruppen auf- und wieder abbauen&lt;br /&gt;
*Es gibt neue Lautstärke- und Mute-Einstellungen für Gruppen ingesamt&lt;br /&gt;
*Man kann Button-Events definieren&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 27.05.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.13 &lt;br /&gt;
| &lt;br /&gt;
*Neuer Abspielzustand &#039;TRANSITIONING&#039; wird berücksichtigt&lt;br /&gt;
*Der Aufruf von &#039;GetDeviceDefHash&#039; wird nun mit dem Parameter &#039;undef&#039; anstatt ohne einen Parameter durchgeführt&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 23.05.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.12 &lt;br /&gt;
| &lt;br /&gt;
*TrackURI hinzugefügt&lt;br /&gt;
*LoadPlayList und SavePlayList können nun auch Dateinamen annehmen, um eine M3U-Datei zu erzeugen/als Abspielliste zu laden&lt;br /&gt;
*Alarme können ausgelesen, gesetzt und gelöscht werden&lt;br /&gt;
*SleepTimer kann gesetzt und ausgelesen werden&lt;br /&gt;
*Reading DailyIndexRefreshTime hinzugefügt&lt;br /&gt;
*Bei AddURIToQueue und PlayURI können jetzt auch (wie bei LoadPlayList) Spotify und Napster-Ressourcen angegeben werden&lt;br /&gt;
*Beim Erzeugen des Cover-Weblinks wird nun nur noch die Breite festgelegt, damit Nicht-Quadratische Cover auch korrekt dargestellt werden&lt;br /&gt;
*SONOS_Stringify gibt Strings nun in einfachen Anführungszeichen aus (und maskiert etwaig enthaltene im String selbst)&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 10.03.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.11 &lt;br /&gt;
| &lt;br /&gt;
*Ein Transport-Event-Subscribing wird nur dann gemacht, wenn es auch einen Transport-Service gibt. Die Bridge z.B. hat sowas nicht.&lt;br /&gt;
*Bei PlayURITemp wird nun der Mute-Zustand auf UnMute gesetzt, und anschließend wiederhergestellt&lt;br /&gt;
*Shuffle, Repeat und CrossfadeMode können nun gesetzt und abgefragt werden. Desweiteren wird der Status beim Transport-Event aktualisiert.&lt;br /&gt;
*Umlaute bei &amp;quot;generateInfoSmmarize3&amp;quot; durch &amp;quot;sichere&amp;quot; Schreibweise ersetzt (Lautst&amp;amp;auml;rke -&amp;gt; Lautstaerke)&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 22.02.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.10 &lt;br /&gt;
| &lt;br /&gt;
*IsAlive beendet nicht mehr den Thread, wenn der Player nicht mehr erreichbar ist, sondern löscht nur noch die Proxy-Referenzen&lt;br /&gt;
*FHEMWEB-Icons werden nur noch im Hauptthread aktualisiert&lt;br /&gt;
*Getter &#039;getBalance&#039; und Setter &#039;setBalance&#039; eingeführt.&lt;br /&gt;
*HeadphoneConnected inkl. minVolumeHeadphone und maxVolumeHeadphone eingeführt&lt;br /&gt;
*InfoSummarize um die Möglichkeit der Volume/Balance/HeadphoneConnected-Felder erweitert. Außerdem werden diese Info-Felder nun auch bei einem Volume-Event neu berechnet (und triggern bei Bedarf auch!)&lt;br /&gt;
*InfoSummarize-Features erweitert: &#039;instead&#039; und &#039;emptyval&#039; hinzugefügt&lt;br /&gt;
*IsAlive prüft nicht mehr bei jedem Durchgang bis zum Thread runter, ob die Subscriptions erneuert werden müssen &lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 16.02.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.9 &lt;br /&gt;
| &lt;br /&gt;
*RTL.it Informationen werden nun schöner dargestellt (Da steht eine XML-Struktur im Titel)&lt;br /&gt;
*Wenn kein Cover vom Sonos geliefert werden kann, wird das FHEM-Logo als Standard verwendet (da dieses sowieso auf dem Rechner vorliegt)&lt;br /&gt;
*UPnP-Fehlermeldungen eingebaut, um bei einer Nichtausführung nähere Informationen erhalten zu können&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 13.02.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.8 &lt;br /&gt;
| &lt;br /&gt;
*Device-Removed wird nun sicher ausgeführt. Manchmal bekommt man wohl deviceRemoved-Events ohne ein vorheriges deviceAdded-Event. Dann gibt es die gesuchte Referenz nicht.&lt;br /&gt;
*Renew-Subscriptions wurden zu spät ausgeführt. Da war alles schon abgelaufen, und konnte nicht mehr verlängert werden.&lt;br /&gt;
*ZonePlayer-Icon wird nun immer beim Discover-Event heruntergeladen. Damit wird es auch wieder aktualisiert, wenn FHEM das Icon beim Update verwirft.&lt;br /&gt;
*MinVolume und MaxVolume eingeführt. Damit kann nun der Lautstärkeregelbereich der ZonePlayer festgelegt werden&lt;br /&gt;
*Umlaute beim Übertragen in das Reading State werden wieder korrekt übertragen. Das Problem waren die etwaigen doppelten Anführungsstriche. Diese werden nun maskiert.&lt;br /&gt;
*Sonos Docks werden nun auch erkannt. Dieses hat eine andere Device-Struktur, weswegen der Erkennungsprozess angepasst werden musste.&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 04.02.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.7 &lt;br /&gt;
| &lt;br /&gt;
*Umlaute werden bei Playernamen beim Anlegen des Devices korrekt umgewandelt, und nicht in Unterstriche&lt;br /&gt;
*Renew-Subscription eingebaut, damit ein Player nicht die Verbindung zum Modul verliert&lt;br /&gt;
*CurrentTempPlaying wird nun auch sauber beim Abbrechen des Restore-Vorgangs zurückgesetzt&lt;br /&gt;
*Die Discovermechanik umgebaut, damit dieser Thread nach einem Discover nicht neu erzeugt werden muss.&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 30.01.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.6 &lt;br /&gt;
| &lt;br /&gt;
*Speak hinzugefügt (siehe Doku im Wiki)&lt;br /&gt;
*Korrektur von PlayURITemp für Dateien, für die Sonos keine Abspiellänge zur Verfügung stellt&lt;br /&gt;
*Korrektur des Thread-Problems welches unter *Nix-Varianten auftrat (Windows war nicht betroffen)&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 29.01.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.5 &lt;br /&gt;
| &lt;br /&gt;
*PlayURI, PlayURITemp und AddURIToQueue hinzugefügt (siehe Doku im Wiki)&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 28.01.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.4 &lt;br /&gt;
| &lt;br /&gt;
*Exception-Handling bei der Befehlsausführung soll FHEM besser vor verschwundenen Playern schützen &lt;br /&gt;
*Variable $SONOS_ThisThreadEnded sichert die korrekte Beendigung des vorhandenen Threads, trotz Discover-Events in der Pipeline&lt;br /&gt;
*Einrückungen im Code korrigiert&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 26.01.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.3 &lt;br /&gt;
| &lt;br /&gt;
*StopHandling prüft nun auch, ob die Referenz noch existiert&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 24.01.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.2 &lt;br /&gt;
| &lt;br /&gt;
*Proxy-Objekte werden beim Disappearen des Player entfernt, und sorgen bei einem nachfolgenden Aufruf für eine saubere Fehlermeldung&lt;br /&gt;
*Probleme mit Anführungszeichen &amp;quot; in Liedtiteln und Artist-Angaben. Diese Zeichen werden nun ersetzt&lt;br /&gt;
*Weblink wurde mit fehlendem &amp;quot;/&amp;quot; am Anfang angelegt. Dadurch hat dieser nicht im Floorplan funktionert&lt;br /&gt;
*pingType wird nun auf Korrektheit geprüft.&lt;br /&gt;
*Play:3 haben keinen Audio-Eingang, deshalb funktioniert das Holen eines Proxy dafür auch nicht. Jetzt ist das Holen abgesichert.&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 18.01.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.1 &lt;br /&gt;
| &lt;br /&gt;
*Ping-Methode einstellbar über Attribut &#039;pingType&#039;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 16.01.2013 &lt;br /&gt;
| style=&amp;quot;vertical-align:top;text-align:center&amp;quot; | 1.0 &lt;br /&gt;
| &lt;br /&gt;
*Initial Release&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modul &#039;&#039;&#039;SONOS&#039;&#039;&#039; ==&lt;br /&gt;
Dieses Modul erledigt die eigentliche Kommunikationsarbeit zu den ZonePlayern mittles UPnP. &lt;br /&gt;
Es startet (und läßt ihn dauerhaft laufen) einen Discovery Prozess, der alle ZonePlayer auffordert, sich zu melden, und reagiert auf entsprechende Signalisierungen.&lt;br /&gt;
Es instantiiert einen Listener und meldet diesen bei allen ZonePlayern für Abspielaktualisierungen an.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Aufruf des Discovery-Prozesses erfolgt, wird geprüft, ob der Player bereits definiert wurde. Wenn nicht, wird eine Definition erzeugt, wenn ja, dann wird die Komponente mit den neu erhaltenen Informationen aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Aufruf der Abspielaktualisierung erfolgt, so wird die entsprechene Zoneplayer-Komponente in FHEM mit den neu erhaltenen Informationen aktualisiert, und entsprechende FHEM-Events generiert.&lt;br /&gt;
&lt;br /&gt;
Wenn das Feature mit &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; verwendet wird, wird ein weiterer Listener beim entsprechenden Zoneplayer angemeldet. Mittels diesem werden Lautstärkenänderungen am Zoneplayer gemeldet umd können entsprechend umgehend korrigiert werden.&amp;lt;br &amp;gt;Als Nebeneffekt wird für jede Lautstärkenänderung auch ein Event in FHEM erzeugt (als Folge einer Aktualisierung des Readings &amp;lt;code&amp;gt;Volume&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Readings von SONOS ===&lt;br /&gt;
*&amp;lt;code&amp;gt;AllPlayer&amp;lt;/code&amp;gt;: Enthält alle Player.&lt;br /&gt;
*&amp;lt;code&amp;gt;AllPlayerCount&amp;lt;/code&amp;gt;: Enthält die Anzahl der Player in &amp;quot;AllPlayer&amp;quot;.&lt;br /&gt;
*&amp;lt;code&amp;gt;AllPlayerNotBonded&amp;lt;/code&amp;gt;: Enhtält alle Masterplayer, die nicht gebunden sind (also keine Stereo- oder Satellitenteilnehmer sind).&lt;br /&gt;
*&amp;lt;code&amp;gt;AllPlayerNotBondedCount&amp;lt;/code&amp;gt;: Enhtält die Anzahl der Player in &amp;quot;AllPlayerNotBonded&amp;quot;.&lt;br /&gt;
*&amp;lt;code&amp;gt;LastProcessAnswer&amp;lt;/code&amp;gt;: Enthält den letzten Zeitpunkt einer Datenübertragung vom SubProzess zum FHEM-Modul.&lt;br /&gt;
*&amp;lt;code&amp;gt;LastProcessRestart&amp;lt;/code&amp;gt;: Enthält (falls vorhanden) den Zeitpunkt des letzten Neustarts des SubProzesses.&lt;br /&gt;
*&amp;lt;code&amp;gt;LastProcessRestartCount&amp;lt;/code&amp;gt;: Enthält (falls vorhanden) die Anzahl der durchgeführten Neustarts des SubProzesses.&lt;br /&gt;
*&amp;lt;code&amp;gt;LineInPlayer&amp;lt;/code&amp;gt;: Enthält die gültigen LineIn-Eingänge aller Player, die für die Wiedergabe ausgewählt werden können als visualisiertes Perl-Array.&lt;br /&gt;
*&amp;lt;code&amp;gt;LineInPlayerList&amp;lt;/code&amp;gt;: Enthält die gültigen LineIn-Eingänge aller Player, die für die Wiedergabe ausgewählt werden können als &amp;quot;|&amp;quot;-separierte Liste von Devicenamen, wenn das Attribut &amp;quot;&amp;quot; am Sonos-Device angegeben ist.&lt;br /&gt;
*&amp;lt;code&amp;gt;LineInPlayerListAlias&amp;lt;/code&amp;gt;: Enthält die gültigen LineIn-Eingänge aller Player, die für die Wiedergabe ausgewählt werden können als &amp;quot;|&amp;quot;-separierte Liste von Raumnamen, wenn das Attribut &amp;quot;&amp;quot; am Sonos-Device angegeben ist.&lt;br /&gt;
*&amp;lt;code&amp;gt;MasterPlayer&amp;lt;/code&amp;gt;: Hier werden alle Masterplayer in einer per eval zu einem Array umwandelbaren Liste angegeben. z.B.: [&#039;Sonos_Kueche&#039;,&#039;Sonos_Flur&#039;]&lt;br /&gt;
*&amp;lt;code&amp;gt;MasterPlayerCount&amp;lt;/code&amp;gt;: Hier wird die Anzahl der erkannten Masterplayer angegeben. z.B.: 2&lt;br /&gt;
*&amp;lt;code&amp;gt;MasterPlayerNotPlaying&amp;lt;/code&amp;gt;: Hier werden alle Masterplayer in einer per eval zu einem Array umwandelbaren Liste angegeben, die gerade keine laufende Wiedergabe haben. z.B.: [&#039;Sonos_Kueche&#039;]&lt;br /&gt;
*&amp;lt;code&amp;gt;MasterPlayerNotPlayingCount&amp;lt;/code&amp;gt;: Hier wird die Anzahl der nicht abspielenden Masterplayer angegeben. z.B.: 1&lt;br /&gt;
*&amp;lt;code&amp;gt;MasterPlayerPlaying&amp;lt;/code&amp;gt;: Hier werden alle Masterplayer in einer per eval zu einem Array umwandelbaren Liste angegeben, die gerade eine laufende Wiedergabe haben. z.B.: [&#039;Sonos_Flur&#039;]&lt;br /&gt;
*&amp;lt;code&amp;gt;MasterPlayerPlayingCount&amp;lt;/code&amp;gt;: Hier wird die Anzahl der abspielenden Masterplayer angegeben. z.B.: 1&lt;br /&gt;
*&amp;lt;code&amp;gt;QueueHash&amp;lt;/code&amp;gt;: Der Hash-Wert für die aktuelle Abspielliste. Dieser wird bei jeder Änderung der aktuellen Abspielliste aktualisiert.&lt;br /&gt;
*&amp;lt;code&amp;gt;ShareIndexInProgress&amp;lt;/code&amp;gt;: Gibt an, ob gerade eine Aktualisierung des Indexes der Freigaben erfolgt.&lt;br /&gt;
*&amp;lt;code&amp;gt;UserId_Napster&amp;lt;/code&amp;gt;: Speichert die UserId für den Napster-Zugriff. Diese Information ist notwendig, wenn eine M3U-Datei mit Napster-Titeln importiert werden soll, und wird automatisch ermittelt, sobald man mit dem Original-Controller einen einzelnen Titel aus Napster in die aktuelle Abspielliste überträgt.&lt;br /&gt;
*&amp;lt;code&amp;gt;UserId_Spotify&amp;lt;/code&amp;gt;: Speichert die UserId für den Spotify-Zugriff. Diese Information ist notwendig, wenn eine M3U-Datei mit Spotify-Titeln importiert werden soll, und wird automatisch ermittelt, sobald man mit dem Original-Controller einen einzelnen Titel aus Spotify in die aktuelle Abspielliste überträgt.&lt;br /&gt;
*&amp;lt;code&amp;gt;ZoneGroupState&amp;lt;/code&amp;gt;: Die Konfigurationsinformationen zu der aktuellen Gruppenlandschaft der Zoneplayer. Der Befehl &amp;lt;code&amp;gt;get SONOS Groups&amp;lt;/code&amp;gt; vereinfacht den Zugriff hierauf, indem es eine einfach les- und verarbeitbare Liste erzeugt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Attribute von SONOS ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;&amp;lt;br /&amp;gt;Die Attribute werden (bis auf &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt;) erst bei einem Neustart von FHEM verwendet, da diese dem SubProzess initial zur Verfügung gestellt werden müssen.&lt;br /&gt;
&lt;br /&gt;
*Grundsätzliches&lt;br /&gt;
**&amp;lt;code&amp;gt;coverLoadTimeout(0..10,15,20,25,30)&amp;lt;/code&amp;gt;: Definiert den Timeout der für die Abfrage des Covers beim Sonosplayer verwendet wird. Wenn nicht angegeben, dann wird 5 verwendet.&lt;br /&gt;
**&amp;lt;code&amp;gt;deviceRoomView(Both,DeviceLineOnly)&amp;lt;/code&amp;gt;: Gibt an, was in der Raumansicht zum Sonosplayer-Device angezeigt werden soll. &amp;lt;code&amp;gt;Both&amp;lt;/code&amp;gt; bedeutet &amp;quot;normale&amp;quot; Devicezeile zzgl. Cover-/Titelanzeige und u.U. Steuerbereich, &amp;lt;code&amp;gt;DeviceLineOnly&amp;lt;/code&amp;gt; bedeutet nur die Anzeige der &amp;quot;normalen&amp;quot; Devicezeile.&lt;br /&gt;
**&amp;lt;code&amp;gt;disable(0,1)&amp;lt;/code&amp;gt;: Hiermit kann das Modul abgeschaltet werden. Wirkt sofort. Bei 1 wird der SubProzess beendet, und somit keine weitere Verarbeitung durchgeführt. Bei 0 wird der Prozess wieder gestartet.&amp;lt;br /&amp;gt;Damit kann das Modul temporär abgeschaltet werden, um bei der Neueinrichtung von Sonos-Komponenten keine halben Zustände mitzubekommen.&amp;lt;br /&amp;gt;Des Weiteren kann man damit Attribut-Änderungen an den SubProzess weiterreichen, da ja ein neuer Prozess gestartet wird, dem natürlich zu Beginn wieder alle verfügbaren/notwendigen Attribute zur Verfügung gestellt werden.&lt;br /&gt;
**&amp;lt;code&amp;gt;getFavouritesListAtNewVersion(0,1)&amp;lt;/code&amp;gt;: Mit diesem Attribut kann das Modul aufgefordert werden, die Favoriten (bei definiertem Attribut &amp;lt;code&amp;gt;getListsDirectlyToReadings&amp;lt;/code&amp;gt;) bei Aktualisierung automatisch herunterzuladen.&lt;br /&gt;
**&amp;lt;code&amp;gt;getPlaylistsListAtNewVersion(0,1)&amp;lt;/code&amp;gt;: Mit diesem Attribut kann das Modul aufgefordert werden, die Playlisten (bei definiertem Attribut &amp;lt;code&amp;gt;getListsDirectlyToReadings&amp;lt;/code&amp;gt;) bei Aktualisierung automatisch herunterzuladen.&lt;br /&gt;
**&amp;lt;code&amp;gt;getQueueListAtNewVersion &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;: Mit diesem Attribut kann das Modul aufgefordert werden, die aktuelle Abspielliste (bei definiertem Attribut &amp;lt;code&amp;gt;getListsDirectlyToReadings&amp;lt;/code&amp;gt;) bei Aktualisierung automatisch herunterzuladen.&lt;br /&gt;
**&amp;lt;code&amp;gt;getRadiosListAtNewVersion &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;: Mit diesem Attribut kann das Modul aufgefordert werden, die Radioliste (bei definiertem Attribut &amp;lt;code&amp;gt;getListsDirectlyToReadings&amp;lt;/code&amp;gt;) bei Aktualisierung automatisch herunterzuladen.&lt;br /&gt;
**&amp;lt;code&amp;gt;getListsDirectlyToReadings(0,1)&amp;lt;/code&amp;gt;: Mit diesem Attribut kann das Modul aufgefordert werden, die Listen für Favoriten, Playlists, Radios und Queue direkt in die entsprechenden Readings zu schreiben. Dafür sind dann keine Userreadings mehr notwendig.&lt;br /&gt;
**&amp;lt;code&amp;gt;getLocalCoverArt(0,1)&amp;lt;/code&amp;gt;: Mit diesem Attribut kann das Modul aufgefordert werden, die Cover lokal herunterzuladen (bisheriges Standardverhalten).&lt;br /&gt;
**&amp;lt;code&amp;gt;ignoredIPs&amp;lt;/code&amp;gt;: Mit diesem Attribut können IP-Adressen angegeben werden, die vom UPnP-System ignoriert werden sollen. Z.B.: &#039;&#039;&#039;192.168.0.11,192.168.0.37&#039;&#039;&#039;. Es sind auch reguläre Ausdrücke pro Element zulässig. Diese dürfen nur keine Kommata oder Doppelpunkte enthalten. Z.B: &#039;&#039;&#039;/192.168.0.(1|2|3)/,/192.168.1.\d*/&#039;&#039;&#039;. Alle Meldungen und Benachrichtigungen von den angegebenen IP-Adressen werden ignoriert.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Dieses Attribut kann hilfreich sein, wenn sich falsche UPnP-Devices melden, obwohl nur Sonos-Devices angefragt waren. Manchmal passiert das mit irgendwelchen NAS oder sonstigen Serverdevices.&amp;lt;br /&amp;gt;Folgende Meldungen (z.B.) sind ein Indiz auf falsche Devices: &amp;lt;code&amp;gt;Loading device description failed with error: 500 Can&#039;t connect to 192.168.2.29:2869 (timeout) at ./FHEM/00_SONOS.pm line xx thread 1&amp;lt;/code&amp;gt;, wenn die angegebene IP-Adresse gar kein Sonos-Devices ist.&lt;br /&gt;
**&amp;lt;code&amp;gt;pingType(none,tcp,udp,icmp,syn)&amp;lt;/code&amp;gt;: Definiert die Art, wie der Alive-Check eines Zoneplayers erfolgen soll. Die Verfahren funktionieren unterschiedlich gut. Am Ressourcensparsamsten ist &#039;&#039;icmp&#039;&#039;, benötigt aber &amp;quot;&amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;&amp;quot;-Rechte. An zweiter Stelle ist &#039;&#039;syn&#039;&#039; zu empfehlen. Die anderen Verfahren melden manchmal fehlerhafte not alives. Einfach probieren. Mittels &#039;&#039;none&#039;&#039; kann dieser Mechanismus auch deaktiviert werden.&lt;br /&gt;
**&amp;lt;code&amp;gt;reusePort(0,1)&amp;lt;/code&amp;gt;: Eines von (0,1). Gibt an, ob die Portwiederwendung für SSDP aktiviert werden soll, oder nicht. Kann Restart-Probleme lösen. Wenn man diese Probleme nicht hat, sollte man das Attribut nicht setzen.&lt;br /&gt;
**&amp;lt;code&amp;gt;SubProcessLogfileName &amp;lt;Pfad&amp;gt;&amp;lt;/code&amp;gt;: Hiermit kann für den SubProzess eine eigene Logdatei angegeben werden. Unter Windows z.B. überschreiben sich die beiden Logausgaben (von Fhem und SubProzess) sonst gegenseitig. Wenn &amp;quot;-&amp;quot; angegeben wird, wird wie bisher auf STDOUT (und damit im Fhem-Log) geloggt. Der Hauptanwendungsfall ist die mehr oder weniger kurzfristige Fehlersuche. Es werden keinerlei Variablenwerte ersetzt, und der Wert direkt als Dateiname verwendet.&lt;br /&gt;
**&amp;lt;code&amp;gt;usedonlyIPs &amp;lt;IP-Adresse&amp;gt;[,IP-Adresse]&amp;lt;/code&amp;gt;: Mit diesem Attribut können IP-Adressen angegeben werden, die ausschließlich vom UPnP-System berücksichtigt werden sollen. Z.B.: &amp;quot;192.168.0.11,192.168.0.37&amp;quot;. Es sind auch reguläre Ausdrücke pro Element zulässig. Diese dürfen nur keine Kommata oder Doppelpunkte enthalten. Z.B: &#039;&#039;&#039;/192.168.0.(1|2|3)/,/192.168.1.\d*/&#039;&#039;&#039;.&lt;br /&gt;
*Bookmark-Einstellungen&amp;lt;br /&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Die Konfiguration der Bookmarks wird erst bei einem Neustart des SubProzesses (also durch einen FHEM-Neustart (vorher Speichern nicht vergessen) oder dem Setzen/Zurücksetzen des Attributs &#039;&#039;&#039;disable&#039;&#039;&#039; am Sonos-Device) berücksichtigt.&lt;br /&gt;
**&amp;lt;code&amp;gt;bookmarkSaveDir &amp;amp;lt;path&amp;amp;gt;&amp;lt;/code&amp;gt;: Das Verzeichnis, in dem die Dateien für die gespeicherten Bookmarks abgelegt werden sollen. Wenn nicht festgelegt, dann wird &amp;quot;.&amp;quot; verwendet.&lt;br /&gt;
**&amp;lt;code&amp;gt;bookmarkTitleDefinition &amp;amp;lt;Groupname&amp;amp;gt;:&amp;amp;lt;PlayerdeviceRegEx&amp;amp;gt;:&amp;amp;lt;TrackURIRegEx&amp;amp;gt;:&amp;amp;lt;MinTitleLength&amp;amp;gt;:&amp;amp;lt;RemainingLength&amp;amp;gt;:&amp;amp;lt;MaxAge&amp;amp;gt;:&amp;amp;lt;ReadOnly&amp;amp;gt; [...]&amp;lt;/code&amp;gt;: Die Definition für die Verwendung von Bookmarks für Titel.&lt;br /&gt;
**&amp;lt;code&amp;gt;bookmarkPlaylistDefinition &amp;amp;lt;Groupname&amp;amp;gt;:&amp;amp;lt;PlayerdeviceRegEx&amp;amp;gt;:&amp;amp;lt;MinListLength&amp;amp;gt;:&amp;amp;lt;MaxListLength&amp;amp;gt;:&amp;amp;lt;MaxAge&amp;amp;gt; [...]&amp;lt;/code&amp;gt;: Die Definition für die Verwendung von Bookmarks für aktuelle Abspiellisten/Playlisten.&lt;br /&gt;
*Proxy-Einstellungen&lt;br /&gt;
**&amp;lt;code&amp;gt;generateProxyAlbumArtURLs(0,1)&amp;lt;/code&amp;gt;: Wenn aktiviert, werden alle Cover-Links als Proxy-Aufrufe an FHEM generiert. Dieser Proxy-Server wird vom Sonos-Modul bereitgestellt. In der Grundeinstellung erfolgt kein Caching der Cover, sondern nur eine Durchreichung der Cover von den Sonosplayern (Damit ist der Zugriff durch einen externen Proxyserver auf FHEM möglich).&lt;br /&gt;
**&amp;lt;code&amp;gt;proxyCacheDir&amp;lt;/code&amp;gt;: Hiermit wird das Verzeichnis festgelegt, in dem die Cover zwischengespeichert werden. Wenn nicht festgelegt, so wird &#039;&#039;&#039;/tmp&#039;&#039;&#039; verwendet.&lt;br /&gt;
**&amp;lt;code&amp;gt;proxyCacheTime&amp;lt;/code&amp;gt;: Mit einer Angabe ungleich 0 wird der Caching-Mechanismus des Sonos-Modul-Proxy-Servers aktiviert. Dabei werden Cover, die im Cache älter sind als diese Zeitangabe in Sekunden, neu vom Sonosplayer geladen, alle anderen direkt ausgeliefert, ohne den Player zu fragen.&lt;br /&gt;
**&amp;lt;code&amp;gt;webname &amp;lt;String&amp;gt;&amp;lt;/code&amp;gt;: Hiermit kann der zu verwendende Webname für die Cover-Link-Erzeugung angegeben werden. Da vom Modul Links zu Cover u.ä. erzeugt werden, ohne dass es einen FhemWeb-Aufruf dazu gibt, kann das Modul diesen Pfad nicht selber herausfinden. Wenn das Attribut nicht angegeben wird, dann wird &#039;fhem&#039; angenommen.&lt;br /&gt;
*{{Anker|Sprachattribute}}Sprachoptionen&lt;br /&gt;
**&amp;lt;code&amp;gt;targetSpeakDir&amp;lt;/code&amp;gt;: Das Verzeichnis, in dem dieses Modul die Sprachdateien von &amp;lt;code&amp;gt;Speak&amp;lt;/code&amp;gt; (siehe [[#Set-Befehle_an_den_SONOSPLAYER|Set-Befehle an den SONOSPLAYER]]) ablegen soll (also die Adresse für den &#039;&#039;&#039;Schreib&#039;&#039;&#039;zugriff). Es wird empfohlen, dass dieses Verzeichnis &#039;&#039;&#039;nicht&#039;&#039;&#039; von Sonos indiziert ist.&amp;lt;br /&amp;gt;z.B. Pfade unter *Nix: &amp;lt;code&amp;gt;/home/www/Sonos&amp;lt;/code&amp;gt; oder unter Windows: &amp;lt;code&amp;gt;C:\InetPub\Sonos&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;targetSpeakMP3FileConverter&amp;lt;/code&amp;gt;: Hiermit kann ein MP3-Konverter angegeben werden, der am Ende der Verkettung der Speak-Ansage das resultierende MP3-File nochmal sauber durchkodiert. Damit können Restzeitanzeigeprobleme behoben werden. Dadurch vegrößert sich allerdings u.U. die Ansageverzögerung.&amp;lt;br /&amp;gt;z.B. &amp;lt;code&amp;gt;/usr/bin/avconv -i %infile% %outfile%&amp;lt;/code&amp;gt;&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Der Platzhalter &#039;&#039;%infile%&#039;&#039; wird durch den Quelldateinamen ersetzt werden.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Der Platzhalter &#039;&#039;%outfile%&#039;&#039; wird durch den Zieldateinamen ersetzt werden.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Das Programm &#039;&#039;avconv&#039;&#039; kann unter Debian z.B. mittels &amp;lt;code&amp;gt;sudo apt-get install ffmpeg&amp;lt;/code&amp;gt; installiert werden.&lt;br /&gt;
**&amp;lt;code&amp;gt;targetSpeakMP3FileDir&amp;lt;/code&amp;gt;: Das Verzeichnis, welches als Standard für MP3-Fileangaben in Speak-Texten verwendet werden soll. Wird dieses Attribut definiert, können die Angaben bei Speak ohne Verzeichnis erfolgen.&amp;lt;br /&amp;gt;z.B. Pfade unter *Nix: &amp;lt;code&amp;gt;/home/www/Sonos&amp;lt;/code&amp;gt; oder unter Windows: &amp;lt;code&amp;gt;C:\InetPub\Sonos&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;targetSpeakURL&amp;lt;/code&amp;gt;: Die URL, unter der &#039;&#039;von außen&#039;&#039; (also aus Sicht des Zoneplayers) auf die abgelegte Sprachdatei zugegriffen werden kann (also die Adresse für den &#039;&#039;&#039;Lese&#039;&#039;&#039;zugriff). &amp;lt;br /&amp;gt;z.B. &amp;lt;code&amp;gt;\\192.168.178.45\Sonos&amp;lt;/code&amp;gt;&lt;br /&gt;
***&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Dabei muss darauf geachtet werden, dass als letztes Zeichen vor dem Zeilenumbruch kein Backslash steht (ist hier für den Pfad auch nicht notwendig). Dieser würde von FHEM als Maskierer für den folgenden Zeilenumbruch interpretiert werden, und die nächste Zeile wäre auch noch Bestandteil dieses Attributs (und damit des Pfades).&lt;br /&gt;
**&amp;lt;code&amp;gt;targetSpeakFileTimestamp(0,1)&amp;lt;/code&amp;gt;: Definiert, ob in dem Namen der Sprachausgabedatei ein Zeitstempel enthalten sein soll. Das sorgt dafür, dass alle Dateien beibehalten werden (da nicht mit demselben Namen überschrieben wird).&amp;lt;br /&amp;gt;Manchmal kann das auch Caching-Probleme beseitigen. In meinen Tests hat die Anzeige der in der Sprachdatei enthaltenen MP3-Tags nur mit dieser aktivierten Option sauber funktioniert, da der ZonePlayer bei mir die Tags gecached hält.&amp;lt;br /&amp;gt;Anderseits muss man sich dabei Gedanken über eine Aufräumstrategie machen, da die alten Dateien immer vorhanden bleiben.&lt;br /&gt;
**&amp;lt;code&amp;gt;targetSpeakFileHashCache(0,1)&amp;lt;/code&amp;gt;: Definiert, ob in dem Namen der Sprachausgabedatei ein Hash-Wert enthalten sein soll. Das sorgt dafür, dass die Dateien bei gleichem Text wiederverwendet werden und nicht neu generiert werden.&lt;br /&gt;
***Für diese Funktionalität wird das Perl-Modul &#039;&#039;&#039;Digest::SHA1&#039;&#039;&#039; für die Berechnung des Hash-Werts benötigt. Am einfachsten kann es bei Bedarf per CPAN installiert werden: &amp;lt;code&amp;gt;sudo cpan install Digest::SHA1&amp;lt;/code&amp;gt;.&lt;br /&gt;
**&amp;lt;code&amp;gt;Speak1&amp;lt;/code&amp;gt;: Hiermit kann ein Systemaufruf definiert werden, der zu Erzeugung einer Sprachausgabe verwendet werden kann. Sobald dieses Attribut definiert wurde, ist ein entsprechender Setter am Sonosplayer verfügbar.&amp;lt;br /&amp;gt;Das Format ist:&amp;lt;br /&amp;gt;&amp;lt;Ausgabedateiendung&amp;gt;:&amp;lt;Befehlszeile&amp;gt;&lt;br /&gt;
***Es dürfen folgende Platzhalter verwendet werden:&amp;lt;br /&amp;gt;&#039;&#039;&#039;%language%&#039;&#039;&#039;: Wird durch die eingegebene Sprache ersetzt&amp;lt;br /&amp;gt;&#039;&#039;&#039;%filename%&#039;&#039;&#039;: Wird durch den kompletten Dateinamen (inkl. Dateiendung) ersetzt.&amp;lt;br /&amp;gt;&#039;&#039;&#039;%text%&#039;&#039;&#039;: Wird durch den zu übersetzenden Text ersetzt.&amp;lt;br /&amp;gt;&#039;&#039;&#039;%textescaped%&#039;&#039;&#039;: Wird durch den URL-Enkodierten zu übersetzenden Text ersetzt.&amp;lt;br /&amp;gt;Zusätzliche Ersetzungen:&amp;lt;br /&amp;gt;&#039;&#039;&#039;%textutf8%&#039;&#039;&#039;: Wird durch den zu übersetzenden Text im UTF8-Format ersetzt.&amp;lt;br /&amp;gt;&#039;&#039;&#039;%textutf8escaped%&#039;&#039;&#039;: Wird durch den URL-Enkodierten zu übersetzenden Text im UTF8-Format ersetzt.&lt;br /&gt;
**&amp;lt;code&amp;gt;Speak2&amp;lt;/code&amp;gt;: Siehe Speak1&lt;br /&gt;
**&amp;lt;code&amp;gt;Speak3&amp;lt;/code&amp;gt;: Siehe Speak1&lt;br /&gt;
**&amp;lt;code&amp;gt;Speak4&amp;lt;/code&amp;gt;: Siehe Speak1&lt;br /&gt;
**&amp;lt;code&amp;gt;SpeakCover&amp;lt;/code&amp;gt;: Hiermit kann ein JPG- oder PNG-Bild als Cover für die Google-Sprachdurchsagen definiert werden.&lt;br /&gt;
**&amp;lt;code&amp;gt;Speak1Cover&amp;lt;/code&amp;gt;: Analog zu SpeakCover für Speak1.&lt;br /&gt;
**&amp;lt;code&amp;gt;Speak2Cover&amp;lt;/code&amp;gt;: Analog zu SpeakCover für Speak2.&lt;br /&gt;
**&amp;lt;code&amp;gt;Speak3Cover&amp;lt;/code&amp;gt;: Analog zu SpeakCover für Speak3.&lt;br /&gt;
**&amp;lt;code&amp;gt;Speak4Cover&amp;lt;/code&amp;gt;: Analog zu SpeakCover für Speak4.&lt;br /&gt;
**&amp;lt;code&amp;gt;SpeakGoogleURL &amp;lt;GoogleURL&amp;gt;&amp;lt;/code&amp;gt;: Die zu verwendende Google-URL. Wenn dieser Parameter nicht angegeben wird, dann wird ein Standard verwendet. Hier müssen Platzhalter für die Ersetzung durch das Modul eingetragen werden: %1$s -&amp;gt; Sprache, %2$s -&amp;gt; Text&lt;br /&gt;
***Die Standard-URL lautet momentan: &amp;lt;code&amp;gt;http://translate.google.com/translate_tts?tl=%1$s&amp;amp;client=tw-ob&amp;amp;q=%2$s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get-Befehle an SONOS ===&lt;br /&gt;
*Gruppenbefehle&lt;br /&gt;
**&amp;lt;code&amp;gt;Groups&amp;lt;/code&amp;gt;: Liefert die aktuelle Gruppierungskonfiguration der Sonos-Systemlandschaft zurück. Das Format ist eine Komma-getrennte Liste von Listen mit Devicenamen, also z.B. &amp;lt;code&amp;gt;[Sonos_Kueche], [Sonos_Wohnzimmer, Sonos_Schlafzimmer]&amp;lt;/code&amp;gt;. In diesem Beispiel sind also zwei Gruppen definiert, von denen die erste aus einem Player und die zweite aus Zwei Playern besteht. Dabei ist die Reihenfolge innerhalb der Unterlisten wichtig, da der erste Eintrag der sogenannte Gruppenkoordinator ist (in diesem Fall also &amp;lt;code&amp;gt;Sonos_Wohnzimmer&amp;lt;/code&amp;gt;), von dem die aktuelle Abspielliste und der aktuelle Titel auf die anderen Gruppenmitglieder übernommen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Set-Befehle an SONOS ===&lt;br /&gt;
*Grundsätzliches&lt;br /&gt;
**&amp;lt;code&amp;gt;RefreshShareIndex&amp;lt;/code&amp;gt;: Startet eine Aktualisierung des Indexes der Freigaben&lt;br /&gt;
**&amp;lt;code&amp;gt;RescanNetwork&amp;lt;/code&amp;gt;: Startet die Erkennung der im Netzwerk vorhandenen Player erneut.&lt;br /&gt;
*Steuerbefehle&lt;br /&gt;
**&amp;lt;code&amp;gt;Mute &amp;lt;State&amp;gt;&amp;lt;/code&amp;gt;: Setzt den Mute-Zustand bei allen Playern. Der Wert kann on oder off sein.&lt;br /&gt;
**&amp;lt;code&amp;gt;PauseAll&amp;lt;/code&amp;gt;: Pausiert die Wiedergabe in allen Zonen.&lt;br /&gt;
**&amp;lt;code&amp;gt;Pause&amp;lt;/code&amp;gt;: Synonym für PauseAll.&lt;br /&gt;
**&amp;lt;code&amp;gt;StopAll&amp;lt;/code&amp;gt;: Stoppt die Wiedergabe in allen Zonen.&lt;br /&gt;
**&amp;lt;code&amp;gt;Stop&amp;lt;/code&amp;gt;: Synonym für StopAll.&lt;br /&gt;
*Bookmark-Befehle&lt;br /&gt;
**&amp;lt;code&amp;gt;DisableBookmark &amp;amp;lt;Groupname&amp;amp;gt;&amp;lt;/code&amp;gt;: Deaktiviert die angegebene Gruppe.&lt;br /&gt;
**&amp;lt;code&amp;gt;EnableBookmark &amp;amp;lt;Groupname&amp;amp;gt;&amp;lt;/code&amp;gt;: Aktiviert die angegebene Gruppe.&lt;br /&gt;
**&amp;lt;code&amp;gt;LoadBookmarks [Groupname]&amp;lt;/code&amp;gt;: Lädt die angegebene Gruppe (oder alle Gruppen, wenn nicht angegeben) aus den entsprechenden Dateien.&lt;br /&gt;
**&amp;lt;code&amp;gt;SaveBookmarks [Groupname]&amp;lt;/code&amp;gt;: Speichert die angegebene Gruppe (oder alle Gruppen, wenn nicht angegeben) in die entsprechenden Dateien.&lt;br /&gt;
*Gruppenbefehle&lt;br /&gt;
**&amp;lt;code&amp;gt;Groups &amp;lt;Gruppendefinition&amp;gt;&amp;lt;/code&amp;gt;: Setzt die aktuelle Gruppierungskonfiguration der Sonos-Systemlandschaft. Das Format ist jenes, welches auch von dem Get-Befehl &#039;&#039;Groups&#039;&#039; geliefert wird.&amp;lt;br &amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Hier kann als Gruppendefinition das Wort &#039;&#039;Reset&#039;&#039; verwendet werden, um alle Player aus ihren Gruppen zu entfernen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modul &#039;&#039;&#039;SONOSPLAYER&#039;&#039;&#039; ==&lt;br /&gt;
Dieses Modul dient im großen und ganzen als Platzhalter für FHEM, damit der Anwender FHEM-Konform informiert werden, bzw. steuern kann.&lt;br /&gt;
&lt;br /&gt;
Hier werden die Informationen, die vom &#039;&#039;&#039;SONOS&#039;&#039;&#039;-Modul erkannt werden, abgelegt, und die Aktualisierungs-Events erzeugt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Readings von SONOSPLAYER ===&lt;br /&gt;
Folgende Informationen werden im SONOSPLAYER als Reading abgelegt:&lt;br /&gt;
*Systemzustand&lt;br /&gt;
**&amp;lt;code&amp;gt;AlarmList&amp;lt;/code&amp;gt;: Enthält die textuelle Repräsentation des Hashs mit den aktuell für diesen Player gültigen Alarminformationen. Diese Information wird automatisch aktualisiert, wenn das Attribut &#039;&#039;&#039;getAlarms&#039;&#039;&#039; auf &#039;&#039;1&#039;&#039; gesetzt wurde, ansonsten steht sie nicht zur Verfügung (und es kann kein Alarm angelegt, verändert und gelöscht werden). Das Format des Hashs entspricht dem, das zum Setzen oder Anpassen eines Alarms notwendig ist.&amp;lt;br /&amp;gt;Folgene Schlüssel sind dort zulässig/notwendig:&lt;br /&gt;
***&#039;&#039;&#039;Enabled(0,1)&#039;&#039;&#039;: Gibt an, ob der Alarm aktiviert ist.&lt;br /&gt;
***&#039;&#039;&#039;Volume(0..100)&#039;&#039;&#039;: Die Lautstärke, mit der der Alarm wiedergegeben werden soll.&lt;br /&gt;
***&#039;&#039;&#039;StartTime(Timstamp)&#039;&#039;&#039;: Die Uhrzeit, zu der der Alarm starten soll.&lt;br /&gt;
***&#039;&#039;&#039;Duration(Timstamp)&#039;&#039;&#039;: Die Dauer, die der Alarm laufen soll.&lt;br /&gt;
***&#039;&#039;&#039;Repeat(0,1)&#039;&#039;&#039;: Gibt an, ob die Wiedergabe wiederholt werden soll.&lt;br /&gt;
***&#039;&#039;&#039;Shuffle(0,1)&#039;&#039;&#039;: Gibt an, ob die Wiedergabe zufällig erfolgen soll.&lt;br /&gt;
***&#039;&#039;&#039;RoomUUID&#039;&#039;&#039;: Die ID der Zone, in der der Alarm wiedergegeben werden soll. Dieser Wert muss nie mit angegeben werden, da er automatisch befüllt wird (Diese Information ist durch das verwendete FHEM-Zoneplayer-Device klar).&lt;br /&gt;
***&#039;&#039;&#039;ProgramURI&#039;&#039;&#039;: Die abzuspielende URI.&lt;br /&gt;
***&#039;&#039;&#039;ProgramMetaData&#039;&#039;&#039;: Die Metadaten zu der abzuspielenden URI.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Once(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm nur einmal laufen soll. Wenn hier eine &#039;&#039;1&#039;&#039; angegeben wurde, dann werden die anderen &#039;&#039;Recurrence&#039;&#039;-Angaben ignoriert.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Monday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Montag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Tuesday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Dienstag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Wednesday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Mittwoch laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Thursday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Donnerstag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Friday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Freitag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Saturday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Samstag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Sunday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Sonntag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;IncludeLinkedZones(0,1)&#039;&#039;&#039;: Gibt an, ob die aktuell verlinkten Zonen diesen Alarm ebenfall abspielen sollen.&lt;br /&gt;
***&#039;&#039;&#039;Beispiel-Hash&#039;&#039;&#039;: { Enabled =&amp;gt; 1, Volume =&amp;gt; 12, StartTime =&amp;gt; &#039;16:00:00&#039;, Duration =&amp;gt; &#039;00:15:00&#039;, Repeat =&amp;gt; 0, Shuffle =&amp;gt; 0, ProgramURI =&amp;gt; &#039;x-rincon-buzzer:0&#039;, ProgramMetaData =&amp;gt; &#039; &#039;, Recurrence_Once =&amp;gt; 0, Recurrence_Monday =&amp;gt; 1, Recurrence_Tuesday =&amp;gt; 1, Recurrence_Wednesday =&amp;gt; 1, Recurrence_Thursday =&amp;gt; 1, Recurrence_Friday =&amp;gt; 1, Recurrence_Saturday =&amp;gt; 0, Recurrence_Sunday =&amp;gt; 0, IncludeLinkedZones =&amp;gt; 0 }&lt;br /&gt;
**&amp;lt;code&amp;gt;AlarmListIDs&amp;lt;/code&amp;gt;: Enthält die Hash-Schlüssel der Alarme als kommaseparierte Liste. Dieses Reading gibt es Hauptsächlich zur Vereinfachung des Zugriffs auf das Reading &#039;&#039;&#039;AlarmList&#039;&#039;&#039;. Damit hat man direkt die Anzahl und Primärschlüssel im Zugriff.&lt;br /&gt;
**&amp;lt;code&amp;gt;AlarmListVersion&amp;lt;/code&amp;gt;: Dieses Reading enthält die Information über die aktuelle Version der gespeicherten Alarm-Informationen. Diese Information wird Hauptsächlich intern benötigt, um beurteilen zu können, ob die Alarminformationen neu geladen werden müssen.&lt;br /&gt;
**&amp;lt;code&amp;gt;AudioDelay&amp;lt;/code&amp;gt;: Gibt das AudioDelay des Players an. Der Wert kann zwischen 0 und 5 liegen.&lt;br /&gt;
**&amp;lt;code&amp;gt;AudioDelayLeftRear&amp;lt;/code&amp;gt;: Gibt den AudioDelayLeftRear des Players an. Der Wert kann zwischen 0 und 2 liegen. Wobei die Werte folgende Bedeutung haben: 0: &amp;gt;3m, 1: &amp;gt;0.6m und &amp;lt;3m, 2: &amp;lt;0.6m&lt;br /&gt;
**&amp;lt;code&amp;gt;AudioDelayRightRear&amp;lt;/code&amp;gt;: Gibt den AudioDelayRightRear des Players an. Der Wert kann zwischen 0 und 2 liegen. Wobei die Werte folgende Bedeutung haben: 0: &amp;gt;3m, 1: &amp;gt;0.6m und &amp;lt;3m, 2: &amp;lt;0.6m&lt;br /&gt;
**&amp;lt;code&amp;gt;ButtonState&amp;lt;/code&amp;gt;: Gibt den Zustand des Buttons an.&lt;br /&gt;
**&amp;lt;code&amp;gt;ButtonLockState&amp;lt;/code&amp;gt;: Gibt den Sperr-Zustand des Buttons an.&lt;br /&gt;
**&amp;lt;code&amp;gt;DailyIndexRefreshTime&amp;lt;/code&amp;gt;: Enthält die aktuell gültige &#039;&#039;DailyIndexRefreshTime&#039;&#039;, zu der der Medienindex neu aufgebaut werden soll. &amp;lt;br /&amp;gt;Diese Information wird automatisch aktualisiert, wenn sie bei einem Player verändert wird, wenn das Attribut &#039;&#039;&#039;getAlarms&#039;&#039;&#039; des Player auf &#039;&#039;1&#039;&#039; gesetzt wurde.&lt;br /&gt;
**&amp;lt;code&amp;gt;DialogLevel&amp;lt;/code&amp;gt;: Gibt den Zustand der Sprachverbesserung an der Playbar an.&lt;br /&gt;
**&amp;lt;code&amp;gt;FavouritesVersion&amp;lt;/code&amp;gt;: Dieses Reading enthält die Information über die aktuelle Version der gespeicherten Favoriten. Eine Änderung dieses Readings wird durch eine Anpassung der Favoriten (z.B. durch einen Controller) ausgelöst.&lt;br /&gt;
**&amp;lt;code&amp;gt;fieldType&amp;lt;/code&amp;gt;: In einer Paarung wird jedem Player vom Sonos-System ein eindeutiger FieldType zugewiesen. Dieser wird von diesem Modul für die Eindeutigkeit des Device-Namen verwendet. Bei einer Stereopaarung z.B. hat ein Player den Type &#039;LF&#039; (für Left-Front), &#039;RF&#039; (für Right-Front) oder SW (für Subwoofer); bei Surround-Konfigurationen aber auch RR (für Right-Rear) oder LR (für Left-Rear).&lt;br /&gt;
**&amp;lt;code&amp;gt;HeadphoneConnected&amp;lt;/code&amp;gt;: Enthält, wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; (oder auch &amp;lt;code&amp;gt;minVolumeHeadphone&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;maxVolumeHeadphone&amp;lt;/code&amp;gt;) gesetzt wurde, den Zustand, ob ein Kopfhörer verwendet wird, oder nicht. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung dieses Zustands auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;LastActionResult&amp;lt;/code&amp;gt;: Enthält den Namen und das Ergebnis der letzten Aktion auf dem Player. Da die Aktionen asyncron übertragen werden, kann nur hier kontrolliert werden, ob das gewünschte Ergebnis erreicht wurde.&lt;br /&gt;
**&amp;lt;code&amp;gt;LineInConnected&amp;lt;/code&amp;gt;: Gibt an, ob der Line-In-Eingang angeschlossen ist, oder nicht. Wird bei Änderung am Player automatisch aktualisiert, und erzeugt damit auch ein Event.&lt;br /&gt;
**&amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt;: URL zum Informationsdokument des ZonePlayers&lt;br /&gt;
**&amp;lt;code&amp;gt;NightMode&amp;lt;/code&amp;gt;: Gibt den Zustand des Nachtsounds an der Playbar an.&lt;br /&gt;
**&amp;lt;code&amp;gt;Orientation&amp;lt;/code&amp;gt;: Gibt die Lage des Players an.&lt;br /&gt;
**&amp;lt;code&amp;gt;playerType&amp;lt;/code&amp;gt;: Typbezeichnung des ZonePlayer. z.B. &amp;quot;ZP90&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;PlaylistsVersion&amp;lt;/code&amp;gt;: Dieses Reading enthält die Information über die aktuelle Version der gespeicherten Playlists. Eine Änderung dieses Readings wird durch eine Anpassung der Playlists (z.B. durch einen Controller) ausgelöst.&lt;br /&gt;
**&amp;lt;code&amp;gt;presence&amp;lt;/code&amp;gt;: Erreichbarkeit des Players. Kann &amp;quot;appeared&amp;quot; oder &amp;quot;disappeared&amp;quot; sein&lt;br /&gt;
**&amp;lt;code&amp;gt;RadiosVersion&amp;lt;/code&amp;gt;: Dieses Reading enthält die Information über die aktuelle Version der gespeicherten Radiofavoriten. Eine Änderung dieses Readings wird durch eine Anpassung der Radios (z.B. durch einen Controller) ausgelöst.&lt;br /&gt;
**&amp;lt;code&amp;gt;roomName&amp;lt;/code&amp;gt;: Originalname des ZonePlayers. Kann Leer- oder Sonderzeichen enthalten&lt;br /&gt;
**&amp;lt;code&amp;gt;roomNameAlias&amp;lt;/code&amp;gt;: Originalname des ZonePlayers mit einem angehangenen Funktionsnamen, wie er für das Attribut &amp;quot;alias&amp;quot; verwendet werden würde (z.B. &amp;quot;Wohnzimmer - Rechts&amp;quot;). Wird zur Laufzeit aktualisiert. Kann Leer- oder Sonderzeichen enthalten&lt;br /&gt;
**&amp;lt;code&amp;gt;saveRoomName&amp;lt;/code&amp;gt;: Sicherer Name des Zoneplayer. Sonderzeichen wurden in Unterstriche umgewandelt. Das Device wird beim Anlegen mit diesem Namen angelegt&lt;br /&gt;
**&amp;lt;code&amp;gt;serialNum&amp;lt;/code&amp;gt;: Seriennummer des ZonePlayers. Entspricht weitestgehend der MAC-Adresse. z.B. &amp;quot;00-0E-58-28-D0-F4:2&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;softwareRevision&amp;lt;/code&amp;gt;: Version der installierten Software. z.B. &amp;quot;8.4&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;softwareRevisionAvailable&amp;lt;/code&amp;gt;: Version der verfügbaren Software. z.B. &amp;quot;8.5&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;softwareRevisionInternal&amp;lt;/code&amp;gt;: Interne Version der installierten Software. z.B. &amp;quot;41.3-50131&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;softwareRevisionInternalAvailable&amp;lt;/code&amp;gt;: Interne Version der verfügbaren Software. z.B. &amp;quot;42.2-51240&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;SubEnable&amp;lt;/code&amp;gt;: Gibt den Zustand des Sub-Zustands für diesen Player an.&lt;br /&gt;
**&amp;lt;code&amp;gt;SubGain&amp;lt;/code&amp;gt;: Gibt den SubGain für diesen Player an. Der Wert kann zwischen -15 und 15 liegen.&lt;br /&gt;
**&amp;lt;code&amp;gt;SubPolarity&amp;lt;/code&amp;gt; Gibt den SubPolarity für diesen Player an. Der Wert kann zwischen 0 und 2 liegen.&lt;br /&gt;
**&amp;lt;code&amp;gt;SurroundEnable&amp;lt;/code&amp;gt;: Gibt an, ob für diesen Player die Surround-Wiedergabe aktiviert wurde, oder nicht.&lt;br /&gt;
**&amp;lt;code&amp;gt;SurroundLevel&amp;lt;/code&amp;gt;: Gibt den Surroundlevel für diesen Player an. Der Wert kann zwischen -15 und 15 sein.&lt;br /&gt;
**&amp;lt;code&amp;gt;TruePlay&amp;lt;/code&amp;gt;: Gibt an, ob für diesen Player die TruePlay-Wiedergabe aktiviert ist, oder nicht.&lt;br /&gt;
**&amp;lt;code&amp;gt;WifiEnabled&amp;lt;/code&amp;gt;: Gibt an, ob für diesen Player Wifi aktiviert ist, oder nicht.&lt;br /&gt;
**&amp;lt;code&amp;gt;WirelessMode&amp;lt;/code&amp;gt;: Gibt den Wirelessmode des Players an.&lt;br /&gt;
*Gruppierungsinformationen&lt;br /&gt;
**&amp;lt;code&amp;gt;AvailablePlayerList&amp;lt;/code&amp;gt;: Wird gesetzt, wenn das Attribut &amp;quot;getListsDirectlyToReadings&amp;quot; am Sonos-Device gesetzt wurde. Es enthält die anderen und noch verfügbaren und nicht gebundenen Player-Devicenamen. Das ist die Grundlage für eine Player-zur-Abspielgruppe-hinzufügen-Funktion als Listendarstellung.&lt;br /&gt;
**&amp;lt;code&amp;gt;AvailablePlayerListAlias&amp;lt;/code&amp;gt;: Wird gesetzt, wenn das Attribut &amp;quot;getListsDirectlyToReadings&amp;quot; am Sonos-Device gesetzt wurde. Es enthält die anderen und noch verfügbaren und nicht gebundenen Player-Raumnamen. Das ist die Grundlage für eine Player-zur-Abspielgruppe-hinzufügen-Funktion als Listendarstellung.&lt;br /&gt;
**&amp;lt;code&amp;gt;IsBonded&amp;lt;/code&amp;gt;: Gibt an, ob der Player in einer Bindung zum Masterplayer steht (anstatt ein einfaches Gruppenmitglied zu sein). Gebundene Player sind z.B. der rechte Player im Stereoverbund, sowie die Satellitenplayer in einem 5.1er Surroundsystem (also Subwoofer, hintere Lautsprecher und vordere Lautsprecher).&lt;br /&gt;
**&amp;lt;code&amp;gt;IsMaster&amp;lt;/code&amp;gt;: Gibt an, ob dieser Player aktuell ein Masterplayer einer Gruppe ist. Dabei kann die Gruppe auch nur einen Teilnehmer haben (wieder dieser Player).&amp;lt;br /&amp;gt;Damit kann ermittelt werden, welche Player korrekte Abspielinformationen darstellen können.&lt;br /&gt;
**&amp;lt;code&amp;gt;IsZoneBridge&amp;lt;/code&amp;gt;: Gibt an, ob dieser Player eine Bridge ist.&lt;br /&gt;
**&amp;lt;code&amp;gt;MasterPlayer&amp;lt;/code&amp;gt;: Gibt den FHEM-Devicenamen des Masterplayers zu diesem Player an. Wenn dieser Player alleine eine Gruppe darstellt, dann steht in diesem Reading der FHEM-Devicenamen dieses Players.&lt;br /&gt;
**&amp;lt;code&amp;gt;SlavePlayer&amp;lt;/code&amp;gt;: Gibt eine per &#039;&#039;&#039;eval&#039;&#039;&#039; umwandelbare Liste von FHEM-Devicenamen der zu diesem Masterplayer gehörenden Slaveplayer an. Diese Liste kann auch leer sein, wenn dieser Player kein Masterplayer ist, oder die Gruppe nur aus einem Mitglied besteht.&lt;br /&gt;
**&amp;lt;code&amp;gt;SlavePlayerNotBonded&amp;lt;/code&amp;gt;: Enthält alle SlavePlayer, die nicht gebunden sind als visualisiertes Perl-Array.&lt;br /&gt;
**&amp;lt;code&amp;gt;SlavePlayerNotBondedList&amp;lt;/code&amp;gt;: Enthält alle SlavePlayer, die nicht gebunden sind als &amp;quot;|&amp;quot;-separierte Liste der Devicenamen.&lt;br /&gt;
**&amp;lt;code&amp;gt;SlavePlayerNotBondedListAlias&amp;lt;/code&amp;gt;: Enthält alle SlavePlayer, die nicht gebunden sind als &amp;quot;|&amp;quot;-separierte Liste der Raumnnamen.&lt;br /&gt;
**&amp;lt;code&amp;gt;ZoneGroupID&amp;lt;/code&amp;gt;: Die ID des Gruppenkoordinators plus eine laufende Nummer. Sollte die Gruppe nur aus einem Mitglied bestehen, so ist es die eigene ID (=UDN).&lt;br /&gt;
**&amp;lt;code&amp;gt;ZoneGroupName&amp;lt;/code&amp;gt;: Der Name der aktuellen Gruppe&lt;br /&gt;
**&amp;lt;code&amp;gt;ZoneGroupNameDetails&amp;lt;/code&amp;gt;: Enthält die Slavezonen als textuelle Auflistung mittels &#039;+&#039;. Ist leer, wenn es keine Slaveplayer gibt. Enthält den Namen des Gruppenmasters, wenn es einen solchen gibt.&lt;br /&gt;
**&amp;lt;code&amp;gt;ZonePlayerUUIDsInGroup&amp;lt;/code&amp;gt;: Eine Liste der in der aktuellen Gruppe befindlichen Zoneplayer.&lt;br /&gt;
*Abspielzustand&lt;br /&gt;
**&amp;lt;code&amp;gt;AlarmRunning&amp;lt;/code&amp;gt;: Dieses Reading enthält &#039;&#039;1&#039;&#039;, wenn gerade ein Alarm abgespielt wird, sonst &#039;&#039;0&#039;&#039;&lt;br /&gt;
**&amp;lt;code&amp;gt;AlarmRunningID&amp;lt;/code&amp;gt;: Dieses Reading enthält die ID des verursachenden Alarms, wenn gerade ein Alarm abgespielt wird, sonst ist es leer.&lt;br /&gt;
**&amp;lt;code&amp;gt;Balance&amp;lt;/code&amp;gt;: Enthält im Normalfall die am Player eingestellte Balance zum Zeitpunkt der Erkennung. Wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; gesetzt wurde, wird diese Balance bei jeder Änderung am Player mit aktualisiert. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung der Balance auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;Bass&amp;lt;/code&amp;gt;: Enthält im Normalfall den am Player eingestellten Basslevel zum Zeitpunkt der Erkennung. Wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; gesetzt wurde, wird dieser Basslevel bei jeder Änderung am Player mit aktualisiert. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung des Basslevels auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;CrossfadeMode&amp;lt;/code&amp;gt;: Enthält den aktuellen Zustand von CrossfadeMode. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation).&lt;br /&gt;
**&amp;lt;code&amp;gt;GroupMute&amp;lt;/code&amp;gt;: Enthält den GroupMute-Zustand. Wird automatisch aktualisiert.&lt;br /&gt;
**&amp;lt;code&amp;gt;GroupVolume&amp;lt;/code&amp;gt;: Enthält den GroupVolume-Zustand. Wird automatisch aktualisiert.&lt;br /&gt;
**&amp;lt;code&amp;gt;GroupVolumeD&amp;lt;/code&amp;gt;: Verringert die aktuelle Gruppenlautstärke um volumeStep-Einheiten.&lt;br /&gt;
**&amp;lt;code&amp;gt;GroupVolumeU&amp;lt;/code&amp;gt;: Erhöht die aktuelle Gruppenlautstärke um volumeStep-Einheiten.&lt;br /&gt;
**&amp;lt;code&amp;gt;Loudness&amp;lt;/code&amp;gt;: Enthält, wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; gesetzt wurde, den aktuellen Zustand des Loudness. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung des Loudness-Zustands auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;Mute&amp;lt;/code&amp;gt;: Enthält, wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; gesetzt wurde, den aktuellen Zustand des Mute. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung des Mute-Zustands auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;numberOfTracks&amp;lt;/code&amp;gt;: Anzahl der momentan in der Abspielliste befindlichen Titel&lt;br /&gt;
**&amp;lt;code&amp;gt;OutputFixed&amp;lt;/code&amp;gt;: Enthält, wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; gesetzt wurde, den aktuellen Zustand des OutputFixed. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung des OutputFixed-Zustands auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;QueueDuration&amp;lt;/code&amp;gt;: Enthält die Abspieldauer der aktuellen Abspielliste als Zeitangabe. &#039;&#039;Achtung!&#039;&#039;: Nicht jeder Titel wird mit Abspiellänge von Sonos geliefert, sodass dieser Wert auch ungenau sein kann.&lt;br /&gt;
**&amp;lt;code&amp;gt;QueueDurationSec&amp;lt;/code&amp;gt;: Enthält die Abspieldauer der aktuellen Abspielliste in Sekunden. &#039;&#039;Achtung!&#039;&#039;: Nicht jeder Titel wird mit Abspiellänge von Sonos geliefert, sodass dieser Wert auch ungenau sein kann.&lt;br /&gt;
**&amp;lt;code&amp;gt;QueueHash&amp;lt;/code&amp;gt;: Enthält den Hashwert der aktuellen Abspielliste. Dieser wird für die Bookmarkfunktionalität verwendet&lt;br /&gt;
**&amp;lt;code&amp;gt;Repeat&amp;lt;/code&amp;gt;: Enthält den aktuellen Zustand von Repeat. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation).&lt;br /&gt;
**&amp;lt;code&amp;gt;RepeatOne&amp;lt;/code&amp;gt;: Enthält den aktuellen Zustand von RepeatOne. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation).&lt;br /&gt;
**&amp;lt;code&amp;gt;Shuffle&amp;lt;/code&amp;gt;: Enthält den aktuellen Zustand von Shuffle. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation).&lt;br /&gt;
**&amp;lt;code&amp;gt;SleepTimer&amp;lt;/code&amp;gt;: Enthält die Restzeit des Sleeptimers. Diese Information wird vom Player beim Setzen und Ablaufen gemeldet, und erzeugt somit ein Event zu Beginn und Ende des Timers. Während der Timer läuft, wird hier nichts aktualisiert. Man muss also, falls benötigt, selber die verbleibende Restzeit mittels des Readings-Timestamps und diesem Wert ermitteln.&amp;lt;br /&amp;gt;Diese Information wird automatisch aktualisiert, wenn sie bei einem Player verändert wird.&amp;lt;br /&amp;gt;Beim Ablaufen des Timers wird vom Player eine Aktualisierung auf den Wert &#039;&#039;&#039;off&#039;&#039;&#039; gesendet. Darauf kann in einem Notify-Event geprüft werden.&lt;br /&gt;
**&amp;lt;code&amp;gt;SleepTimerVersion&amp;lt;/code&amp;gt;: Dieses Reading enthält die Information über die aktuelle Version der gespeicherten &#039;&#039;SleepTimer&#039;&#039;-Informationen. Diese Information wird Hauptsächlich intern benötigt, um beurteilen zu können, ob das Reading &#039;&#039;SleepTimer&#039;&#039; neu geladen werden muss.&lt;br /&gt;
**&amp;lt;code&amp;gt;transportState&amp;lt;/code&amp;gt;: Aktueller Abspielstatus. Kann &amp;quot;ERROR&amp;quot;, &amp;quot;STOPPED&amp;quot;, &amp;quot;PLAYING&amp;quot; oder &amp;quot;PAUSED_PLAYBACK&amp;quot; sein. Wobei ERROR heißt, dass es keine Verbindung zum Player gibt.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;: Bei Gruppen hat nur der Gruppenmaster den korrekten Abspielzustand. Alle Slaveplayer enthalten immer den Zustand &amp;quot;PLAYING&amp;quot;, da sie ja gerade den Masterplayer &amp;quot;abspielen&amp;quot;, und keine Information dazu haben, ob und was abgespielt wird.&lt;br /&gt;
**&amp;lt;code&amp;gt;Treble&amp;lt;/code&amp;gt;: Enthält im Normalfall den am Player eingestellten Treblelevel zum Zeitpunkt der Erkennung. Wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; gesetzt wurde, wird dieser Treblelevel bei jeder Änderung am Player mit aktualisiert. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung des Treblelevels auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;Volume&amp;lt;/code&amp;gt;: Enthält im Normalfall die am Player eingestellte Laustärke zum Zeitpunkt der Erkennung. Wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; gesetzt wurde, wird diese Lautstärke bei jeder Änderung am Player mit aktualisiert. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung der Lautstärke auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
*Infos zum aktuellen Titel&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTitle&amp;lt;/code&amp;gt;: Titelbezeichnung des aktuellen Titels&lt;br /&gt;
**&amp;lt;code&amp;gt;currentArtist&amp;lt;/code&amp;gt;: Interpret des aktuellen Titels&lt;br /&gt;
**&amp;lt;code&amp;gt;currentAlbum&amp;lt;/code&amp;gt;: Albumname des aktuellen Titel&lt;br /&gt;
**&amp;lt;code&amp;gt;currentAlbumArtist&amp;lt;/code&amp;gt;: Interpret des Albums. Kann z.B. auch &amp;quot;(compilations)&amp;quot; sein.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentEnqueuedTransportHandle&amp;lt;/code&amp;gt;: Handle, welches zur Weitergabe der aktuellen Quelle des aktuellen Titels verwendet werden kann.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentEnqueuedTransportURI&amp;lt;/code&amp;gt;: Enthält den Identifier der Quelle des aktuellen Titels. Z.B. die ID der Spotify-Playliste&lt;br /&gt;
**&amp;lt;code&amp;gt;currentFavouriteName&amp;lt;/code&amp;gt;: Enthält den Namen des Quellfavoriten, der den aktuellen Titel zur Liste hinzugefügt hat. Dazu müssen die Favoriten mittels &amp;quot;get FavouritesWithCover&amp;quot; ermittelt worden sein, und die Liste im Reading &amp;quot;Favourites&amp;quot; zur Verfügung stehen.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentPlaylistName&amp;lt;/code&amp;gt;: Enthält den Namen der Quellplaylist, die den aktuellen Titel zur Liste hinzugefügt hat. Dazu müssen die Playlisten mittels &amp;quot;get PlaylistsWithCover&amp;quot; ermittelt worden sein, und die Liste im Reading &amp;quot;Playlists&amp;quot; zur Verfügung stehen.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentRadioName&amp;lt;/code&amp;gt;: Enthält den Namen des Quellradios, der den aktuellen Titel zur Liste hinzugefügt hat. Dazu müssen die Radios mittels &amp;quot;get RadiosWithCover&amp;quot; ermittelt worden sein, und die Liste im Reading &amp;quot;Radios&amp;quot; zur Verfügung stehen.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentOriginalTrackNumber&amp;lt;/code&amp;gt;: Nummer des aktuellen Titels bezogen auf das Album&lt;br /&gt;
**&amp;lt;code&amp;gt;currentSource&amp;lt;/code&amp;gt;: Enthält die aktuelle Quelle zum aktuellen Titel. Bei Spotify z.B. die gewählte Playliste oder das Album, oder die gewählte Sonos-Playliste.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrack&amp;lt;/code&amp;gt;: Nummer des aktuellen Titels in der Abspielliste&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrackHandle&amp;lt;/code&amp;gt;: Handle des aktuellen Titels, welches zur Weitergabe geeignet ist.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrackURI&amp;lt;/code&amp;gt;: Dateipfad des aktuellen Titels in der Abspielliste. Gültige Formate siehe PlayURI.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrackDuration&amp;lt;/code&amp;gt;: Länge des aktuellen Titels im Format H:MM:SS&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrackDurationSec&amp;lt;/code&amp;gt;: Länge des aktuellen Titels in Sekunden.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrackPosition&amp;lt;/code&amp;gt;: Position innerhalb des aktuellen Titels im Format H:MM:SS. Wird zum Zeitpunkt einer Änderung des Abspielstatus (Play, Pause, Stop, Nächster Titel, usw.) aktualisiert.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrackPositionSimulated&amp;lt;/code&amp;gt;: Simulierte und laufend aktualisierte Abspielposition des Titels im Format H:MM:SS.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrackPositionSimulatedSec&amp;lt;/code&amp;gt;: Simulierte und laufend aktualisierte Abspielposition des Titels in Sekunden.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrackPositionSimulatedPercent&amp;lt;/code&amp;gt;: Simulierte und laufend aktualisierte Abspielposition des Titels in Prozent.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrackProvider&amp;lt;/code&amp;gt;: &#039;Quelle&#039; der aktuellen Wiedergabe. Enthält z.B. &#039;&#039;Spotify&#039;&#039; oder &#039;&#039;Bibliothek&#039;&#039;&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrackProviderIconQuadraticURL&amp;lt;/code&amp;gt;: Enthält eine URL zu einem quadratischen TrackProvider-Icon.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrackProviderIconRoundURL&amp;lt;/code&amp;gt;: Enthält eine URL zu einem runden TrackProvider-Icon.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentSender&amp;lt;/code&amp;gt;: Senderbezeichnung, wenn es ein Radiostream ist&lt;br /&gt;
**&amp;lt;code&amp;gt;currentSenderCurrent&amp;lt;/code&amp;gt;: Zusatzinformationen zur Radiosendung, meist der Programmtitel wie &#039;Pop&amp;amp;Weck&#039;&lt;br /&gt;
**&amp;lt;code&amp;gt;currentSenderInfo&amp;lt;/code&amp;gt;: Zusatzinformationen zur Radiosendung, meist der Titel des aktuellen Liedes&lt;br /&gt;
**&amp;lt;code&amp;gt;currentAlbumArtURI&amp;lt;/code&amp;gt;: Relativer Verzeichnis-Pfad im lokalen FHEM (physisch). Beginnt momentan mit &amp;quot;www&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;currentAlbumArtURL&amp;lt;/code&amp;gt;: Kompletter Pfad für den eigenen Download der Coverdatei des aktuellen Titels oder für die Angabe in einer HTML-IMG-Source.&lt;br /&gt;
*Infos zum nächsten Titel&lt;br /&gt;
**&amp;lt;code&amp;gt;nextTitle&amp;lt;/code&amp;gt;: Titelbezeichnung des nächsten Titels&lt;br /&gt;
**&amp;lt;code&amp;gt;nextArtist&amp;lt;/code&amp;gt;: Interpret des nächsten Titels&lt;br /&gt;
**&amp;lt;code&amp;gt;nextAlbum&amp;lt;/code&amp;gt;: Albumname des nächsten Titel&lt;br /&gt;
**&amp;lt;code&amp;gt;nextAlbumArtist&amp;lt;/code&amp;gt;: Interpret des Albums des nächsten Titels. Kann z.B. auch &amp;quot;(compilations)&amp;quot; sein.&lt;br /&gt;
**&amp;lt;code&amp;gt;nextOriginalTrackNumber&amp;lt;/code&amp;gt;: Nummer des nächsten Titels bezogen auf das Album&lt;br /&gt;
**&amp;lt;code&amp;gt;nextAlbumArtURI&amp;lt;/code&amp;gt;: Relativer Verzeichnis-Pfad im lokalen FHEM (physisch). Beginnt momentan mit &amp;quot;www&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;nextAlbumArtURL&amp;lt;/code&amp;gt;: Kompletter Pfad für den eigenen Download der Coverdatei des nächsten Titels oder für die Angabe in einer HTML-IMG-Source.&lt;br /&gt;
**&amp;lt;code&amp;gt;nextTrackHandle&amp;lt;/code&amp;gt;: Handle des nächsten Titels, welches zur Weitergabe geeignet ist.&lt;br /&gt;
**&amp;lt;code&amp;gt;nextTrackURI&amp;lt;/code&amp;gt;: Dateipfad des nächsten Titels in der Abspielliste. Gültige Formate siehe PlayURI.&lt;br /&gt;
**&amp;lt;code&amp;gt;nextTrackDuration&amp;lt;/code&amp;gt;: Länge des nächsten Titels im Format H:MM:SS&lt;br /&gt;
**&amp;lt;code&amp;gt;nextTrackDurationSec&amp;lt;/code&amp;gt;: Länge des nächsten Titels in Sekunden.&lt;br /&gt;
**&amp;lt;code&amp;gt;nextTrackProvider&amp;lt;/code&amp;gt;: &#039;Quelle&#039; der nächsten Wiedergabe. Enthält z.B. &#039;&#039;Spotify&#039;&#039; oder &#039;&#039;Bibliothek&#039;&#039;&lt;br /&gt;
**&amp;lt;code&amp;gt;nextTrackProviderIconQuadraticURL&amp;lt;/code&amp;gt;: Enthält eine URL zu einem quadratischen TrackProvider-Icon.&lt;br /&gt;
**&amp;lt;code&amp;gt;nextTrackProviderIconRoundURL&amp;lt;/code&amp;gt;: Enthält eine URL zu einem runden TrackProvider-Icon.&lt;br /&gt;
*Generierte Informationen&lt;br /&gt;
**&amp;lt;code&amp;gt;infoSummarize1&amp;lt;/code&amp;gt;: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize]&lt;br /&gt;
**&amp;lt;code&amp;gt;infoSummarize2&amp;lt;/code&amp;gt;: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize]&lt;br /&gt;
**&amp;lt;code&amp;gt;infoSummarize3&amp;lt;/code&amp;gt;: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize]&lt;br /&gt;
**&amp;lt;code&amp;gt;infoSummarize4&amp;lt;/code&amp;gt;: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize]&lt;br /&gt;
**&amp;lt;code&amp;gt;currentStreamAudio&amp;lt;/code&amp;gt;: Boolean. 1 wenn gerade ein Radiostream läuft, sonst 0. Momentan faktisch Negation zu &amp;lt;currentNormalAudio&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;currentNormalAudio&amp;lt;/code&amp;gt;: Boolean. 1 wenn gerade ein normaler Titel läuft, sonst 0. Momentan faktisch Negation zu &amp;lt;currentStreamAudio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Attribute von SONOSPLAYER ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;&amp;lt;br /&amp;gt;Die Attribute werden meistens erst bei einem Neustart von FHEM verwendet, da diese dem SubProzess initial zur Verfügung gestellt werden müssen.&lt;br /&gt;
&lt;br /&gt;
*Grundsätzliches&lt;br /&gt;
**&amp;lt;code&amp;gt;disable(0,1)&amp;lt;/code&amp;gt;: Deaktiviert die Verarbeitung von Events dieses Devices&lt;br /&gt;
**&amp;lt;code&amp;gt;generateSomethingChangedEvent(0,1)&amp;lt;/code&amp;gt;: Bestimmt, ob ein Event mit dem Namen &#039;SomethingChanged&#039; generiert werden soll, wenn überhaupt ein Event generiert wurde. Das ist nützlich, wenn man auf eine beliebige Änderung des Player reagieren möchte.&lt;br /&gt;
**&amp;lt;code&amp;gt;generateVolumeEvent(0,1)&amp;lt;/code&amp;gt;: Aktiviert die Generierung eines Events bei Lautstärkeänderungen, wenn mindestens eines der Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;minVolumeHeadphone&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolumeHeadphone&amp;lt;/code&amp;gt; definiert ist. Standardmäßig ist dies deaktiviert (=0), um die Zeitverzögerung so gering wie möglich zu halten.&lt;br /&gt;
**&amp;lt;code&amp;gt;generateVolumeSlider(0,1)&amp;lt;/code&amp;gt;: Aktiviert einen Slider für die Lautstärkeneinstellung auf der Detailansicht. Standardmäßig ist dieser aktiviert (=1).&lt;br /&gt;
**&amp;lt;code&amp;gt;getAlarms(0,1)&amp;lt;/code&amp;gt;: Meldet sich bei Playern für die Aktualisierung von Alarm-Informationen an. Diese werden bei Änderung direkt aktualisiert, und erzeugen dementsprechend ein FHEM-Event. Gleichzeitig wird hiermit die &#039;&#039;&#039;DailyIndexRefreshTime&#039;&#039;&#039; mit aktualisiert.&lt;br /&gt;
**&amp;lt;code&amp;gt;suppressControlButtons(0,1)&amp;lt;/code&amp;gt;: Gibt an, ob die Steuerbuttons unter der Cover-/Titelanzeige angezeigt werden sollen (=1) oder nicht (=0).&lt;br /&gt;
**&amp;lt;code&amp;gt;VolumeStep&amp;lt;/code&amp;gt;: Definiert die Schrittweite für den Aufruf von &amp;lt;code&amp;gt;VolumeU&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;VolumeD&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Informationen generieren&lt;br /&gt;
**&amp;lt;code&amp;gt;generateInfoSummarize1&amp;lt;/code&amp;gt;: Generiert das Reading &#039;InfoSummarize1&#039; mit dem angegebenen Format.&lt;br /&gt;
**&amp;lt;code&amp;gt;generateInfoSummarize2&amp;lt;/code&amp;gt;: Generiert das Reading &#039;InfoSummarize2&#039; mit dem angegebenen Format.&lt;br /&gt;
**&amp;lt;code&amp;gt;generateInfoSummarize3&amp;lt;/code&amp;gt;: Generiert das Reading &#039;InfoSummarize3&#039; mit dem angegebenen Format.&lt;br /&gt;
**&amp;lt;code&amp;gt;generateInfoSummarize4&amp;lt;/code&amp;gt;: Generiert das Reading &#039;InfoSummarize4&#039; mit dem angegebenen Format.&lt;br /&gt;
**&amp;lt;code&amp;gt;getTitleInfoFromMaster(0,1)&amp;lt;/code&amp;gt;: Bringt das Device dazu, seine aktuellen Abspielinformationen vom aktuellen Gruppenmaster zu holen, wenn es einen solchen gibt.&lt;br /&gt;
**&amp;lt;code&amp;gt;simulateCurrentTrackPosition(0,1)&amp;lt;/code&amp;gt;: Bringt das Device dazu, seine aktuelle Abspielposition simuliert weiterlaufen zu lassen. Dazu werden die Readings &amp;lt;code&amp;gt;currentTrackPositionSimulated&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;currentTrackPositionSimulatedSec&amp;lt;/code&amp;gt; gesetzt. Gleichzeitig wird auch das Reading &amp;lt;code&amp;gt;currentTrackPositionSimulatedPercent&amp;lt;/code&amp;gt; (zwischen 0.0 und 100.0) gesetzt.&lt;br /&gt;
**&amp;lt;code&amp;gt;simulateCurrentTrackPositionPercentFormat &amp;amp;lt;Format&amp;amp;gt;&amp;lt;/code&amp;gt;: Definiert das Format für die sprintf-Prozentausgabe im Reading &amp;lt;code&amp;gt;currentTrackPositionSimulatedPercent&amp;lt;/code&amp;gt;.&lt;br /&gt;
**&amp;lt;code&amp;gt;stateVariable(TransportState,NumberOfTracks,Track,TrackDuration,Title,Artist,Album,&amp;lt;br /&amp;gt;&lt;br /&gt;
	OriginalTrackNumber,AlbumArtist,Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,&amp;lt;br /&amp;gt;&lt;br /&gt;
	AlbumArtURI,nextTrackDuration,nextTrackURI,nextAlbumArtURI,nextTitle,nextArtist,&amp;lt;br /&amp;gt;&lt;br /&gt;
	nextAlbum,nextAlbumArtist,nextOriginalTrackNumber,Volume,Mute,Shuffle,Repeat,RepeatOne,CrossfadeMode,&amp;lt;br /&amp;gt;&lt;br /&gt;
	Balance,HeadphoneConnected,SleepTimer,Presence,RoomName,RoomNameAlias,SaveRoomName,PlayerType,Location,&amp;lt;br /&amp;gt;&lt;br /&gt;
	SoftwareRevision,SerialNum,InfoSummarize1,InfoSummarize2,InfoSummarize3,InfoSummarize4)&amp;lt;/code&amp;gt;: Legt fest, welcher Variablenwert in den State geschrieben werden soll.&lt;br /&gt;
*Steueroptionen&lt;br /&gt;
**&amp;lt;code&amp;gt;maxVolume(0..100)&amp;lt;/code&amp;gt;: Legt die obere Grenze für die einstellbare Lautstärke dieses ZonePlayers fest. Diese kann auch mit keinem Controller überschritten werden, da diese überwacht wird.&lt;br /&gt;
***Wenn eine untere oder obere Grenze festgelegt wurde, so wird das Reading &#039;&#039;&#039;Volume&#039;&#039;&#039; am entsprechenden SonosPlayer bei jeder Änderung am Player aktualisiert.&amp;lt;br /&amp;gt;Möchte man also immer die aktuelle Lautstärke kennen, aber keine Enschränkung machen, dann sollte der Wert von &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; gesetzt werden. Desweiteren werden gleichzeitig auch Änderungen an der Balance aktualisiert, da diese mit übertragen werden.&lt;br /&gt;
***&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Wenn eine untere oder obere Grenze festgelegt wird, werden für Lautstärkenänderungen auch Events erzeugt. Es ist unbedingt darauf zu achten, dass etwaige Notify-Definitionen zügig bearbeitet werden, da sonst das Sonos-System träge werden könnte.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Dieses Attribut kann auch im laufenden Betrieb angepasst werden. Die Einhaltung der Grenzen wird umgehend sichergestellt.&amp;lt;br /&amp;gt;Bedingung ist nur, dass zum Startzeitpunkt des SubProzesses eine Grenze festgelegt sein musste, damit die entsprechenden Listener angemeldet werden.&lt;br /&gt;
**&amp;lt;code&amp;gt;minVolume(0..100)&amp;lt;/code&amp;gt;: Legt die untere Grenze für die einstellbare Lautstärke dieses ZonePlayers fest. Diese kann auch mit keinem Controller unterschritten werden, da diese überwacht wird.&lt;br /&gt;
***Wenn eine untere oder obere Grenze festgelegt wurde, so wird das Reading &#039;&#039;&#039;Volume&#039;&#039;&#039; am entsprechenden SonosPlayer bei jeder Änderung am Player aktualisiert.&amp;lt;br /&amp;gt;Möchte man also immer die aktuelle Lautstärke kennen, aber keine Enschränkung machen, dann sollte der Wert von &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; gesetzt werden. Desweiteren werden gleichzeitig auch Änderungen an der Balance aktualisiert, da diese mit übertragen werden.&lt;br /&gt;
***&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Wenn eine untere oder obere Grenze festgelegt wird, werden für Lautstärkenänderungen auch Events erzeugt. Es ist unbedingt darauf zu achten, dass etwaige Notify-Definitionen zügig bearbeitet werden, da sonst das Sonos-System träge werden könnte.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Dieses Attribut kann auch im laufenden Betrieb angepasst werden. Die Einhaltung der Grenzen wird umgehend sichergestellt.&amp;lt;br /&amp;gt;Bedingung ist nur, dass zum Startzeitpunkt des SubProzesses eine Grenze festgelegt sein musste, damit die entsprechenden Listener angemeldet werden.&lt;br /&gt;
**&amp;lt;code&amp;gt;maxVolumeHeadphone(0..100)&amp;lt;/code&amp;gt;: Legt die obere Grenze für die einstellbare Lautstärke dieses ZonePlayers im Kopfhörerbetrieb fest.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis!&#039;&#039;&#039;: Es gelten die gleichen Bedingungen und Hinweise wie bei &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt;.&lt;br /&gt;
**&amp;lt;code&amp;gt;minVolumeHeadphone(0..100)&amp;lt;/code&amp;gt;: Legt die untere Grenze für die einstellbare Lautstärke dieses ZonePlayers im Kopfhörerbetrieb fest.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis!&#039;&#039;&#039;: Es gelten die gleichen Bedingungen und Hinweise wie bei &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt;.&lt;br /&gt;
**&amp;lt;code&amp;gt;buttonEvents &amp;amp;lt;Time:Pattern&amp;amp;gt;[ &amp;amp;lt;Time:Pattern&amp;amp;gt; ...]&amp;lt;/code&amp;gt;: Definiert, dass bei einer bestimten Tastenfolge am Player ein Event erzeugt werden soll. Die Definition der Events erfolgt als Tupel: Der erste Teil vor dem Doppelpunkt ist die Zeit in Sekunden, die berücksichtigt werden soll, der zweite Teil hinter dem Doppelpunkt definiert die Abfolge der Buttons, die für dieses Event notwendig sind.&lt;br /&gt;
***Folgende Button-Kürzel sind zulässig:&lt;br /&gt;
****&#039;&#039;&#039;M&#039;&#039;&#039;: Der Mute-Button (&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Der Mute-Button am SonosPlayer ist seit Firmware 4.2 ein Play/Pause/Next-Button, der kein Mute-Event mehr erzeugt, meine Beschwerde an Sonos, dass es nicht benutzerfreundlich ist, einen Mute-Symbolisierten Button mit Play/Pause zu belegen, wurde im großen und ganzen ignoriert)&lt;br /&gt;
****&#039;&#039;&#039;H&#039;&#039;&#039;: Die Headphone-Buchse&lt;br /&gt;
****&#039;&#039;&#039;U&#039;&#039;&#039;: Up-Button (Lautstärke Hoch)&lt;br /&gt;
****&#039;&#039;&#039;D&#039;&#039;&#039;: Down-Button (Lautstärke Runter)&lt;br /&gt;
***Das Event, das geworfen wird, heißt &amp;lt;code&amp;gt;ButtonEvent&amp;lt;/code&amp;gt;, der Wert ist die definierte Tastenfolge&amp;lt;br /&amp;gt;Z.B.: &amp;lt;code&amp;gt;2:MM&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Hier wird definiert, dass ein Event erzeugt werden soll, wenn innerhalb von 2 Sekunden zweimal die Mute-Taste gedrückt wurde. Das damit erzeugte Event hat dann den Namen &amp;lt;code&amp;gt;ButtonEvent&amp;lt;/code&amp;gt;, und den Wert &amp;lt;code&amp;gt;MM&amp;lt;/code&amp;gt;.&lt;br /&gt;
**&amp;lt;code&amp;gt;saveSleeptimerInAction(0,1)&amp;lt;/code&amp;gt;: Wenn gesetzt, wird ein etwaig gesetztes Attribut &amp;quot;stopSleeptimerInAction&amp;quot; ignoriert.&lt;br /&gt;
**&amp;lt;code&amp;gt;stopSleeptimerInAction(0,1)&amp;lt;/code&amp;gt;: Wenn gesetzt, wird bei einem Wechsel des transportState auf &amp;quot;PAUSED_PLAYBACK&amp;quot; oder &amp;quot;STOPPED&amp;quot; ein etwaig definierter SleepTimer deaktiviert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get-Befehle an den SONOSPLAYER ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis!&#039;&#039;&#039;: Es wurden ein paar Get-Möglichkeiten entfernt. Diese Befehle (wie z.B. &#039;&#039;Volume&#039;&#039;) können mittlerweile direkt geliefert werden, und müssen nicht angefordert werden. Übrig geblieben sind nur noch solche Anweisungen, die Informationen beschaffen, die nicht automatisch geliefert werden (können).&lt;br /&gt;
*Grundsätzliches&lt;br /&gt;
**&amp;lt;code&amp;gt;Alarm &amp;lt;ID&amp;gt;&amp;lt;/code&amp;gt;: Ausnahmefall. Diese Get-Anweisung liefert direkt ein Hash zurück, in welchem die Informationen des Alarms mit der gegebenen ID enthalten sind. Es ist die Kurzform für &amp;lt;code&amp;gt;eval(ReadingsVal(&amp;lt;Devicename&amp;gt;, &#039;Alarmlist&#039;, ()))-&amp;gt;{&amp;lt;ID&amp;gt;};&amp;lt;/code&amp;gt;, damit sich nicht jeder ausdenken muss, wie er jetzt am einfachsten an die Alarm-Informationen rankommen kann.&lt;br /&gt;
**&amp;lt;code&amp;gt;EthernetPortStatus &amp;lt;PortNumber&amp;gt;&amp;lt;/code&amp;gt;: Liefert den Ethernet-Portstatus des gegebenen Ports (&#039;0&#039; oder &#039;1&#039;). Kann &#039;Active&#039; oder &#039;Inactive&#039; liefern.&lt;br /&gt;
**&amp;lt;code&amp;gt;PossibleRoomIcons&amp;lt;/code&amp;gt;: Liefert eine Liste aller möglichen RoomIcon-Bezeichnungen zurück.&lt;br /&gt;
**&amp;lt;code&amp;gt;SupportLinks&amp;lt;/code&amp;gt;: Ausnahmefall. Diese Get-Anweisung liefert eine Liste mit passenden Links zu den Supportseiten des Player.&lt;br /&gt;
**&amp;lt;code&amp;gt;WifiPortStatus&amp;lt;/code&amp;gt;: Liefert den Wifi-Portstatus. Kann &#039;Active&#039; oder &#039;Inactive&#039; liefern.&lt;br /&gt;
*Listen&lt;br /&gt;
**&amp;lt;code&amp;gt;Favourites&amp;lt;/code&amp;gt;: Liefert eine Liste mit den Namen aller gespeicherten Sonos-Favoriten. Das Format der Liste ist eine Komma-Separierte Liste, bei der die Namen in doppelten Anführungsstrichen stehen. z.B. &amp;quot;Liste 1&amp;quot;,&amp;quot;Eintrag 2&amp;quot;,&amp;quot;Test&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;FavouritesWithCovers&amp;lt;/code&amp;gt;: Liefert die Stringrepräsentation eines Hash mit den Namen und Covern aller gespeicherten Sonos-Favoriten. Z.B.: {&#039;FV:2/22&#039; =&amp;gt; {&#039;Cover&#039; =&amp;gt; &#039;urlzumcover&#039;, &#039;Title&#039; =&amp;gt; &#039;1. Favorit&#039;}}. Dieser String kann einfach mit &#039;&#039;&#039;eval&#039;&#039;&#039; in eine Perl-Datenstruktur umgewandelt werden.&lt;br /&gt;
**&amp;lt;code&amp;gt;Playlists&amp;lt;/code&amp;gt;: Liefert eine Liste aller gespeicherten Playlists. Diese Anfrage liefert bei allen Zoneplayern die gleiche Liste zurück. Das Format ist eine Komma-Separierte Liste, bei der die Einträge in doppelten Anführungszeichen stehen z.B. &amp;quot;Liste 1&amp;quot;,&amp;quot;Liste 2&amp;quot;,&amp;quot;Test&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;PlaylistsWithCovers&amp;lt;/code&amp;gt;: Liefert die Stringrepräsentation eines Hash mit den Namen und Covern aller gespeicherten Sonos-Playlisten. Z.B.: {&#039;SQ:14&#039; =&amp;gt; {&#039;Cover&#039; =&amp;gt; &#039;urlzumcover&#039;, &#039;Title&#039; =&amp;gt; &#039;1. Playlist&#039;}}. Dieser String kann einfach mit &#039;&#039;&#039;eval&#039;&#039;&#039; in eine Perl-Datenstruktur umgewandelt werden.&lt;br /&gt;
**&amp;lt;code&amp;gt;Queue&amp;lt;/code&amp;gt;: Liefert eine Liste mit den Namen aller Titel in der aktuellen Abspielliste. Das Format der Liste ist eine Komma-Separierte Liste, bei der die Namen in doppelten Anführungsstrichen stehen. z.B. &amp;quot;1. Liste 1 [0:02:14]&amp;quot;,&amp;quot;2. Eintrag 2 [k.A.]&amp;quot;,&amp;quot;3. Test [0:14:00]&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;QueueWithCovers&amp;lt;/code&amp;gt;: Liefert die Stringrepräsentation eines Hash mit den Namen und Covern aller Titel der aktuellen Abspielliste. Z.B.: {&#039;Q:0/22&#039; =&amp;gt; {&#039;Cover&#039; =&amp;gt; &#039;urlzumcover&#039;, &#039;Title&#039; =&amp;gt; &#039;1. Titel&#039;}}. Dieser String kann einfach mit &#039;&#039;&#039;eval&#039;&#039;&#039; in eine Perl-Datenstruktur umgewandelt werden.&lt;br /&gt;
**&amp;lt;code&amp;gt;Radios&amp;lt;/code&amp;gt;: Liefert eine Liste aller gespeicherten Radiosender (Favoriten). Diese Anfrage liefert bei allen Zoneplayern die gleiche Liste zurück. Das Format ist eine Komma-Separierte Liste, bei der die Einträge in doppelten Anführungszeichen stehen z.B. &amp;quot;Sender 1&amp;quot;,&amp;quot;Sender 2&amp;quot;,&amp;quot;Test&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;RadiosWithCovers&amp;lt;/code&amp;gt;: Liefert die Stringrepräsentation eines Hash mit den Namen und Covern aller gespeicherten Sonos-Radiofavoriten. Z.B.: {&#039;R:0/0/2&#039; =&amp;gt; {&#039;Cover&#039; =&amp;gt; &#039;urlzumcover&#039;, &#039;Title&#039; =&amp;gt; &#039;1. Radiosender&#039;}}. Dieser String kann einfach mit &#039;&#039;&#039;eval&#039;&#039;&#039; in eine Perl-Datenstruktur umgewandelt werden.&lt;br /&gt;
**&amp;lt;code&amp;gt;SearchlistCategories&amp;lt;/code&amp;gt;: Liefert eine Liste mit allen verfügbaren Kategorien, die beim Set-Befehl &#039;&#039;&#039;LoadSearchlist&#039;&#039;&#039; verwendet werden können. Diese Liste kann dynamisch durch Sonos erweitert werden.&lt;br /&gt;
*Informationen zum aktuellen Titel&lt;br /&gt;
**&amp;lt;code&amp;gt;CurrentTrackPosition&amp;lt;/code&amp;gt;: Liefert die aktuelle Zeitposition im Lied&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Set-Befehle an den SONOSPLAYER ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis!&#039;&#039;&#039;: Alle Set-Befehle liefern kein direktes Ergebnis zurück. Sollte ein Ergebnis generiert werden (meistens eine Statusmeldung, bzw. was genau getan wurde), so landet dies nach der Ausführung in dem Reading &amp;lt;code&amp;gt;LastActionResult&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Grundsätzliche Einstellungen&lt;br /&gt;
**&amp;lt;code&amp;gt;Alarm &amp;lt;Create|Update|Delete|Enable|Disable&amp;gt; &amp;lt;ID[,ID]|All&amp;gt; &amp;lt;Datenhash&amp;gt;&amp;lt;/code&amp;gt;: Diese Anweisung wird für die Bearbeitung der Alarme verwendet:&lt;br /&gt;
***&#039;&#039;&#039;Create&#039;&#039;&#039;: Erzeugt einen neuen Alarm-Eintrag mit den übergebenen Hash-Daten. Der Rückgabewert ist die ID des neuen Alarms.&lt;br /&gt;
***&#039;&#039;&#039;Update&#039;&#039;&#039;: Aktualisiert die Alarme mit den übergebenen IDs und den angegebenen Hash-Daten.&lt;br /&gt;
***&#039;&#039;&#039;Delete&#039;&#039;&#039;: Löscht die Alarm-Einträge mit den übergebenen IDs.&lt;br /&gt;
***&#039;&#039;&#039;Enable&#039;&#039;&#039;: Aktiviert die Alarm-Einträge mit den übergebenen IDs.&lt;br /&gt;
***&#039;&#039;&#039;Disable&#039;&#039;&#039;: Deaktiviert die Alarm-Einträge mit den übergebenen IDs.&lt;br /&gt;
***&#039;&#039;Hinweis&#039;&#039;: Bei Angabe des Worts &#039;&#039;All&#039;&#039; als ID werden alle, diesem Player zugeordneten, Alarme verarbeitet.&lt;br /&gt;
***&#039;&#039;&#039;Datenhash&#039;&#039;&#039;: Das Format ist ein Perl-Hash und wird mittels der eval-Funktion interpretiert. Eine Beschreibung befindet sich bei der Dokumentation des Readings &#039;&#039;&#039;AlarmList&#039;&#039;&#039; oder den folgenden Beispielen.&lt;br /&gt;
***&#039;&#039;&#039;Beispiele&#039;&#039;&#039;:&lt;br /&gt;
****&amp;lt;code&amp;gt;set Sonos_Wohnzimmer Alarm Create 0 { Enabled =&amp;amp;gt; 1, Volume =&amp;amp;gt; 35, StartTime =&amp;amp;gt; &#039;00:00:00&#039;, Duration =&amp;amp;gt; &#039;00:15:00&#039;, Repeat =&amp;amp;gt; 0, Shuffle =&amp;amp;gt; 0, ProgramURI =&amp;amp;gt; &#039;x-rincon-buzzer:0&#039;, ProgramMetaData =&amp;amp;gt; &#039; &#039;, Recurrence_Once =&amp;amp;gt; 0, Recurrence_Monday =&amp;amp;gt; 1, Recurrence_Tuesday =&amp;amp;gt; 1, Recurrence_Wednesday =&amp;amp;gt; 1, Recurrence_Thursday =&amp;amp;gt; 1, Recurrence_Friday =&amp;amp;gt; 1, Recurrence_Saturday =&amp;amp;gt; 0, Recurrence_Sunday =&amp;amp;gt; 0, IncludeLinkedZones =&amp;amp;gt; 0 }&amp;lt;/code&amp;gt;: Erzeugt einen neuen Alarm mit den angegebenen Informationen. Die neue ID wird als Ergebnis zurückgegeben.&lt;br /&gt;
****&amp;lt;code&amp;gt;set Sonos_Wohnzimmer Alarm Update 17 { Shuffle =&amp;amp;gt; 1 }&amp;lt;/code&amp;gt;: Aktualisiert den Alarm mit der ID &#039;&#039;17&#039;&#039;, und passt dort Shuffle auf &#039;&#039;Aktiv&#039;&#039; an.&lt;br /&gt;
****&amp;lt;code&amp;gt;set Sonos_Wohnzimmer Alarm Delete 17&amp;lt;/code&amp;gt;: Löscht den Alarm mit der ID &#039;&#039;17&#039;&#039;.&lt;br /&gt;
**&amp;lt;code&amp;gt;AudioDelay &amp;amp;lt;Level&amp;amp;gt;&amp;lt;/code&amp;gt;: Setzt das AudioDelay der Playbar auf den angegebenen Wert. Der Wert kann zwischen 0 und 5 liegen.&lt;br /&gt;
**&amp;lt;code&amp;gt;AudioDelayLeftRear &amp;amp;lt;Level&amp;amp;gt;&amp;lt;/code&amp;gt;: Setzt den AudioDelayLeftRear des Players auf den angegebenen Wert. Der Wert kann zwischen 0 und 2 liegen. Wobei die Werte folgende Bedeutung haben: 0: &amp;gt;3m, 1: &amp;gt;0.6m und &amp;lt;3m, 2: &amp;lt;0.6m&lt;br /&gt;
**&amp;lt;code&amp;gt;AudioDelayRightRear &amp;amp;lt;Level&amp;amp;gt;&amp;lt;/code&amp;gt;: Setzt den AudioDelayRightRear des Players auf den angegebenen Wert. Der Wert kann zwischen 0 und 2 liegen. Wobei die Werte folgende Bedeutung haben: 0: &amp;gt;3m, 1: &amp;gt;0.6m und &amp;lt;3m, 2: &amp;lt;0.6m&lt;br /&gt;
**&amp;lt;code&amp;gt;ButtonLockState(0,1)&amp;lt;/code&amp;gt;: Setzt den aktuellen Button-Sperr-Zustand.&lt;br /&gt;
**&amp;lt;code&amp;gt;DailyIndexRefreshTime &amp;lt;Timestring&amp;gt;&amp;lt;/code&amp;gt;: Legt die aktuell gültige &#039;&#039;DailyIndexRefreshTime&#039;&#039; fest, zu der der Medienindex neu aufgebaut werden soll. Der Wert muss ein kompletter Zeitstempel sein (HH:MM:SS).&lt;br /&gt;
**&amp;lt;code&amp;gt;DialogLevel &amp;lt;Level&amp;gt;&amp;lt;/code&amp;gt;: Legt den Zustand der Sprachverbesserung an der Playbar fest.&lt;br /&gt;
**&amp;lt;code&amp;gt;ExportSonosBibliothek &amp;lt;Filename&amp;gt;&amp;lt;/code&amp;gt;: Exportiert eine Datei mit der textuellen Darstellung eines Struktur- und Titelhashs, das die komplette Navigationsstruktur aus der Sonos-Bibliothek abbildet. Dieser Prozess braucht viel CPU-Zeit und Arbeitsspeicher zum Ermitteln und wegspeichern der Daten.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Richtwerte bei ca. 22.000 Titeln auf einem Windows-Server mit Intel Core i5 mit 2.8GHz: Laufzeit: ca. 28Min, Arbeitsspeicher: ca. 1GB, Resultierende Datei: ca. 90MB&lt;br /&gt;
**&amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt;: Legt den Namen der Zone fest.&lt;br /&gt;
**&amp;lt;code&amp;gt;NightMode &amp;lt;State&amp;gt;&amp;lt;/code&amp;gt;: Legt den Zustand des Nachtsounds an der Playbar fest.&lt;br /&gt;
**&amp;lt;code&amp;gt;OutputFixed &amp;lt;State&amp;gt;&amp;lt;/code&amp;gt;: Setzt den OutputFixed-Zustand (die Lautstärkepegelsteuerung des Ausgangs des Players) auf den angegebenen Wert. Der Wert kann on oder off sein. Liefert als Ergebnis den neuen Zustand.&lt;br /&gt;
**&amp;lt;code&amp;gt;Reboot&amp;lt;/code&amp;gt;: Führt für den Zoneplayer einen Neustart durch.&lt;br /&gt;
**&amp;lt;code&amp;gt;ResetAttributesToDefault &amp;lt;DeleteAllOtherAttributes&amp;gt;&amp;lt;/code&amp;gt;: Setzt die Attribute eines Players auf die Voreinstellung zurück, wie sie beim Anlegen des Players gesetzt waren. Wenn der Parameter &amp;quot;DeleteAllOtherAttributes&amp;quot; mit &amp;quot;1&amp;quot; oder &amp;quot;on&amp;quot; angegeben wurde, werden vor dem Setzen alle Attribute gelöscht.&lt;br /&gt;
**&amp;lt;code&amp;gt;RoomIcon&amp;lt;/code&amp;gt;: Legt das Icon für die Zone fest.&lt;br /&gt;
**&amp;lt;code&amp;gt;SnoozeAlarm &amp;amp;lt;Timestring|Seconds&amp;amp;gt;&amp;lt;/code&amp;gt;: Unterbricht eine laufende Alarmwiedergabe für den übergebenen Zeitraum.&lt;br /&gt;
**&amp;lt;code&amp;gt;SubEnable &amp;amp;lt;State&amp;amp;gt;&amp;lt;/code&amp;gt;: Legt den Zustand des Sub-Zustands fest.&lt;br /&gt;
**&amp;lt;code&amp;gt;SubGain &amp;amp;lt;Level&amp;amp;gt;&amp;lt;/code&amp;gt;: Setzt den SubGain auf den angegebenen Wert. Der Wert kann zwischen -15 und 15 liegen.&lt;br /&gt;
**&amp;lt;code&amp;gt;SubPolarity &amp;amp;lt;Level&amp;amp;gt;&amp;lt;/code&amp;gt; Setzt den SubPolarity auf den angegebenen Wert. Der Wert kann zwischen 0 und 2 liegen.&lt;br /&gt;
**&amp;lt;code&amp;gt;SurroundEnable &amp;amp;lt;State&amp;amp;gt;&amp;lt;/code&amp;gt;: Legt den Zustand des Surround-Zustands fest. Liefert den aktuell gültigen Surround-Zustand.&lt;br /&gt;
**&amp;lt;code&amp;gt;SurroundLevel &amp;amp;lt;Level&amp;amp;gt;&amp;lt;/code&amp;gt;: Setzt den Surroundlevel auf den angegebenen Wert. Der Wert kann zwischen -15 und 15 sein.&lt;br /&gt;
**&amp;lt;code&amp;gt;TruePlay &amp;amp;lt;State&amp;amp;gt;&amp;lt;/code&amp;gt;: Setzt den TruePlay-Zustand.&lt;br /&gt;
**&amp;lt;code&amp;gt;Wifi &amp;lt;State&amp;gt;&amp;lt;/code&amp;gt;: Setzt den WiFi-Zustand des Players. Kann &#039;off&#039;, &#039;persist-off&#039; oder &#039;on&#039; sein.&lt;br /&gt;
*Abspiel-Steuerbefehle&lt;br /&gt;
**&amp;lt;code&amp;gt;CurrentTrackPosition &amp;lt;TimePosition&amp;gt;&amp;lt;/code&amp;gt;: Setzt die aktuelle Zeitposition im Lied. Man kann hier auch relative Angaben machen wie &#039;+0:00:10&#039; oder nur &#039;+10&#039;. Zusätzlich kann man auch Prozentwerte angeben wie z.B. &#039;+10%&#039;. Natürlich können diese Angaben auch negativ sein.&lt;br /&gt;
**&amp;lt;code&amp;gt;Pause&amp;lt;/code&amp;gt;: Pausiert die Wiedergabe&lt;br /&gt;
**&amp;lt;code&amp;gt;Previous&amp;lt;/code&amp;gt;: Springt zum Anfang des vorhergehenden Liedes. Das ist ein anderes Verhalten als mit einem Controller. Der Controller springt zunächst an den Anfang des aktuellen Liedes, und erst beim erneuten Drücken an den Anfang des vorhergehenden Liedes.&lt;br /&gt;
**&amp;lt;code&amp;gt;Play&amp;lt;/code&amp;gt;: Startet die Wiedergabe&lt;br /&gt;
**&amp;lt;code&amp;gt;PlayURI &amp;lt;SongURI&amp;gt; [Volume]&amp;lt;/code&amp;gt;: Spielt die angegebene MP3-Datei mit der optional verwendbaren Lautstärke ab. Die Datei muss vom SonosPlayer aus direkt erreichbar (und natürlich auch lesbar) sein, braucht aber nicht indiziert worden zu sein.&amp;lt;br /&amp;gt;Folgende Formate werden momentan akzeptiert:&lt;br /&gt;
***&#039;&#039;&#039;Sonos-Devicenamen&#039;&#039;&#039;: z.B. &amp;lt;code&amp;gt;Sonos_Wohnzimmer&amp;lt;/code&amp;gt;. Der Devicename muss natürlich bereits definiert worden sein. Es wird der Audio(oder AV)-Eingang des gewählten Zoneplayer-Device als Wiedergabestrom gewählt.&lt;br /&gt;
****Bei normalen Audio-Eingängen (LineIn) kann man einen beliebigen Player für die Wiedergabe verwenden. Es muss nicht der lokale Player für die Wiedergabe verwendet werden.&lt;br /&gt;
****Besonderheit bei Sonos Playbar-Komponenten:&amp;lt;br /&amp;gt;Wenn als Quelle eine Playbar ausgewählt wird, so wird erst die Playbar selbst auf den SPDIF-Eingang umgestellt, und anschließend eine Gruppe mit dem gewünschten Player gebildet.&amp;lt;br /&amp;gt;Wenn diese Anweisung an die Playbar selbst gegeben wird, dann wird nur der SPDIF-Eingang als Quelle aktiviert.&lt;br /&gt;
***&#039;&#039;&#039;UNC-Pfade&#039;&#039;&#039;: z.B. &amp;lt;code&amp;gt;\\Server\Freigabe\Dateiname.mp3&amp;lt;/code&amp;gt;. Erkennungsmerkmal ist der Doppelte Backslash am Anfang. Darstellung aller üblichen Informationen inkl. Cover u.ä.&lt;br /&gt;
***&#039;&#039;&#039;Web-Streams&#039;&#039;&#039;: z.B. &amp;lt;code&amp;gt;http://www.energyradio.de/hot&amp;lt;/code&amp;gt;. Erkennungsmerkmal ist die Angabe von &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; am Anfang. Es werden keine Cover aber Streaminformationen dargestellt.&lt;br /&gt;
***&#039;&#039;&#039;Sonstige URI-Typen&#039;&#039;&#039;: z.B. &amp;lt;code&amp;gt;x-sonos-spotify:spotify:track:0jkLC0noG4A4i9lob2gSc3?sid=9&amp;amp;flags=0&amp;lt;/code&amp;gt;. Darstellung aller üblichen Informationen. Die verfügbaren Formate können durch Sonos erweitert/verändert werden.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Das Format der URI, das hier angegeben werden kann, ist stets identisch zum Reading &#039;&#039;&#039;currentTrackURI&#039;&#039;&#039;, das bedeutet, dass die URI, die man dort sieht, hier direkt wieder angegeben werden kann.&amp;lt;br /&amp;gt;Es gibt lediglich die oben benannte Vereinfachung für MP3-Dateien und Radio-URLs (aber auch dafür könnte man das offizielle Format angeben).&lt;br /&gt;
**&amp;lt;code&amp;gt;PlayURITemp &amp;lt;SongURI&amp;gt; [Volume]&amp;lt;/code&amp;gt;: Spielt die angegebene MP3-Datei mit der optional verwendbaren Lautstärke als temporäre Datei ab. Nachdem die Datei abgespielt wurde, werden die vorhergehenden Abspielparameter (Lautstärke, Titel, Position usw.) wiederhergestellt. Im Normalfall geht es also direkt dort weiter, wo die Unterbrechung stattgefunden hat. Die Datei muss vom SonosPlayer aus direkt erreichbar (und natürlich auch lesbar) sein, braucht aber nicht indiziert worden zu sein. Für eine ordnungsgemäße Wiederherstellung ist es notwendig, dass dies eine Datei und kein Stream ist, da die Abspiellänge vorher bekannt sein muss.&lt;br /&gt;
***Für Streams (genauer: Für Dateien, deren Abspiellänge nicht ermittelt werden kann) ist dieser Aufruf identisch zu &amp;lt;code&amp;gt;PlayURI&amp;lt;/code&amp;gt;, es wird im Anschluß nichts wiederhergestellt.&lt;br /&gt;
***Zulässige Formate stehen unter &amp;lt;code&amp;gt;PlayURI&amp;lt;/code&amp;gt;.&lt;br /&gt;
***&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Wenn bereits eine temporäre Ausgabe erfolgt, so wird die Aufforderung mit einer entsprechenden Meldung verworfen. Es kann nur eine geben :-)&lt;br /&gt;
**&amp;lt;code&amp;gt;Next&amp;lt;/code&amp;gt;: Springt zum Anfang des nächsten Liedes&lt;br /&gt;
**&amp;lt;code&amp;gt;Speak &amp;lt;Volume&amp;gt; &amp;lt;Language&amp;gt; &amp;lt;Text&amp;gt;&amp;lt;/code&amp;gt;: Wandelt den angegebenen Text mittels Google in gesprochenen Text um und spielt diesen mittels &amp;lt;code&amp;gt;PlayURITemp&amp;lt;/code&amp;gt; ab. An dieser Stelle ist zu berücksichtigen, dass der Text-Parameter auch Leerzeichen enthalten darf (und damit nach FHEM-Regeln eigentlich mehrere Parameter sind). Deswegen steht die Lautstärke vorne als nicht optionaler Parameter.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Im Text können MP3-File-Verweise eingebettet werden. Diese müssen vorne und hinten mit einem &#039;&#039;&#039;|&#039;&#039;&#039; und einem Leerzeichen abgetrennt werden. Außerdem darf der Dateiname selbst kein Leerzeichen enthalten.&amp;lt;br /&amp;gt;Beispieltexte:&lt;br /&gt;
****&#039;&#039;&#039;|/path/to/Gong.mp3| Achtung! Achtung! Die Waschmaschine ist fertig.&#039;&#039;&#039;&lt;br /&gt;
****&#039;&#039;&#039;Die Datei kann auch |/path/to/Tada.mp3| mittendrin stehen.&#039;&#039;&#039;&lt;br /&gt;
****&#039;&#039;&#039;|/path/to/Gong.mp3| Es können auch |/path/to/Tada.mp3| mehrere Dateien eingebettet werden.&#039;&#039;&#039;&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Es kann ein Standardpfad für diese Jingle-Dateien angegeben werden, dann braucht man im Text nur den Dateinamen anzugeben. Das Attribut am Sonos-Device dafür lautet &#039;&#039;targetSpeakMP3FileDir&#039;&#039;. z.B.: &#039;&#039;&#039;/path/to&#039;&#039;&#039;. Des Weiteren kann die Endung &#039;&#039;.mp3&#039;&#039; auch weggelassen werden.&amp;lt;br /&amp;gt;Damit können die Texte z.B. so gekürzt werden:&lt;br /&gt;
****&#039;&#039;&#039;|Gong| Achtung! Achtung! Die Waschmaschine ist fertig.&#039;&#039;&#039;&lt;br /&gt;
****&#039;&#039;&#039;Die Datei kann auch |Tada| mittendrin stehen.&#039;&#039;&#039;&lt;br /&gt;
****&#039;&#039;&#039;|Gong| Es können auch |Tada| mehrere Dateien eingebettet werden.&#039;&#039;&#039;&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Eine Website mit einigen Jingles und kurzen Tönen zur kostenfreien, privaten, Verwendung ist z.B. [http://soundbible.com/tags-gong.html soundbible.com]. Dort gibt es auch Gebell und ähnliches :-)&lt;br /&gt;
***&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Die Verkettung der diversen MP3-Dateien erfolgt durch einfaches hintereinanderschreiben. Bei verschiedenen Formaten (Mono oder Stereo, 16kHz oder 22kHz, usw.) funktioniert zwar die Wiedergabe auf dem Sonos-System fehlerfrei, allerdings werden die Zeitinformationen nicht korrekt dargestellt. Um das zu korrigieren, kann man noch nachträglich einen lokal installierten Konverter (z.B. &#039;&#039;avconv&#039;&#039;) drüberlaufen lassen. Diesen kann man mit dem Sonos-Device-Attribut &#039;&#039;targetSpeakMP3FileConverter&#039;&#039; einstellen (z.B. mit &#039;&#039;/usr/bin/avconv -i %infile% %outfile%&#039;&#039;). Dabei ist zu beachten, dass dieser Zeit benötigt und somit die Verzögerung der Durchsage vergrößert.&lt;br /&gt;
***&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Für die korrekte Funktionsweise müssen die Attribute &amp;lt;code&amp;gt;targetSpeakDir&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;targetSpeakURL&amp;lt;/code&amp;gt; am Sonos-Device konfiguriert sein (siehe [[#Attribute_von_SONOS|Attribute von SONOS]]).&lt;br /&gt;
***Mögliche Sprachparamter können bei Google herausgefunden werden. Diese sind z.B. &#039;&#039;&#039;de&#039;&#039;&#039;, &#039;&#039;&#039;en&#039;&#039;&#039;, &#039;&#039;&#039;es&#039;&#039;&#039;, &#039;&#039;&#039;fr&#039;&#039;&#039;, &#039;&#039;&#039;it&#039;&#039;&#039;...&lt;br /&gt;
***&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Die Textlänge ist durch Google begrenzt. Wenn die Größe überschritten wird, wird die Tonerzeugung in mehrere Aufrufe unterteilt. Davon merkt man im Prinzip wenig, ausser dass die Wiedergabeverzögerung höher ist, und die Sprachmelodie an der Trennstelle etwas &amp;quot;holprig&amp;quot; wirkt.&lt;br /&gt;
***&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Wenn bereits eine temporäre Ausgabe erfolgt, so wird die Aufforderung mit einer entsprechenden Meldung verworfen. Es kann nur eine geben :-)&lt;br /&gt;
**&amp;lt;code&amp;gt;StartFavourite &amp;lt;FavouriteName&amp;gt; [NoStart]&amp;lt;/code&amp;gt;: Startet den angegebenen Favoriten. Der Name bezeichnet einen Eintrag in der Sonos-Favoritenliste. Der Parameter sollte/kann URL-Encoded (z.B. mittels &#039;&#039;&#039;uri_escape()&#039;&#039;&#039; oder manuell) werden um auch Spezialzeichen zu ermöglichen.&amp;lt;br /&amp;gt;Siehe auch die Hinweise unter &#039;&#039;&#039;LoadFavourite&#039;&#039;&#039;.&lt;br /&gt;
***Wenn das Wort &#039;NoStart&#039; als zweiter Parameter angegeben wurde, dann wird der Favorit geladen und fertig vorbereitet, aber nicht explizit gestartet (entspricht dann einem &#039;&#039;LoadFavourite&#039;&#039;).&lt;br /&gt;
**&amp;lt;code&amp;gt;StartPlaylist &amp;lt;Playlistname&amp;gt; [ListeVorherLeeren]&amp;lt;/code&amp;gt;: Lädt die benannte Playlist und startet sofort die Wiedergabe.&amp;lt;br /&amp;gt;Zu den Parametern und Bemerkungen bitte unter &#039;&#039;&#039;LoadPlaylist&#039;&#039;&#039; nachsehen.&lt;br /&gt;
**&amp;lt;code&amp;gt;StartRadio &amp;lt;Radiostationname&amp;gt;&amp;lt;/code&amp;gt;: Lädt den benannten Radiosender, genauer gesagt, den benannten Radiofavoriten und startet sofort die Wiedergabe. Dabei wird die bestehende Abspielliste beibehalten, aber deaktiviert. Der Parameter kann/muss URL-Encoded (z.B. mittels &#039;&#039;&#039;uri_escape()&#039;&#039;&#039; oder manuell) sein, um auch Leer- und Sonderzeichen angeben zu können.&lt;br /&gt;
**&amp;lt;code&amp;gt;StartSearchlist &amp;lt;Kategoriename&amp;gt; &amp;lt;KategorieElement&amp;gt; [[TitelfilterRegEx]/[AlbumfilterRegEx]/[ArtistfilterRegEx] [maxElem]]&amp;lt;/code&amp;gt;: Ruft den Befehl &#039;&#039;&#039;LoadSearchlist&#039;&#039;&#039; auf und startet anschließend die Wiedergabe. Zu den genauen Beschreibungen der Funktion und Parameter bitte den Set-Befehl &#039;&#039;&#039;LoadSearchlist&#039;&#039;&#039; nachschlagen.&lt;br /&gt;
**&amp;lt;code&amp;gt;Stop&amp;lt;/code&amp;gt;: Stoppt die Wiedergabe&lt;br /&gt;
**&amp;lt;code&amp;gt;Track &amp;lt;TrackNumber&amp;gt;&amp;lt;/code&amp;gt;: Stellt das Lied an der Position TrackNumber in der Abspielliste als aktuelles Lied ein. Dabei kann als Tracknummer der Wert &amp;lt;code&amp;gt;Random&amp;lt;/code&amp;gt; angegeben werden. Dann wird eine zufällige Tracknummer ausgewählt (diese Ermittlung erfolgt nach Setzen der aktuellen Abspielliste, und erfolgt somit korrekt auf die gesamte zur Verfügung stehende Liste).&lt;br /&gt;
*Einstellungen zum Abspielen&lt;br /&gt;
**&amp;lt;code&amp;gt;Balance&amp;lt;/code&amp;gt;: Setzt die Balance auf den angegebenen Wert. Der Wert kann zwischen -100 (voll links) und 100 (voll rechts) liegen. Gibt die wirklich eingestellte Balance als Ergebnis zurück.&lt;br /&gt;
**&amp;lt;code&amp;gt;Bass&amp;lt;/code&amp;gt;: Setzt den Bass-Level auf den angegebenen Wert. Der Wert kann zwischen -10 und 10 liegen.&lt;br /&gt;
**&amp;lt;code&amp;gt;CrossfadeMode&amp;lt;/code&amp;gt;: Legt den Zustand des Crossfade-Mode fest. Liefert den aktuell gültigen Crossfade-Mode.&lt;br /&gt;
**&amp;lt;code&amp;gt;LEDState&amp;lt;/code&amp;gt;: Legt den Zustand der LED fest. Liefert den aktuell gültigen Zustand zurück.&lt;br /&gt;
**&amp;lt;code&amp;gt;Loudness&amp;lt;/code&amp;gt;: Aktiviert oder deaktiviert das Loudness (Bassanhebung bei geringen Lautstärken). Kann 0 oder 1 sein.&lt;br /&gt;
**&amp;lt;code&amp;gt;Mute &amp;lt;State&amp;gt;&amp;lt;/code&amp;gt;: Setzt den Mute-Zustand auf den angegebenen Wert. Der Wert kann on oder off sein. Liefert als Ergebnis den neuen Zustand.&lt;br /&gt;
**&amp;lt;code&amp;gt;MuteT&amp;lt;/code&amp;gt;: Schaltet den Mute-Zustand um. Liefert als Ergebnis den neuen Zustand.&lt;br /&gt;
**&amp;lt;code&amp;gt;Repeat&amp;lt;/code&amp;gt;: Legt den Zustand des Repeat-Zustands fest. Liefert den aktuell gültigen Repeat-Zustand.&lt;br /&gt;
**&amp;lt;code&amp;gt;RepeatOne&amp;lt;/code&amp;gt;: Legt den Zustand des RepeatOne-Zustands fest. Liefert den aktuell gültigen RepeatOne-Zustand.&lt;br /&gt;
**&amp;lt;code&amp;gt;RepeatOneT&amp;lt;/code&amp;gt;: Schaltet den Zustand des RepeatOne-Zustands um. Liefert den aktuell gültigen RepeatOne-Zustand.&lt;br /&gt;
**&amp;lt;code&amp;gt;RepeatT&amp;lt;/code&amp;gt;: Schaltet den Zustand des Repeat-Zustands um. Liefert den aktuell gültigen Repeat-Zustand.&lt;br /&gt;
**&amp;lt;code&amp;gt;Shuffle&amp;lt;/code&amp;gt;: Legt den Zustand des Shuffle-Zustands fest. Liefert den aktuell gültigen Shuffle-Zustand.&lt;br /&gt;
**&amp;lt;code&amp;gt;ShuffleT&amp;lt;/code&amp;gt;: Schaltet den Zustand des Shuffle-Zustands um. Liefert den aktuell gültigen Shuffle-Zustand.&lt;br /&gt;
**&amp;lt;code&amp;gt;SleepTimer &amp;lt;Timestring|Seconds&amp;gt;&amp;lt;/code&amp;gt;: Legt den aktuellen SleepTimer fest. Der Wert muss ein kompletter Zeitstempel sein (HH:MM:SS) (oder eine Zahl in Sekunden). Zum Deaktivieren darf der Zeitstempel nur Nullen enthalten oder das Wort &#039;off&#039;.&lt;br /&gt;
**&amp;lt;code&amp;gt;Treble&amp;lt;/code&amp;gt;: Setzt den Höhen-Level auf den angegebenen Wert. Der Wert kann zwischen -10 und 10 liegen.&lt;br /&gt;
**&amp;lt;code&amp;gt;Volume &amp;lt;VolumeLevel&amp;gt; [RampType]&amp;lt;/code&amp;gt;: Setzt die Lautstärke auf den angegebenen Wert. Der kann eine relative Angabe mittels + oder - sein. Dann wird um die entsprechende Höhe erhöht oder verringert. Wird eine relative Lautstärke angegeben, so kann diese mit einem folgenden Prozentzeichen als anteilige Änderung ausgeführt werden (z.B. +20%). Liefert als Ergebnis die neue Lautstärke.&amp;lt;br /&amp;gt;Als optionaler Parameter ist ein Ramptype zulässig. Mögliche Werte sind 1 (SLEEP_TIMER_RAMP_TYPE), 2 (AUTOPLAY_RAMP_TYPE) und 3 (ALARM_RAMP_TYPE). Die Werte entsprechen verschiedenen Mustern bei der Geschwindigkeit nach oben oder unten.&lt;br /&gt;
**&amp;lt;code&amp;gt;VolumeD&amp;lt;/code&amp;gt;: Verringert die Lautstärke um [VolumeStep]-Einheiten (Standardmäßig 7).&lt;br /&gt;
**&amp;lt;code&amp;gt;VolumeRestore&amp;lt;/code&amp;gt;: Stellt die mittels VolumeSave gespeicherte Lautstärke wieder her.&lt;br /&gt;
**&amp;lt;code&amp;gt;VolumeSave &amp;lt;VolumeLevel&amp;gt;&amp;lt;/code&amp;gt;: Setzt die Lautstärke auf den angegebenen Wert. Der kann eine relative Angabe mittels + oder - sein. Dann wird um die entsprechende Höhe erhöht oder verringert. Liefert als Ergebnis die neue Lautstärke. Zusätzlich wird die alte Lautstärke in einem Reading abgelegt, um sie wiederherstellen zu können.&lt;br /&gt;
**&amp;lt;code&amp;gt;VolumeU&amp;lt;/code&amp;gt;: Erhöht die Lautstärke um [VolumeStep]-Einheiten (Standardmäßig 7).&lt;br /&gt;
*Steuerung der aktuellen Abspielliste&lt;br /&gt;
**&amp;lt;code&amp;gt;AddURIToQueue &amp;lt;SongURI&amp;gt;&amp;lt;/code&amp;gt;: Fügt die angegebene Datei in die aktuelle Abspielliste an die Stelle hinter dem aktuellen Titel hinzu. Ändert nichts am aktuell abgespielten Titel.&amp;lt;br /&amp;gt;Zulässige Formate stehen unter &amp;lt;code&amp;gt;PlayURI&amp;lt;/code&amp;gt;.&lt;br /&gt;
***&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Es kann auch ein Radio-Stream hinzugefügt werden. Dieser wird auch normal abgespielt, wenn er dran ist. Dabei ist zu beachten, dass dieser Titel nie enden wird, und die Titel- und Interpretinformationen nicht dargestellt werden. Auch nicht die sonst üblichen Streaminformationen. Diese werden nur angezeigt, wenn der Stream mittels &amp;lt;code&amp;gt;PlayURI&amp;lt;/code&amp;gt; direkt (ohne Verwendung der Queue) abgespielt wird.&lt;br /&gt;
**&amp;lt;code&amp;gt;CurrentPlaylist&amp;lt;/code&amp;gt;: Setzt den Abspielmodus auf die aktuelle Abspielliste, startet aber keine Wiedergabe (z.B. nach dem Hören eines Radiostreams, wo die aktuelle Abspielliste zwar noch existiert, aber gerade &amp;quot;nicht verwendet&amp;quot; wird)&lt;br /&gt;
**&amp;lt;code&amp;gt;DeleteFromQueue &amp;lt;index_of_elems&amp;gt;&amp;lt;/code&amp;gt;:  Löscht die angegebenen Elemente aus der aktuellen Abspielliste. Die Angabe erfolgt über die Indizies der Titel. Es können die bei Perl-Array-üblichen Formate verwendet werden: &amp;quot;1..12,17,20..22&amp;quot;. Die Indizies beziehen sich auf die aktuell angezeigte Reihenfolge (diese unterscheidet sich zwischen der normalen Abspielweise und dem Shufflemodus).&lt;br /&gt;
**&amp;lt;code&amp;gt;DeletePlaylist&amp;lt;/code&amp;gt;: Löscht die bezeichnete Playliste. Zum möglichen Format des Playlistenamen unter &#039;&#039;&#039;LoadPlaylist&#039;&#039;&#039; nachsehen.&lt;br /&gt;
**&amp;lt;code&amp;gt;EmptyPlaylist&amp;lt;/code&amp;gt;: Löscht die aktuelle Abspielliste&lt;br /&gt;
**&amp;lt;code&amp;gt;LoadFavourite &amp;lt;FavouriteName&amp;gt;&amp;lt;/code&amp;gt;: Lädt den angegebenen Favoriten. Der Name bezeichnet einen Eintrag in der Sonos-Favoritenliste. Der Parameter sollte/kann URL-Encoded (z.B. mittels &#039;&#039;&#039;uri_escape()&#039;&#039;&#039; oder manuell) werden um auch Spezialzeichen zu ermöglichen.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Man kann anstatt des Namens auch einen regulären Ausdruck verwenden. Es dürfen keine Leerzeichen vorkommen. Der erste Treffer wird verwendet.&amp;lt;br /&amp;gt;Beispiele:&lt;br /&gt;
****&#039;&#039;&#039;/meine.hits/&#039;&#039;&#039; - Trifft Case-Sensitive auf z.B. &#039;&#039;&#039;meine hits&#039;&#039;&#039; zu. Auch &#039;&#039;&#039;meineXhits&#039;&#039;&#039; oder &#039;&#039;&#039;meine-hits&#039;&#039;&#039; wird gefunden.&lt;br /&gt;
****&#039;&#039;&#039;/(?i)meine.hits/&#039;&#039;&#039; - Trifft Case-Insensitive auf z.B. &#039;&#039;&#039;Meine Hits&#039;&#039;&#039; zu. Auch &#039;&#039;&#039;Meine-Hits&#039;&#039;&#039; wird gefunden.&lt;br /&gt;
***Folgende Unterscheidungen werden auf Basis des Typs des Sonos-Favoriten gemacht:&lt;br /&gt;
****Bei einem Playlist-Typ (z.B. Sonos-Playlist, Spotify-Playlist, usw.) wird die aktuelle Abspielliste geleert, mit dem neuen Inhalt befüllt und die Wiedergabe gestartet&lt;br /&gt;
****Bei einem Einzel-Eintrag (Direkter Titel, Radiosender, Spotify-Titel, usw) wird die aktuelle Abspielliste nicht angetastet, sondern der aktuelle Abspieleintrag entsprechend angepasst und gestartet&lt;br /&gt;
**&amp;lt;code&amp;gt;LoadPlaylist &amp;lt;Playlistname|FHEM-Devicename&amp;gt; [ListeVorherLeeren]&amp;lt;/code&amp;gt;: Lädt die benannte Playliste in die aktuelle Abspielliste. Der Parameter kann/muss URL-Encoded (z.B. mittels &#039;&#039;&#039;uri_escape()&#039;&#039;&#039; oder manuell) sein, um auch Leer- und Sonderzeichen angeben zu können. Wenn der Parameter &#039;&#039;ListeVorherLeeren&#039;&#039; mit &#039;&#039;1&#039;&#039; angegeben wurde, wird die aktuelle Abspielliste vor dem Import geleert. Standardmäßig wird hier eine &#039;&#039;1&#039;&#039; angenommen.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Man kann anstatt des Namens auch einen FHEM-Sonosplayer-Devicenamen angeben. Dann wird dessen aktuelle Abspielliste zum Player übertragen/kopiert.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Man kann anstatt des Namens auch einen regulären Ausdruck verwenden. Es dürfen keine Leerzeichen vorkommen. Der erste Treffer wird verwendet.&amp;lt;br /&amp;gt;Beispiele:&lt;br /&gt;
****&#039;&#039;&#039;/meine.hits/&#039;&#039;&#039; - Trifft Case-Sensitive auf z.B. &#039;&#039;&#039;meine hits&#039;&#039;&#039; zu. Auch &#039;&#039;&#039;meineXhits&#039;&#039;&#039; oder &#039;&#039;&#039;meine-hits&#039;&#039;&#039; wird gefunden.&lt;br /&gt;
****&#039;&#039;&#039;/(?i)meine.hits/&#039;&#039;&#039; - Trifft Case-Insensitive auf z.B. &#039;&#039;&#039;Meine Hits&#039;&#039;&#039; zu. Auch &#039;&#039;&#039;Meine-Hits&#039;&#039;&#039; wird gefunden.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Es kann auch ein Dateiname angegeben werden, um eine übliche M3U-Datei aus dem Filesystem zu laden. Dieser muss mit &amp;quot;&#039;&#039;&#039;file:&#039;&#039;&#039;&amp;quot; eingeleitet werden. Beispiel: &amp;quot;&#039;&#039;&#039;file:c:/Test.m3u&#039;&#039;&#039;&amp;quot;.&amp;lt;br /&amp;gt;Innerhalb der Datei selbst werden bislang folgende Sonderformate unterstützt:&lt;br /&gt;
****&#039;&#039;&#039;Spotify:&#039;&#039;&#039; Titel aus Spotify werden mit dem Kürzel &#039;&#039;x-sonos-spotify:&#039;&#039; begonnen.&lt;br /&gt;
****&#039;&#039;&#039;Napster/Rhapsody:&#039;&#039;&#039; Titel aus Napster/Rhapsody werden mit dem Kürzel &#039;&#039;npsdy:&#039;&#039; begonnen.&lt;br /&gt;
****&#039;&#039;Hinweise&#039;&#039;: Die Benutzernamen für diese Importe, die zum Zeitpunkt des Import bekannt sein müssen, müssen zuvor dem System bekannt gemacht werden. Ansonsten erscheint eine entsprechende Fehlermeldung.&amp;lt;br /&amp;gt;So kann der Benutzername für eines der Systeme bekannt gemacht werden:&lt;br /&gt;
*****Aktuelle Abspielliste eines Players leeren&lt;br /&gt;
*****Einen beliebigen Titel aus dem gewünschten Anbieter in die aktuelle Abspielliste einfügen. Dabei ist zu beachten, dass man das direkt aus der Auswahl des Anbietes heraus macht (also nicht über eine Playliste, Favoriten o.ä. Direktzugriffe)&lt;br /&gt;
*****Nun gibt es ein neues Reading am zentralen Sonos-Device, welches den Benutzernamen enthält. Um diesen Dauerhaft bereitzustellen, muss der Zustand mittels &#039;&#039;save&#039;&#039; gespeichert werden.&lt;br /&gt;
**&amp;lt;code&amp;gt;LoadRadio &amp;lt;Radiostationname&amp;gt;&amp;lt;/code&amp;gt;: Lädt den benannten Radiosender, genauer gesagt, den benannten Radiofavoriten. Dabei wird die bestehende Abspielliste beibehalten, aber deaktiviert. Der Parameter kann/muss URL-Encoded sein, um auch Leer- und Sonderzeichen angeben zu können.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Man kann anstatt des Namens auch einen regulären Ausdruck verwenden. Es dürfen keine Leerzeichen vorkommen. Der erste Treffer wird verwendet.&amp;lt;br /&amp;gt;Beispiele:&lt;br /&gt;
****&#039;&#039;&#039;/NRJ.90s/&#039;&#039;&#039; - Trifft Case-Sensitive auf z.B. &#039;&#039;&#039;NRJ 90s&#039;&#039;&#039; zu. Auch &#039;&#039;&#039;NRJx90s&#039;&#039;&#039; oder &#039;&#039;&#039;NRJ-90s&#039;&#039;&#039; wird gefunden.&lt;br /&gt;
****&#039;&#039;&#039;/(?i)nrj.90s/&#039;&#039;&#039; - Trifft Case-Insensitive auf z.B. &#039;&#039;&#039;NRJ 90s&#039;&#039;&#039; zu. Auch &#039;&#039;&#039;NRJ-90s&#039;&#039;&#039; wird gefunden.&lt;br /&gt;
**&amp;lt;code&amp;gt;LoadSearchlist &amp;lt;Kategoriename&amp;gt; &amp;lt;KategorieElement&amp;gt; [[TitelfilterRegEx]/[AlbumFilterRegEx]/[ArtistfilterRegEx] [[*]maxElem[+|-]]]&amp;lt;/code&amp;gt;: Hiermit kann die aktuelle Abspielliste mit Suchergebnissen aus der Sonos-Bibliothek gefüllt werden.&amp;lt;br /&amp;gt;Dazu kann man sich im Controller anschauen, wie die Suchstruktur aufgebaut ist:&lt;br /&gt;
***&#039;&#039;&#039;Kategoriename&#039;&#039;&#039;: kann &amp;quot;Albums&amp;quot;, &amp;quot;Artists&amp;quot;, &amp;quot;Composers&amp;quot;, &amp;quot;Contributing Artists&amp;quot;, &amp;quot;Genres&amp;quot;, &amp;quot;Playlists&amp;quot; oder &amp;quot;Tracks&amp;quot; sein. Leerzeichen müssen wie immer URI-Encoded sein (also &#039;&#039;%20&#039;&#039;). Diese Liste kann mit dem Get-Befehl &#039;&#039;SearchlistCategories&#039;&#039; ermittelt werden, da Sonos auch neue hinzufügen könnte.&amp;lt;br /&amp;gt;Man kann hier einen regulären Ausdruck mit &#039;&#039;/&#039;&#039; eingeschlossen angeben, z.B. &#039;&#039;/Contr.*/&#039;&#039;.&lt;br /&gt;
***&#039;&#039;&#039;KategorieElement&#039;&#039;&#039;: enthält einen zur Suchkategorie passenden Wert als gesamten Match. Kann/muss URI-Encoded (z.B. mittels &#039;&#039;&#039;uri_escape()&#039;&#039;&#039; oder manuell) sein.&amp;lt;br /&amp;gt;Man kann hier auch einen regulären Ausdruck mit &#039;&#039;/&#039;&#039; eingeschlossen angeben, z.B. &#039;&#039;/(?i)udo.jürgens/&#039;&#039;.&lt;br /&gt;
***&#039;&#039;&#039;Filter&#039;&#039;&#039;: Man kann reguläre Ausdrücke als Titel-, Album- oder Artistfilter angeben, der als ein Parameter mit &#039;&#039;/&#039;&#039; getrennt angegeben werden muss.&amp;lt;br /&amp;gt;Dieser Filter filtert die durch die beiden vorangehenden Werten vorgegebene Liste getrennt nach Titel, Album oder Artist, z.B. &#039;&#039;(?i)haus&#039;&#039; (enthält dann alles, was auf Haus im Titel ohne Berücksichtigung der Groß-/Kleinschreibung passt) oder &#039;&#039;(?i)haus//(?i)udo&#039;&#039; (enhält dann alles, was auf den Titel &#039;&#039;Haus&#039;&#039; und den Interpret &#039;&#039;Udo&#039;&#039; ohne Berücksichtigung der Groß-/Kleinschreibung passt) sowie z.B. &#039;&#039;/(?i)Best.of/&#039;&#039; (enthält dann alle Best-of-Alben beliebiger Interpreten).&lt;br /&gt;
****&#039;&#039;&#039;Beispiele&#039;&#039;&#039; für den Filter-Parameter:&lt;br /&gt;
*****&amp;lt;code&amp;gt;//Udo&amp;lt;/code&amp;gt;: Filtert nach dem Interpretenbestandteil &#039;&#039;Udo&#039;&#039;, der Titel ist beliebig. Alternative Schreibweise: &amp;lt;code&amp;gt;.*/.*/Udo&amp;lt;/code&amp;gt;&lt;br /&gt;
*****&amp;lt;code&amp;gt;Sahne&amp;lt;/code&amp;gt;: Filtert nach dem Titelbestandteil &#039;&#039;Sahne&#039;&#039;, das Album und der Interpret sind beliebig. Alternative Schreibweisen: &amp;lt;code&amp;gt;Sahne/.*/.*&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sahne//&amp;lt;/code&amp;gt;.&lt;br /&gt;
*****&amp;lt;code&amp;gt;Sahne//Udo&amp;lt;/code&amp;gt;: Filtert nach dem Titelbestandteil &#039;&#039;Sahne&#039;&#039; und dem Interpretenbestandteil &#039;&#039;Udo&#039;&#039;&lt;br /&gt;
*****&amp;lt;code&amp;gt;(?i)sahne//(?i)udo&amp;lt;/code&amp;gt;: Filtert nach dem Titelbestandteil &#039;&#039;sahne&#039;&#039; und dem Interpretenbestandteil &#039;&#039;udo&#039;&#039; ohne die Groß-/Kleinschreibung zu berücksichtigen.&lt;br /&gt;
*****&amp;lt;code&amp;gt;/(?i)best.of/&amp;lt;/code&amp;gt;: Filtert nach dem Albumtitel Best-of. Alternative Schreibweisen: &amp;lt;code&amp;gt;.*/(?i)best.of&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;.*/(?i)best.of/.*&amp;lt;/code&amp;gt;&lt;br /&gt;
***&#039;&#039;&#039;maxElem&#039;&#039;&#039;: Hiermit kann eine Begrenzung der einzutragenden Element angegeben werden. Des Weiteren kann hier durch ein vorangestelltes &#039;&#039;*&#039;&#039; eine Durchmischung der Ausgangsmenge erreicht werden, und durch ein nachgestelltes &#039;&#039;-&#039;&#039; das Leeren der aktuellen Abspielliste erreicht werden. Durch ein nachgestelltes &#039;&#039;+&#039;&#039; wird ein Anhängen der gefundenen Titel an das Ende der aktuellen Abspielliste erreicht (sonst wird hinter dem aktuellen Titel eingefügt).&amp;lt;br /&amp;gt;Eine Angabe von 0 übernimmt alle verfügbaren Titel.&amp;lt;br /&amp;gt;Diese Mengenbegrenzung erfolgt erst nach Anwendung der Filter auf die Ausgangsmenge (die Durchmischung ebenfalls). z.B. &#039;&#039;*20-&#039;&#039; (es werden nur 20 Titel ausgesucht, die Ausgangsmenge wird zuvor zufällig gemischt, und die aktuelle Abspielliste vor dem Einfügen geleert), &#039;&#039;*10&#039;&#039; (es werden 10 zufällige Titel zu der Abspielliste an der aktuellen Stelle hinzugefügt) oder &#039;&#039;10&#039;&#039; (es werden die ersten 10 Titel zu der Abspielliste an der aktuellen Stelle hinzugefügt).&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Wenn die Kategorie &#039;&#039;Tracks&#039;&#039; verwendet wird, wird der zweite Parameter (&#039;&#039;KategorieElement&#039;&#039;) nicht verwendet. Dieser muss als Platzhalter trotzdem vorhanden sein, und kann z.B. mit einem Punkt &#039;&#039;.&#039;&#039; angegeben werden.&lt;br /&gt;
***&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Wenn die Kategorie &#039;&#039;Tracks&#039;&#039; verwendet wird, werden *alle* Titel, die in der Sonos-Bibliothek enthalten sind, durchsucht. Das kann bei einer Bibliothek mit 20.000 Titeln locker mal 4 Minuten dauern. Dabei wird die Zeit hauptsächlich vom Sonosplayer verbraucht; Es ist also für die Laufzeit nicht relevant, ob das Modul z.B. auf einem Raspberry Pi oder einer leistungsfähigeren Hardware läuft.&amp;lt;br /&amp;gt;Bitte beachten, das während dieser Zeit keine Sonos-Nachrichten verarbeitet werden, und keine Befehle an die Player gesendet werden können. FHEM wird währenddessen nicht blockiert.&lt;br /&gt;
***&#039;&#039;&#039;Beispiele&#039;&#039;&#039;&amp;lt;br /&amp;gt;Bitte beachten, dass sich die Möglichkeiten nach der zugrundeliegenden Bibliothek richten.&lt;br /&gt;
****&amp;lt;code&amp;gt;set Sonos_Wohnzimmer LoadSearchlist Genres Synthpop .*/(?i)pet *20-&amp;lt;/code&amp;gt;: Hier wird das Genre &#039;&#039;Synthpop&#039;&#039; als Ausgangsliste verwendet und nach Interpreten mit &#039;&#039;pet&#039;&#039; gefiltert. Von dieser Menge werden 20 zufällige Einträge in die Abspielliste übernommen, die vorher geleert wurde.&lt;br /&gt;
****&amp;lt;code&amp;gt;set Sonos_Wohnzimmer LoadSearchlist /(?i)contr.*/ /(?i)pet.*?shop.*?boys/ / *10-&amp;lt;/code&amp;gt;: Hier werden die Teilnehmenden Interpreten nach den &#039;&#039;Pet Shop Boys&#039;&#039; durchsucht, und anschließend aus dieser Liste 10 beliebige Titel in die vorher geleerte Abspielliste übertragen. Es erfolgt keine zusätzliche Filterung.&lt;br /&gt;
****&amp;lt;code&amp;gt;set Sonos_Wohnzimmer LoadSearchlist Tracks . / *50-&amp;lt;/code&amp;gt;: Hier werden 50 beliebige Titel aus der gesamten Bibliothek in die Abspielliste übertragen. Bitte Hinweis zur Laufzeit beachten.&lt;br /&gt;
****&amp;lt;code&amp;gt;set Sonos_Wohnzimmer LoadSearchlist Tracks . /(?i)best.of/ *50-&amp;lt;/code&amp;gt;: Hier werden 50 zufällige Titel von Best-of-Alben aus der gesamten Bibliothek in die Abspielliste übertragen. Bitte Hinweis zur Laufzeit beachten.&lt;br /&gt;
**&amp;lt;code&amp;gt;SavePlaylist &amp;lt;Playlistname&amp;gt;&amp;lt;/code&amp;gt;: Speichert die aktuelle Abspielliste unter dem angegebenen Namen als Playliste ab. Dabei wird eine etwaig bestehende Liste gleichen Namens überschrieben. Der Parameter kann/muss URL-Encoded (z.B. mittels &#039;&#039;&#039;uri_escape()&#039;&#039;&#039; oder manuell) sein, um auch Leer- und Sonderzeichen angeben zu können.&lt;br /&gt;
***&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Es kann auch ein Dateiname angegeben werden, um eine übliche M3U-Datei im Filesystem zu erzeugen. Dieser muss mit &amp;quot;&#039;&#039;&#039;file:&#039;&#039;&#039;&amp;quot; eingeleitet werden. Beispiel: &amp;quot;&#039;&#039;&#039;file:c:/Test.m3u&#039;&#039;&#039;&amp;quot;.&amp;lt;br /&amp;gt;&#039;&#039;Nähere Informationen zum möglichen Inhalt der Datei siehe unter &#039;&#039;&#039;LoadPlayList&#039;&#039;&#039;.&#039;&#039;&lt;br /&gt;
*Gruppenbefehle&lt;br /&gt;
**&amp;lt;code&amp;gt;AddMember &amp;lt;Devicename&amp;gt;&amp;lt;/code&amp;gt;: Fügt dem Device das übergebene Device als Gruppenmitglied hinzu. Die Wiedergabe des aktuellen Devices bleibt erhalten, und wird auf das angegebene Device mit übertragen.&lt;br /&gt;
**&amp;lt;code&amp;gt;CreateStereoPair &amp;lt;rightPlayerDevicename&amp;gt;&amp;lt;/code&amp;gt;: Fügt dem Device das übergebene Device als rechtes Stereopaar-Element hinzu. Die Wiedergabe des aktuellen Devices bleibt erhalten (als linker Lautsprecher), und wird auf das angegebene Device mit übertragen (als rechter Lautsprecher).&lt;br /&gt;
**&amp;lt;code&amp;gt;GroupMute &amp;lt;State&amp;gt;&amp;lt;/code&amp;gt;: Setzt den Mute-Zustand für die komplette Gruppe in einem Schritt. Der Wert kann on oder off sein.&lt;br /&gt;
**&amp;lt;code&amp;gt;GroupVolume &amp;lt;VolumeLevel&amp;gt;&amp;lt;/code&amp;gt;: Setzt die Gruppenlautstärke. Das dafür verwendete Lautstärkenverhältnis muss zuvor einmal mittels der Anweisung &#039;&#039;&#039;SnapshotGroupVolume&#039;&#039;&#039; festgelegt worden sein.&lt;br /&gt;
***&#039;&#039;Hinweis&#039;&#039;: Wenn man &#039;&#039;&#039;GroupVolume&#039;&#039;&#039; aufruft, ohne vorher &#039;&#039;&#039;SnapshotGroupVolume&#039;&#039;&#039; aufgerufen zu haben, wird nur die Lautstärke des Players verändert wird, für den man den Aufruf durchführt.&lt;br /&gt;
**&amp;lt;code&amp;gt;MakeStandaloneGroup&amp;lt;/code&amp;gt;: Macht diesen Player zu seiner eigenen Gruppe.&lt;br /&gt;
**&amp;lt;code&amp;gt;RemoveMember &amp;lt;Devicename&amp;gt;&amp;lt;/code&amp;gt;: Entfernt dem Device das übergebene Device, sodass die beiden keine Gruppe mehr bilden. Die Wiedergabe des aktuellen Devices läuft normal weiter. Das abgetrennte Device stoppt seine Wiedergabe, und hat keine aktuelle Abspielliste mehr (seit Sonos Version 4.2 hat der Player wieder die Playliste von vorher aktiv).&lt;br /&gt;
**&amp;lt;code&amp;gt;SeparateStereoPair&amp;lt;/code&amp;gt;: Trennt das Stereopaar wieder auf.&lt;br /&gt;
**&amp;lt;code&amp;gt;SnapshotGroupVolume&amp;lt;/code&amp;gt;: Legt das Lautstärkeverhältnis der aktuellen Player der Gruppe für folgende &#039;&#039;&#039;GroupVolume&#039;&#039;&#039;-Aufrufe fest. Dieses festgelegte Verhältnis wird bis zum nächsten Aufruf von &#039;&#039;&#039;SnapshotGroupVolume&#039;&#039;&#039; beibehalten.&lt;br /&gt;
***&#039;&#039;Hinweis&#039;&#039;: Das einzelne Verstellen von Zoneplayer-Laustärken mittels &#039;&#039;&#039;Volume&#039;&#039;&#039; wird nicht im bereits gespeicherten Lautstärkenverhältnis aktualisiert/widergespiegelt. Hat man also nachträglich die Lautstärke eines einzelnen Players geändert (auch über den Controller), so muss &#039;&#039;&#039;SnapshotGroupVolume&#039;&#039;&#039; erneut aufgerufen werden, damit das Verhältnis bei einer weiteren Gruppenlautstärkenänderung wieder erhalten bleibt (ansonsten wird das alte Verhältnis vor der Lautstärkeänderung wiederhergestellt).&lt;br /&gt;
***&#039;&#039;Hinweis&#039;&#039;: Dieser Aufruf muss vor einem eventuellen Aufruf von &#039;&#039;&#039;GroupVolume&#039;&#039;&#039; erfolgen, da sonst nur die Lautstärke des Players verändert wird, für den man den Aufruf durchführt.&lt;br /&gt;
***&#039;&#039;Beispiel&#039;&#039; für eine Gruppe mit stark verschiedenen Lautstärken:&lt;br /&gt;
****Aufruf von &#039;&#039;&#039;SnapshotGroupVolume&#039;&#039;&#039; =&amp;gt; Aktuelles Lautstärkeverhältnis wird gespeichert&lt;br /&gt;
****Aufruf von &#039;&#039;&#039;GroupVolume 2&#039;&#039;&#039; =&amp;gt; Gruppe wird sehr leise gestellt, dabei sieht das relative Lautstärkeverhältnis fast gleich aus, da sich die Abstände immer weiter annähern&lt;br /&gt;
****Aufruf von &#039;&#039;&#039;GroupVolume 35&#039;&#039;&#039; =&amp;gt; Gruppe wird laut gestellt, dabei kommt wieder das vorhergehende Lautstärkeverhältnis zum tragen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nützliche Hilfs-Prozeduren aus den Modulen ==&lt;br /&gt;
Das Modul liefert eine Menge kleiner Hilfs-Prozeduren mit, die teilweise auch für die eigene Verwendung interessant sein können.&lt;br /&gt;
&lt;br /&gt;
*Grundsätzliches&lt;br /&gt;
**&amp;lt;code&amp;gt;SONOS_getAllSonosplayerDevices()&amp;lt;/code&amp;gt;: Liefert ein Array mit allen Sonosplayerdevices, die in FHEM definiert sind.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
***&amp;lt;code&amp;gt;my @allPlayer = SONOS_getAllSonosplayerDevices();&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Liefert alle Sonosplayer.&lt;br /&gt;
**&amp;lt;code&amp;gt;SONOSPLAYER_DeleteIfExists($name)&amp;lt;/code&amp;gt;: Löscht das Device mit dem übergebenen Namen, wenn es existiert.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
***&amp;lt;code&amp;gt;SONOSPLAYER_DeleteIfExists(&#039;Sonos_Wohnzimmer&#039;);&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Löscht das Device mit dem Namen &#039;&#039;Sonos_Wohnzimmer&#039;&#039;, sofern es existiert. Es wird also keine Fehlermeldung erzeugt, wenn das Device nicht existiert.&lt;br /&gt;
**&amp;lt;code&amp;gt;SONOS_GetTimeSeconds($timeStr)&amp;lt;/code&amp;gt;: Liefert die Anzahl der Sekunden, die vom übergebenen Zeitstring beschrieben werden. Der Zeitstring muss vom Format &amp;quot;H:M:S&amp;quot; sein. Die Zahlen könne auch mehrere Stellen umfassen.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
***&amp;lt;code&amp;gt;my $sec = SONOS_GetTimeSeconds(&#039;0:04:12&#039;)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Liefert die Anzahl der Sekunden des String &#039;0:04:12&#039;, in diesem Fall also &#039;&#039;252&#039;&#039;.&lt;br /&gt;
**&amp;lt;code&amp;gt;SONOS_LoadExportedSonosBibliothek($fileName, $deviceName, $internalName)&amp;lt;/code&amp;gt;: Lädt die angegebene Datei in das übergebene Device in das übergebene Internal. Vorher wird der Dateiinhalt per &#039;&#039;&#039;eval()&#039;&#039;&#039; in eine interne Datenstruktur umgewandelt. Damit kann eine zuvor mit &#039;&#039;&#039;ExportSonosBibliothek&#039;&#039;&#039; erzeugte Datei als Hash in ein beliebiges FHEM-Device eingelesen werden.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
***&amp;lt;code&amp;gt;SONOS_LoadExportedSonosBibliothek(&#039;c:/data.txt&#039;, &#039;MyDummyDevice&#039;, &#039;Bibliothek&#039;);&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Lädt die Datei &#039;&#039;&#039;c:/data.txt&#039;&#039;&#039; zunächst in einen Hash ein, und weist diesen Hash dann dem Device &#039;&#039;&#039;MyDummyDevice&#039;&#039;&#039; (kann ein beliebiges FHEM-Device sein) dem Internal &#039;&#039;&#039;Bibliothek&#039;&#039;&#039; zu.&lt;br /&gt;
**&amp;lt;code&amp;gt;SONOS_Max($param1, $param2)&amp;lt;/code&amp;gt;: Liefert den größeren der beiden übergebenen Parameter zurück.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
***&amp;lt;code&amp;gt;my $min = SONOS_Min(15, 23);&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Das Ergebnis ist &#039;&#039;23&#039;&#039;, da es der größere der beiden Werte ist.&lt;br /&gt;
**&amp;lt;code&amp;gt;SONOS_Min($param1, $param2)&amp;lt;/code&amp;gt;: Liefert den kleineren der beiden übergebenen Parameter zurück.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
***&amp;lt;code&amp;gt;my $min = SONOS_Min(15, 23);&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Das Ergebnis ist &#039;&#039;15&#039;&#039;, da es der kleinere der beiden Werte ist.&lt;br /&gt;
**&amp;lt;code&amp;gt;SONOS_isInList($search, @list)&amp;lt;/code&amp;gt;: Liefert &#039;&#039;1&#039;&#039;, wenn &#039;&#039;$search&#039;&#039; in &#039;&#039;@list&#039;&#039; enthalten ist, sonst &#039;&#039;0&#039;&#039;.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
***&amp;lt;code&amp;gt;my $exists = SONOS_isInList(&#039;Eins&#039;, qw(Eins Zwei Drei));&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Das Ergebnis ist &#039;&#039;true&#039;&#039; (bzw. &#039;&#039;1&#039;&#039;), da der String &#039;&#039;Eins&#039;&#039; in der Liste enthalten ist.&lt;br /&gt;
**&amp;lt;code&amp;gt;SONOS_posInList($search, @list)&amp;lt;/code&amp;gt;: Liefert die Position des gefundenen Strings &#039;&#039;$search&#039;&#039; in der Liste &#039;&#039;@list&#039;&#039;, wenn &#039;&#039;$search&#039;&#039; in &#039;&#039;@list&#039;&#039; enthalten ist, sonst &#039;&#039;-1&#039;&#039;. Zählt 0-basiert.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Beispiele&#039;&#039;&#039;:&lt;br /&gt;
***&amp;lt;code&amp;gt;my $pos = SONOS_posInList(&#039;Eins&#039;, qw(Eins Zwei Drei));&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Das Ergebnis ist &#039;&#039;0&#039;&#039;, da der String &#039;&#039;Eins&#039;&#039; in der Liste an der ersten Stelle enthalten ist.&lt;br /&gt;
***&amp;lt;code&amp;gt;my $pos = SONOS_posInList(&#039;Eins&#039;, qw(Zwei Eins Drei));&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Das Ergebnis ist &#039;&#039;1&#039;&#039;, da der String &#039;&#039;Eins&#039;&#039; in der Liste an der zweiten Stelle enthalten ist.&lt;br /&gt;
***&amp;lt;code&amp;gt;my $pos = SONOS_posInList(&#039;Vier&#039;, qw(Eins Zwei Drei));&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Das Ergebnis ist &#039;&#039;-1&#039;&#039;, da der String &#039;&#039;Vier&#039;&#039; in der Liste nicht enthalten ist.&lt;br /&gt;
**&amp;lt;code&amp;gt;SONOS_Stringify($elem)&amp;lt;/code&amp;gt;: Liefert eine Stringrepräsentation der übergebenen Datenstruktur. Diese Struktur darf nicht rekursiv sein, da sonst eine Endlosschleife auftritt.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
***&amp;lt;code&amp;gt;my @list = qw(Eins Zwei Drei); my $string = SONOS_Stringify(\@list);&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Liefert eine Stringrepräsentation des Arrayparameters. In diesem Fall also &amp;lt;code&amp;gt;[&#039;Eins&#039;, &#039;Zwei&#039;, &#039;Drei&#039;]&amp;lt;/code&amp;gt;&lt;br /&gt;
*Gruppenfunktionen&lt;br /&gt;
**&amp;lt;code&amp;gt;SONOSPLAYER_GetMasterPlayerName($name)&amp;lt;/code&amp;gt;: Liefert den Namen des Masterplayerdevices zu einem übergebenen Sonosplayer-Devicenamen. Sollte der Player nicht Bestandteil einer Gruppe sein, dann wird der Name des übergebenen Players zurückgegeben.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
***&amp;lt;code&amp;gt;my $groupMasterName = SONOSPLAYER_GetMasterPlayerName(&#039;Sonos_Wohnzimmer&#039;);&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Liefert den Masterplayernamen der Gruppe, in der sich der Wohnzimmerplayer gerade befindet.&lt;br /&gt;
**&amp;lt;code&amp;gt;SONOSPLAYER_GetSlavePlayerNames($name)&amp;lt;/code&amp;gt;: Liefert die Teilnehmer einer Gruppe. Der Master wird nicht mit zurückgegeben. Man kann den Namen eines beliebigen Teilnehmers angeben.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
***&amp;lt;code&amp;gt;my @member = SONOSPLAYER_GetSlavePlayerNames(&#039;Sonos_Wohnzimmer&#039;);&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Liefert alle Teilnehmer der Gruppe in der sich der Player &#039;&#039;Sonos_Wohnzimmer&#039;&#039; gerade befindet. Der Master der Gruppe wird nicht mitgeliefert.&lt;br /&gt;
**&amp;lt;code&amp;gt;SONOSPLAYER_GetRealTargetPlayerHash($hash)&amp;lt;/code&amp;gt;: Liefert den Hash des Masterplayerdevices zu einem übergebenen Sonosplayer-Devicehash. Sollte der Player nicht Bestandteil einer Gruppe sein, dann wird der Hash des übergebenen Players zurückgegeben.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
***&amp;lt;code&amp;gt;my $groupMasterHash = SONOSPLAYER_GetRealTargetPlayerHash($defs{&#039;Sonos_Wohnzimmer&#039;});&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Liefert den Masterplayerhash der Gruppe, in der sich der Wohnzimmerplayer gerade befindet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Die Funktionalität &amp;quot;ExportSonosBibliothek&amp;quot; ===&lt;br /&gt;
Die Funktionalität &#039;&#039;ExportSonosBibliothek&#039;&#039; ermöglicht einen kompletten Export der Struktur und Titelinformationen wie sie in dem Bereich &#039;&#039;Bibliothek&#039;&#039; des Sonos-Controllers dargestellt wird.&lt;br /&gt;
Dabei wird ein großer Perl-Hash erzeugt, der sowohl die Struktur als auch die eigentlichen Titel enthält. Im Bereich &#039;&#039;Struktur&#039;&#039; werden auf unterster (Titel-)Ebene die IDs der zugehörigen Titel als Verweis abgelegt, sodass man diese nicht mehrfach im Hash vorliegen hat.&lt;br /&gt;
Im Bereich &#039;&#039;Titel&#039;&#039; werden alle irgendwo referenzierten Titel mit ihren IDs und allen von Sonos übermittelten Informationen abgelegt.&lt;br /&gt;
&lt;br /&gt;
Das Ermitteln dauert einige Zeit. Als Beispiel: Mein WindowsServer mit Intel Core i5 mit 2.8GHz benötigt für meine ca. 22.000 Titel 28 Minuten und 1GB RAM zum Ermitteln. Die resultierende Datendatei ist ca. 90MB groß.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Das Grundkonzept ====&lt;br /&gt;
Es gibt einen Setter &#039;&#039;ExportSonosBibliothek&#039;&#039; am Sonosplayer-Device, der eine Datei mit dem übergebenen Dateinamen erzeugt. In dieser Datei wird der komplette Datenhash als textuelle, und damit per &amp;lt;code&amp;gt;eval()&amp;lt;/code&amp;gt; einlesbare, Darstellung gespeichert. &lt;br /&gt;
Die Cover der Titel werden als Aufruf auf den verwendeten Player erzeugt, und es wird berücksichtigt, ob man die Proxy-Einstellung aktiviert hat.&lt;br /&gt;
&lt;br /&gt;
Um diese Datei wieder einzulesen, kann die mitgelieferte Prozedur &amp;lt;code&amp;gt;SONOS_LoadExportedSonosBibliothek($fileName, $deviceName, $internalName)&amp;lt;/code&amp;gt; verwendet werden. Diese legt den geladenen Datenhash in einem Internal mit übergebenem Namen im benannten FHEM-Device ab. Das muss kein Sonosplayer-Device sein, sondern kann auch ein Dummy bzw. ein beliebiges FHEM-Device sein.&lt;br /&gt;
&lt;br /&gt;
Von hier aus kann man mit anderen Methodiken auf diese Daten zugreifen. Durch die Dateiablage kann die Datei auch über einen Neustart hinweg verwendet werden, da die Ermittlung ja etwas Zeit in Anspruch nimmt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Mit Vorsicht ist z.B. der Bereich unter &#039;&#039;Tracks&#039;&#039; zu sehen, da dort alle(!) Titel auftauchen werden. Das kann eine Auswahlmöglichkeit auf einer (Web-)Oberfläche schnell mal sprengen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Das Datenformat ====&lt;br /&gt;
Grundsätzlich gibt es zwei Bereiche im Hash: Einen für die Struktur und einen für die Titel. &lt;br /&gt;
Die Struktur ist dann mit einem dynamischen Unterbaum ausgestattet, um die nächsten Ebenen zu repräsentieren. Welche Ebenen dort vohanden sind, und wie tief die Verschachtelung geht, kann sich u.U. in Zukunft ändern, wenn Sonos dort Anpassungen vornimmt.&lt;br /&gt;
Die Titel sind als eine Liste ohne weitere Verschachtelung abgelegt.&lt;br /&gt;
&lt;br /&gt;
Hier der Hash mit einigen Dummy-Beispieldaten, um den Inhalt zu verdeutlichen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my $hash = &lt;br /&gt;
{&#039;Structure&#039; =&amp;gt; {&lt;br /&gt;
    &#039;A:PLAYLISTS&#039; =&amp;gt; {&lt;br /&gt;
        &#039;ID&#039; =&amp;gt; &#039;A:PLAYLISTS&#039;,&lt;br /&gt;
        &#039;Type&#039; =&amp;gt; &#039;Container&#039;,&lt;br /&gt;
        &#039;Title&#039; =&amp;gt; &#039;Playlists&#039;,&lt;br /&gt;
        &#039;Children&#039; =&amp;gt; {}&lt;br /&gt;
    },&lt;br /&gt;
    &#039;A:GENRE&#039; =&amp;gt; {&lt;br /&gt;
        &#039;ID&#039; =&amp;gt; &#039;A:GENRE&#039;,&lt;br /&gt;
        &#039;Type&#039; =&amp;gt; &#039;Container&#039;,&lt;br /&gt;
        &#039;Title&#039; =&amp;gt; &#039;Genres&#039;,&lt;br /&gt;
        &#039;Children&#039; =&amp;gt; {}&lt;br /&gt;
    },&lt;br /&gt;
    &#039;A:ALBUM&#039; =&amp;gt; {&lt;br /&gt;
        &#039;ID&#039; =&amp;gt; &#039;A:ALBUM&#039;,&lt;br /&gt;
        &#039;Type&#039; =&amp;gt; &#039;Container&#039;,&lt;br /&gt;
        &#039;Title&#039; =&amp;gt; &#039;Albums&#039;,&lt;br /&gt;
        &#039;Children&#039; =&amp;gt; {&lt;br /&gt;
            &#039;A:ALBUM/Chaos&#039; =&amp;gt; {&lt;br /&gt;
                &#039;ID&#039; =&amp;gt; &#039;A:ALBUM/Chaos&#039;,&lt;br /&gt;
                &#039;Type&#039; =&amp;gt; &#039;Container&#039;,&lt;br /&gt;
                &#039;Title&#039; =&amp;gt; &#039;Chaos&#039;,&lt;br /&gt;
                &#039;Artist&#039; =&amp;gt; &#039;Herbert Grönemeyer&#039;,&lt;br /&gt;
                &#039;Cover&#039; =&amp;gt; &#039;/Pfad/zum/Cover/auch/mit/proxy/pfad&#039;,&lt;br /&gt;
                &#039;Children&#039; =&amp;gt; {&lt;br /&gt;
                    &#039;TitleID1&#039; =&amp;gt; {&lt;br /&gt;
                        &#039;ID&#039; =&amp;gt; &#039;TitleID1&#039;,&lt;br /&gt;
                        &#039;Type&#039; =&amp;gt; &#039;Track&#039;&lt;br /&gt;
                    },&lt;br /&gt;
                    &#039;TitleID2&#039; =&amp;gt; {&lt;br /&gt;
                        &#039;ID&#039; =&amp;gt; &#039;TitleID2&#039;,&lt;br /&gt;
                        &#039;Type&#039; =&amp;gt; &#039;Track&#039;&lt;br /&gt;
                    },&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &#039;A:ALBUM/Testalbum&#039; =&amp;gt; {&lt;br /&gt;
                &#039;ID&#039; =&amp;gt; &#039;A:ALBUM/Testalbum&#039;,&lt;br /&gt;
                &#039;Type&#039; =&amp;gt; &#039;Container&#039;,&lt;br /&gt;
                &#039;Title&#039; =&amp;gt; &#039;Testalbum&#039;,&lt;br /&gt;
                &#039;Artist&#039; =&amp;gt; &#039;Hansi Fischer&#039;,&lt;br /&gt;
                &#039;Cover&#039; =&amp;gt; &#039;/Pfad/zum/Cover/auch/mit/proxy/pfad&#039;,&lt;br /&gt;
                &#039;Children&#039; =&amp;gt; {&lt;br /&gt;
                    &#039;TitleID1&#039; =&amp;gt; {&lt;br /&gt;
                        &#039;ID&#039; =&amp;gt; &#039;TitleID3&#039;,&lt;br /&gt;
                        &#039;Type&#039; =&amp;gt; &#039;Track&#039;&lt;br /&gt;
                    },&lt;br /&gt;
                    &#039;TitleID2&#039; =&amp;gt; {&lt;br /&gt;
                        &#039;ID&#039; =&amp;gt; &#039;TitleID4&#039;,&lt;br /&gt;
                        &#039;Type&#039; =&amp;gt; &#039;Track&#039;&lt;br /&gt;
                    },&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &#039;A:TRACKS&#039; =&amp;gt; {&lt;br /&gt;
        &#039;ID&#039; =&amp;gt; &#039;A:TRACKS&#039;,&lt;br /&gt;
        &#039;Type&#039; =&amp;gt; &#039;Container&#039;,&lt;br /&gt;
        &#039;Title&#039; =&amp;gt; &#039;Tracks&#039;,&lt;br /&gt;
        &#039;Children&#039; =&amp;gt; {}&lt;br /&gt;
    },&lt;br /&gt;
    &#039;A:COMPOSER&#039; =&amp;gt; {&lt;br /&gt;
        &#039;ID&#039; =&amp;gt; &#039;A:COMPOSER&#039;,&lt;br /&gt;
        &#039;Type&#039; =&amp;gt; &#039;Container&#039;,&lt;br /&gt;
        &#039;Title&#039; =&amp;gt; &#039;Composers&#039;,&lt;br /&gt;
        &#039;Children&#039; =&amp;gt; {}&lt;br /&gt;
    },&lt;br /&gt;
    &#039;A:ARTIST&#039; =&amp;gt; {&lt;br /&gt;
        &#039;ID&#039; =&amp;gt; &#039;A:ARTIST&#039;,&lt;br /&gt;
        &#039;Type&#039; =&amp;gt; &#039;Container&#039;,&lt;br /&gt;
        &#039;Title&#039; =&amp;gt; &#039;Contributing Artists&#039;,&lt;br /&gt;
        &#039;Children&#039; =&amp;gt; {}&lt;br /&gt;
    },&lt;br /&gt;
    &#039;A:ALBUMARTIST&#039; =&amp;gt; {&lt;br /&gt;
        &#039;ID&#039; =&amp;gt; &#039;A:ALBUMARTIST&#039;,&lt;br /&gt;
        &#039;Type&#039; =&amp;gt; &#039;Container&#039;,&lt;br /&gt;
        &#039;Title&#039; =&amp;gt; &#039;Artists&#039;,&lt;br /&gt;
        &#039;Children&#039; =&amp;gt; {}&lt;br /&gt;
    }&lt;br /&gt;
 },&lt;br /&gt;
 &#039;Titles&#039; =&amp;gt; {&lt;br /&gt;
     &#039;TitleID1&#039; =&amp;gt; {&lt;br /&gt;
         &#039;ID&#039; =&amp;gt; &#039;TitleID1&#039;,&lt;br /&gt;
         &#039;TrackURI&#039; =&amp;gt; &#039;/Pfad/zur/Datei.mp3&#039;,&lt;br /&gt;
         &#039;Title&#039; =&amp;gt; &#039;Titel des Musikstücks&#039;,&lt;br /&gt;
         &#039;Artist&#039; =&amp;gt; &#039;Interpret des Musikstücks&#039;,&lt;br /&gt;
         &#039;Album&#039; =&amp;gt; &#039;Titel des Albums&#039;,&lt;br /&gt;
         &#039;AlbumArtist&#039; =&amp;gt; &#039;Interpret des Albums&#039;,&lt;br /&gt;
         &#039;Cover&#039; =&amp;gt; &#039;/Pfad/zum/Cover/auch/mit/proxy/pfad&#039;,&lt;br /&gt;
         &#039;OriginalTrackNumber&#039; =&amp;gt; 5&lt;br /&gt;
     }, &lt;br /&gt;
     &#039;TitleIDn&#039; =&amp;gt; {&lt;br /&gt;
         &#039;ID&#039; =&amp;gt; &#039;TitleIDn&#039;,&lt;br /&gt;
         &#039;TrackURI&#039; =&amp;gt; &#039;/Pfad/zur/Datei.mp3&#039;,&lt;br /&gt;
         &#039;Title&#039; =&amp;gt; &#039;Titel des Musikstücks&#039;,&lt;br /&gt;
         &#039;Artist&#039; =&amp;gt; &#039;Interpret des Musikstücks&#039;,&lt;br /&gt;
         &#039;Album&#039; =&amp;gt; &#039;Titel des Albums&#039;,&lt;br /&gt;
         &#039;AlbumArtist&#039; =&amp;gt; &#039;Interpret des Albums&#039;,&lt;br /&gt;
         &#039;Cover&#039; =&amp;gt; &#039;/Pfad/zum/Cover/auch/mit/proxy/pfad&#039;,&lt;br /&gt;
         &#039;OriginalTrackNumber&#039; =&amp;gt; 5&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Wie kann es angezeigt werden? ====&lt;br /&gt;
(Das soll noch erweitert werden...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was wird alles automatisch erzeugt? ==&lt;br /&gt;
Hier soll kurz beschrieben werden, welche Elemente der automatische Erkennungsprozess anlegt, und welche Funktion diese haben.&lt;br /&gt;
&lt;br /&gt;
=== Automatische Zoneplayererkennung ===&lt;br /&gt;
Erkannte Zoneplayer werden als &#039;&#039;&#039;SONOSPLAYER&#039;&#039;&#039;-Device angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define Sonos_Wohnzimmer SONOSPLAYER RINCON_000E5828D0F401400_MR&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Name des Device wird aus dem Namen des SONOS-Device und dem Namen der Zone gebildet. Dabei werden Leer- und Sonderzeichen in &amp;quot;&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;&amp;quot; umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Beim Anlegen werden automatisch einige Attribute mit angelegt, am Beispiel eines Wohnzimmer-Players:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Sonos_Wohnzimmer generateInfoSummarize1 &amp;lt;NormalAudio&amp;gt;&amp;lt;Artist prefix=&amp;quot;(&amp;quot; suffix=&amp;quot;)&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;Title prefix=&amp;quot; &#039;&amp;quot; suffix=&amp;quot;&#039;&amp;quot; ifempty=&amp;quot;[Keine Musikdatei]&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;Album prefix=&amp;quot; vom Album &#039;&amp;quot; suffix=&amp;quot;&#039;&amp;quot;/&amp;gt;&amp;lt;/NormalAudio&amp;gt; &lt;br /&gt;
		&amp;lt;StreamAudio&amp;gt;&amp;lt;Sender suffix=&amp;quot;:&amp;quot;/&amp;gt;&amp;lt;SenderCurrent prefix=&amp;quot; &#039;&amp;quot; suffix=&amp;quot;&#039; -&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;SenderInfo prefix=&amp;quot; &amp;quot;/&amp;gt;&amp;lt;/StreamAudio&amp;gt;&lt;br /&gt;
attr Sonos_Wohnzimmer generateInfoSummarize2 &amp;lt;TransportState/&amp;gt;&amp;lt;InfoSummarize1 prefix=&amp;quot; =&amp;gt; &amp;quot;/&amp;gt;&lt;br /&gt;
attr Sonos_Wohnzimmer generateInfoSummarize3 &amp;lt;Volume prefix=&amp;quot;Lautstärke: &amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;Mute instead=&amp;quot; ~ Kein Ton&amp;quot; ifempty=&amp;quot; ~ Ton An&amp;quot; emptyval=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
		 ~ Balance: &amp;lt;Balance ifempty=&amp;quot;Mitte&amp;quot; emptyval=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;HeadphoneConnected instead=&amp;quot; ~ Kopfhörer aktiv&amp;quot; &lt;br /&gt;
			ifempty=&amp;quot; ~ Kein Kopfhörer&amp;quot; emptyval=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
attr Sonos_Wohnzimmer icon icoSONOSPLAYER_icon-ZP90.png&lt;br /&gt;
attr Sonos_Wohnzimmer room Sonos&lt;br /&gt;
attr Sonos_Wohnzimmer stateVariable presence&lt;br /&gt;
attr Sonos_Wohnzimmer group Wohnzimmer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch ist dieses Device direkt in der FHEM-Oberfläche steuerbar. Auch hier gilt, dass man das natürlich anpassen kann. Das sollen nur vereinfachende Vorgaben sein.&lt;br /&gt;
Das Attribut &amp;quot;&amp;lt;code&amp;gt;room&amp;lt;/code&amp;gt;&amp;quot; wird wieder aus dem Namen des SONOS-Device gebildet.&lt;br /&gt;
Das Attribut &amp;quot;&amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt;&amp;quot; wird aus dem Namen der Zone gebildet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Zusätzliche Readingsgroups, die zunächst nichts anzeigen ===&lt;br /&gt;
Es werden zusätzliche [[readingsGroup]]s angelegt, die zunächst keine Inhalte anzeigen. Diese lesen das der Readingsgroup entsprechende Reading &#039;&#039;Favourites&#039;&#039;, &#039;&#039;Radios&#039;&#039; oder &#039;&#039;Playlists&#039;&#039; aus.&lt;br /&gt;
Um diese Readings zu füllen gibt es bereits ein angelegtes &#039;&#039;&#039;userReadings&#039;&#039;&#039;, welches auf die Get-Aufrufe von &#039;&#039;FavouritesWithCovers&#039;&#039;, &#039;&#039;RadiosWithCovers&#039;&#039; oder &#039;&#039;PlaylistsWithCovers&#039;&#039; reagiert und die entsprechenden Readings füllt.&lt;br /&gt;
&lt;br /&gt;
Unter [[#Beispiel für eine ReadingsGroup für die Darstellung von Listen (Favoriten, Playlisten und Radios)|Beispiel für eine ReadingsGroup für die Darstellung von Listen (Favoriten, Playlisten und Radios)]] gibt es Beispiele für ein at-Statement, mit dem diese Readings automatisch gefüllt werden können. &lt;br /&gt;
Damit werden diese auch in FHEM aktualisiert, wenn man diese am Sonos-Controller verändert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definition der InfoSummarize ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
infoSummarizeX := &amp;lt;NormalAudio&amp;gt;:sumElem:&amp;lt;/NormalAudio&amp;gt; &amp;lt;StreamAudio&amp;gt;:sumElem:&amp;lt;/StreamAudio&amp;gt;|&lt;br /&gt;
	:sumElem:&lt;br /&gt;
sumElem := &amp;lt;:variable:[ prefix=&amp;quot;:text:&amp;quot;][ suffix=&amp;quot;:text:&amp;quot;][ instead=&amp;quot;:text:&amp;quot;]&lt;br /&gt;
	[ ifempty=&amp;quot;:text:&amp;quot;][ emptyval=&amp;quot;:text:&amp;quot;]/&amp;gt;&lt;br /&gt;
variable := TransportState|NumberOfTracks|Track|TrackDuration|Title|Artist|Album|&lt;br /&gt;
	OriginalTrackNumber|AlbumArtist|Sender|SenderCurrent|SenderInfo|StreamAudio|NormalAudio|&lt;br /&gt;
	AlbumArtURI|nextTrackDuration|nextTrackURI|nextAlbumArtURI|nextTitle|nextArtist|&lt;br /&gt;
	nextAlbum|nextAlbumArtist|nextOriginalTrackNumber|Volume|Mute|Shuffle|Repeat|RepeatOne|&lt;br /&gt;
	CrossfadeMode|Balance|HeadphoneConnected|SleepTimer|Presence|RoomName|RoomNameAlias|&lt;br /&gt;
	SaveRoomName|PlayerType|Location|SoftwareRevision|SerialNum|InfoSummarize1|InfoSummarize2|&lt;br /&gt;
	InfoSummarize3|InfoSummarize4&lt;br /&gt;
text := [Beliebiger Text ohne doppelte Anführungszeichen]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Unterscheidung zwischen &amp;lt;code&amp;gt;&amp;lt;NormalAudio&amp;gt;&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;&amp;lt;StreamAudio&amp;gt;&amp;lt;/code&amp;gt; liegt bei der anliegenden Musikquelle. Gestreamte Audioquellen habe nur einen kleineren Set an Informationen vorliegen, während bei einer &amp;quot;normalen&amp;quot; Musikquelle z.B. eine Unterscheidung zwischen Artist und Title gemacht wird, und im Gegenzug z.B. kein Sendername existiert.&amp;lt;br /&amp;gt;&lt;br /&gt;
Man kann diese Unterscheidung auch weglassen, und direkt die Variablenausgaben hinschreiben. Dann gilt der Code für beide Musikquellenarten gleichermaßen (u.U. sind dann einige Felder nicht sinnvoll bzw. gar nicht gefüllt).&lt;br /&gt;
&lt;br /&gt;
Die Tag-Erweiterungen &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;suffix&amp;lt;/code&amp;gt; werden jeweils vor bzw. hinter den Feldwert in die Ausgabe gesetzt, wenn es einen Feldwert zum Ausgeben gibt. &amp;lt;br /&amp;gt;&lt;br /&gt;
Die Erweiterung &amp;lt;code&amp;gt;instead&amp;lt;/code&amp;gt; wird anstatt des Feldwerts ausgegeben, wenn normalerweise der Feldwert ausgegeben werden würde (abhängig davon, ob der Feldwert als &#039;&#039;empty&#039;&#039; angesehen wird, oder nicht).&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Erweiterung &amp;lt;code&amp;gt;ifempty&amp;lt;/code&amp;gt; wird eingesetzt, wenn es gerade &#039;&#039;keinen&#039;&#039; Feldinhalt gibt. In diesem Fall werden natürlich auch keine Pre- und Suffixe sowie Instead-Angaben ausgegeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Erweiterung &amp;lt;code&amp;gt;emptyval&amp;lt;/code&amp;gt; legt fest, was neben einem undefinierten Feldwert noch als &#039;&#039;leer&#039;&#039; gelten soll. Dies ist interessant, wenn man z.B. den Zahlwert &#039;&#039;0&#039;&#039; als &#039;&#039;leer&#039;&#039; festlegen möchte.&amp;lt;br /&amp;gt;&lt;br /&gt;
Beim Definieren dieser Erweiterungen ist zu beachten, dass keine doppelten Anführungszeichen angegeben werden. Diese zerstören die weitere, interne Verarbeitung durch FHEM (Irgendwas ist immer :-)&lt;br /&gt;
Desweiteren können Verweise auf andere &amp;lt;code&amp;gt;InfoSummarize&amp;lt;/code&amp;gt;-Felder nur in aufsteigender Reihenfolge erfolgen. Es sind also keine Vorwärtsreferenzen oder Rekursionen möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlende Kommandos ==&lt;br /&gt;
Sollte eine Steuerungsmöglichkeit oder Information fehlen, oder anderes gewünscht sein, dann einfach eine Nachricht ins Forum. Meistens läßt sich da was machen :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ideenpipeline ===&lt;br /&gt;
Folgende Ideen sind bereits in der gedanklichen Pipeline. Aber alles Schritt für Schritt und der Reihe nach:&lt;br /&gt;
*&#039;&#039;&#039;Momentan Leer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Erledigte Ideen:&lt;br /&gt;
*&#039;&#039;&#039;Zwischendurchsage&#039;&#039;&#039;: Eine Datei abspielen, und danach wieder an der alten Stelle mit der alten Lautstärke weiterspielen (In Version 1.5 hinzugekommen)&lt;br /&gt;
*&#039;&#039;&#039;Beliebige MP3s in die Queue legen oder abspielen&#039;&#039;&#039;: Entgegen dem Controllergefühl kann man sehr wohl völlig frei abspielbare Dateien in der Queue haben. Es kann nur sein, das man kein Cover oder ähnliches angezeigt bekommt (noch zu testen). (In Version 1.5 hinzugekommen, Cover funktionieren wie immer)&lt;br /&gt;
*&#039;&#039;&#039;Beliebige Radiostationen abspielen&#039;&#039;&#039;: Hier gilt das gleich wie für die MP3s. (In Version 1.5 hinzugekommen, Cover und Streaminformationen funktionieren beim Direktabspielen, aus der Queue heraus wird nur der Stream abgespielt)&lt;br /&gt;
*&#039;&#039;&#039;Lautstärkegrenzen festlegen&#039;&#039;&#039;: Damit soll festgelegt werden können, in welchen Grenzen die Lautstärke überhaupt verändert werden kann. Das soll in der entsprechenden Zone natürlich auch für die normalen Sonos-Controller gelten. Dabei werden explizit &#039;&#039;keine&#039;&#039; Readings im FHEM aktualisiert, da eine Lautstärkeänderung sonst von der Verarbeitungsgeschwindigkeit von FHEM (inkl. seiner Notifies) abhängig wäre. (In Version 1.8 hinzugekommen)&lt;br /&gt;
*&#039;&#039;&#039;Zonentopologie verwenden/anpassen&#039;&#039;&#039;: Es soll eine Speichermöglichkeit für die aktuelle Topologie geschaffen werden, und auch eine neue Topologie gesetzt werden können. Ich stelle mir da eine Art von &amp;quot;Szenen&amp;quot; vor die man nach Bedarf setzen und dann natürlich auch steuern kann. Diese Szenen sollen den Gruppierungszustand aller verfügbaren ZonePlayer repräsentieren (können), also wer mit wem in einer Gruppe ist, und wer der jeweilige Koordinator ist (nur dieser kann die Steuerung entgegennehmen, und für die gesamte Gruppe ausführen). (In Version 2.0 hinzugekommen)&lt;br /&gt;
*&#039;&#039;&#039;Button-Events&#039;&#039;&#039;: Es soll eine Möglichkeit zum direkten Reagieren auf Tastenevents am Player existieren. Man soll verschiedene Tastensequenzen festlegen können, die dann FHEM-Events erzeugen, auf die man reagieren kann. (In Version 2.0 hinzugekommen)&lt;br /&gt;
*&#039;&#039;&#039;relatives Spulen&#039;&#039;&#039;: während einer Wiedergabe soll mit &amp;quot;currentTrackPosition x&amp;quot; mit x festgelegt werden, umwieviel sekunden vorgespult werden soll. Analog dazu das zurückspulen (In Version vom 12.3.2017 hinzugekommen)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Hier können mit der Zeit ein paar Beispiele eingestellt werden, um die Möglichkeiten zu verdeutlichen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Die Codebeispiele wurden umgebaut, damit diese für eine Bearbeitung über die FHEMWeb-Oberfläche passend sind. Wenn man die Beispiele direkt in einer Konfigurationsdatei verwenden möchte, so müssen die &#039;&#039;&#039;;&#039;&#039;&#039; maskiert werden (also verdoppelt).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel zum Loggen aller Aktionen auf allen Playern ===&lt;br /&gt;
&amp;lt;pre&amp;gt;define FileLog_Sonos_Actions FileLog /path/to/log/Sonos_Actions-%Y-%m.log \&lt;br /&gt;
		Sonos_.*:.*LastActionResult.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hiermit wird jede Aktion, die, durch FHEM verursacht, an die Player gesendet wurde, mitgeschrieben. Sehr praktisch für Fehlersuche, bzw. die Kontrolle darüber, was eigentlich von FHEM aus so auf den Playern gesteuert wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel zum automatischen Abspielen einer Liste nach dem Einschalten eines Players ===&lt;br /&gt;
&amp;lt;pre&amp;gt;define Sonos_Wohnzimmer_Appeared_Notify notify Sonos_Wohnzimmer:presence:.appeared { \&lt;br /&gt;
	fhem &amp;quot;set Sonos_Wohnzimmer LoadPlaylist R.%20Spielliste&amp;quot; ; \&lt;br /&gt;
	fhem &amp;quot;set Sonos_Wohnzimmer Volume 15&amp;quot; ; \&lt;br /&gt;
	fhem &amp;quot;set Sonos_Wohnzimmer Track random&amp;quot; ; \&lt;br /&gt;
	fhem &amp;quot;set Sonos_Wohnzimmer Play&amp;quot; \&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird auf das Event &#039;&#039;&#039;presence: appeared&#039;&#039;&#039; reagiert und eine Playlist geladen (hier mit Leerzeichen im Namen, darum mittels &amp;quot;&amp;lt;code&amp;gt;%20&amp;lt;/code&amp;gt;&amp;quot; HTML-kodiert, was wiederum bei FHEM-Featurelevel &amp;lt; 5.7 wegen FHEM-Notify auf &amp;quot;&amp;lt;code&amp;gt;%%20&amp;lt;/code&amp;gt;&amp;quot; kodiert werden müsste). Anschließend wird die Lautstärke gesetzt, ein Titel ausgewählt (zufällig) und das Abspielen gestartet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da dies aber auch bei einem Neustart von FHEM getriggert wird, kann man noch eine zusätzliche Prüfung einbauen:&lt;br /&gt;
&amp;lt;pre&amp;gt;define Sonos_Wohnzimmer_Appeared_Notify notify Sonos_Wohnzimmer:presence:.appeared { \&lt;br /&gt;
	if (ReadingsVal(&#039;Sonos_Wohnzimmer&#039;, &#039;numberOfTracks&#039;, -1) == 0) {\&lt;br /&gt;
		fhem &amp;quot;set Sonos_Wohnzimmer LoadPlaylist R.%20Spielliste&amp;quot; ; \&lt;br /&gt;
		fhem &amp;quot;set Sonos_Wohnzimmer Volume 15&amp;quot; ; \&lt;br /&gt;
		fhem &amp;quot;set Sonos_Wohnzimmer Track random&amp;quot; ; \&lt;br /&gt;
		fhem &amp;quot;set Sonos_Wohnzimmer Play&amp;quot; \&lt;br /&gt;
	}\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch das Reading &#039;&#039;&#039;currentTrackURI&#039;&#039;&#039; prüfen, je nachdem, was mit dem Player passieren soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine Verstärkerschaltung auf Basis des Player-Zustands ===&lt;br /&gt;
&amp;lt;pre&amp;gt;define Sonos_Wohnzimmer_GoPlaying_Notify notify Sonos_Wohnzimmer:transportState.*PLAYING { \&lt;br /&gt;
			fhem &amp;quot;delete wohnzimmer_Sonos_Ton_Off_Timer&amp;quot; ; \&lt;br /&gt;
			if (Value(&#039;wohnzimmer_Sonos_Ton&#039;) ne &#039;on&#039;) { \&lt;br /&gt;
				fhem &amp;quot;set wohnzimmer_Sonos_Ton on&amp;quot; \&lt;br /&gt;
			} \&lt;br /&gt;
		}&lt;br /&gt;
define Sonos_Wohnzimmer_GoNotPlaying_Notify notify \&lt;br /&gt;
		Sonos_Wohnzimmer:transportState.*(STOPPED|PAUSED_PLAYBACK) { \&lt;br /&gt;
			fhem &amp;quot;delete wohnzimmer_Sonos_Ton_Off_Timer&amp;quot; ; \&lt;br /&gt;
			fhem &amp;quot;define wohnzimmer_Sonos_Ton_Off_Timer at +00:05:00 \&lt;br /&gt;
				set wohnzimmer_Sonos_Ton off&amp;quot; \&lt;br /&gt;
		}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird beim Wechsel des &amp;lt;code&amp;gt;transportState&amp;lt;/code&amp;gt; auf &amp;quot;&amp;lt;code&amp;gt;PLAYING&amp;lt;/code&amp;gt;&amp;quot; der Verstärker angeschaltet, und beim Wechsel auf &amp;quot;&amp;lt;code&amp;gt;STOPPED&amp;lt;/code&amp;gt;&amp;quot; oder &amp;quot;&amp;lt;code&amp;gt;PAUSED_PLAYBACK&amp;lt;/code&amp;gt;&amp;quot; ein Timer zum Ausschalten des Verstärkers in 5 Minuten definiert.&amp;lt;br /&amp;gt;Der Timer ist notwendig, da beim Wechsel zwischen einem &amp;quot;normalen&amp;quot; Titel und einem Radiostream ein kurzer Zwischenwechsel auf &amp;quot;&amp;lt;code&amp;gt;STOPPED&amp;lt;/code&amp;gt;&amp;quot; erfolgt, und ich nicht den Verstärker innerhalb von ein paar Sekunden aus- und wieder einschalten will.&lt;br /&gt;
&lt;br /&gt;
Das Ganze geht mittlerweile viel kürzer mit dem Modul [[DOIF]]:&lt;br /&gt;
&amp;lt;pre&amp;gt;define Sonos_Wohnzimmer_PlayingCheck DOIF ([Sonos_Wohnzimmer:transportState] eq &amp;quot;PLAYING&amp;quot;) \&lt;br /&gt;
	(set wohnzimmer_Sonos_Ton on) DOELSE (set wohnzimmer_Sonos_Ton off)&lt;br /&gt;
attr Sonos_Wohnzimmer_PlayingCheck wait 0:300&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für das Loggen des gerade abgespielten Titels ===&lt;br /&gt;
&amp;lt;pre&amp;gt;define FileLog_Sonos_Wohnzimmer FileLog /etc/fhem/log/Sonos_Wohnzimmer-%Y-%m.log \&lt;br /&gt;
		Sonos_Wohnzimmer:infoSummarize2:.{2,}&lt;br /&gt;
attr FileLog_Sonos_Wohnzimmer room Sonos&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird bei jedem Wechsel des Titels oder des Abspielzustands ein Eintrag ins Log geschrieben. Damit kann man, auch bei einem Radiosender, verfolgen, welche Titel zu welcher Zeit so über den Player gelaufen sind :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine Stummschaltung bei einem Anruf ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define fritzBox_anrufstartring_notify notify fritzBox:.*ring set Sonos_Wohnzimmer VolumeSave 15&lt;br /&gt;
define fritzBox_anrufstartcall_notify notify fritzBox:.*call set Sonos_Wohnzimmer VolumeSave +0&lt;br /&gt;
define fritzBox_anrufende_notify notify fritzBox:.*disconnect set Sonos_Wohnzimmer VolumeRestore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Trigger auf &#039;call&#039; existiert nur, damit ausgehende Telefonate beim Beenden nicht die Lautstärke verändern. Das passiert, weil das Disconnected-Event auch nach ausgehenden Anrufen kommt.&amp;lt;br /&amp;gt;Das Beispiel kann man natürlich noch beliebig erweitern, vielleicht etwas mit Anrufererkennung usw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine Anrufsignalisierung per MP3 bei einem Anruf ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define fritzBox_anrufstartringsong_notify notify fritzBox:.*ring set Sonos_Wohnzimmer \&lt;br /&gt;
		PlayURITemp \\Server\Audio\RingRingRing.mp3 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird bei Anruf die angegebene MP3-Datei temporär mit der Lautstärke 30 eingeblendet. Wenn die Datei abgespielt wurde, wird der vorherige Zustand im Player wiederhergestellt, und es geht weiter, wo unterbrochen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für beide Varianten beim Telefonanruf gleichzeitig ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define fritzBox_anrufstartring_notify notify fritzBox:.*ring set Sonos_Wohnzimmer VolumeSave 15 \&lt;br /&gt;
		;; set Sonos_Wohnzimmer PlayURITemp \\Server\Audio\RingRingRing.mp3 30&lt;br /&gt;
define fritzBox_anrufstartcall_notify notify fritzBox:.*call set Sonos_Wohnzimmer VolumeSave +0&lt;br /&gt;
define fritzBox_anrufende_notify notify fritzBox:.*disconnect set Sonos_Wohnzimmer VolumeRestore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel soll nur die Kombinationsmöglichkeiten verdeutlichen, und hat mehr spielerischen Character.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine Sprachdurchsage auf Basis eines Notify ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define wohnzimmer_Tastenfeld_1_Notify notify wohnzimmer_Tastenfeld_1 set Sonos_Wohnzimmer Speak \&lt;br /&gt;
		45 de Hier dann die Textnachricht, wie sie auf dem Player ausgegeben werden soll.&lt;br /&gt;
define wohnzimmer_Tastenfeld_2_Notify notify wohnzimmer_Tastenfeld_2 set Sonos_Wohnzimmer Speak \&lt;br /&gt;
		+10 de Hier dann die Textnachricht, wie sie auf dem Player ausgegeben werden soll.&lt;br /&gt;
define wohnzimmer_Tastenfeld_3_Notify notify wohnzimmer_Tastenfeld_3 set Sonos_Wohnzimmer Speak \&lt;br /&gt;
		+0 en Hello, this is a short message.&lt;br /&gt;
&lt;br /&gt;
define wohnzimmer_Tastenfeld_4_doif DOIF ([EnO_switch:?B0] and [?06:00-09:05]) \&lt;br /&gt;
    ({my $temp = &amp;quot;Außentemperatur: &amp;quot; . ReadingsVal(&amp;quot;MeinWetter&amp;quot;,&amp;quot;temperature&amp;quot;,&amp;quot;unbekannt&amp;quot;) . \&lt;br /&gt;
    &amp;quot; °C. Höchsttemperatur: &amp;quot; . ReadingsVal(&amp;quot;MeinWetter&amp;quot;,&amp;quot;fc1_high_c&amp;quot;,&amp;quot;unbekannt&amp;quot;) . &amp;quot; °.&amp;quot;;; \&lt;br /&gt;
    fhem &amp;quot;set Sonos_Bad Speak 30 de $temp&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1: Hier wird auf Basis eines Notify (hier ein FS20-Taster) eine Textnachricht auf Deutsch mit der Lautstärke 45 auf dem SonosPlayer ausgegeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
2: Hier wird eine deutsche Textnachricht mit 10 Einheiten lauter als aktuell eingestellt ausgegeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
3: Hier wird eine englische Textnachricht mit der gleichen Lautstärke wie aktuell eingestellt ausgegeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
4: Hier wird, wenn der EnOcean-Taster rechts oben (&amp;quot;B0&amp;quot;) zwischen 6:00 und 9:05 Uhr gedrückt wird, die aktuelle Außentemperatur und die Tageshöchsttemperatur (vom [[weather]]-Modul) in Lautstärke 30 ausgegeben (nicht mit [[notify]], sondern mit [[DOIF]] realisiert).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für das Reagieren auf Tastenevents ===&lt;br /&gt;
Hier ein Beispiel, wie man die Tasten an einem Play5 (und natürlich auch an jedem anderen Player) zu einer einfachen, autarken Steuerung programmieren kann.&lt;br /&gt;
&lt;br /&gt;
Grundlagen, die ich zur allgemeinen Vereinfachung in meiner &amp;lt;code&amp;gt;99_myUtils.pm&amp;lt;/code&amp;gt; habe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Wird benötigt, da ein reDefine nur einen Befehl aufrufen kann&lt;br /&gt;
sub pauseMuteOff($) {&lt;br /&gt;
  my ($devName) = @_;&lt;br /&gt;
&lt;br /&gt;
  if (defined($main::defs{$devName})) {&lt;br /&gt;
    fhem(&amp;quot;set $devName Pause&amp;quot;);&lt;br /&gt;
    fhem(&amp;quot;set $devName Mute Off&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Löscht ein Define, wenn es existiert. Damit kann man dynamische AT-Defines löschen, &lt;br /&gt;
# ohne zu wissen, ob sie überhaupt existieren&lt;br /&gt;
sub deleteDefineIfExists($) {&lt;br /&gt;
  my ($devName) = @_;&lt;br /&gt;
&lt;br /&gt;
  if (defined($main::defs{$devName})) {&lt;br /&gt;
    fhem(&amp;quot;delete $devName&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Definiert ein define neu; Heisst, es wird, wenn es bereits existiert, gelöscht und neu angelegt&lt;br /&gt;
sub reDefine($$) {&lt;br /&gt;
  my ($devName, $define) = @_;&lt;br /&gt;
&lt;br /&gt;
  deleteDefineIfExists($devName);&lt;br /&gt;
  fhem(&#039;define &#039;.$devName.&#039; &#039;.$define);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Attribut am Sonosplayer-Device:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Sonos_Schlafzimmer buttonEvents 1:MM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notify-Defines, die die Steuerung übernehmen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Sonos_Schlafzimmer_WantPlaying_Notify notify Sonos_Schlafzimmer:ButtonEvent:.MM \&lt;br /&gt;
	set Sonos_Schlafzimmer Play&lt;br /&gt;
define Sonos_Schlafzimmer_WantStopPlaying notify Sonos_Schlafzimmer:Mute.*1 \&lt;br /&gt;
	{ reDefine(&#039;Schlafzimmer_Sonos_Stop_Timer&#039;, &#039;at +00:00:30 \&lt;br /&gt;
		{ pauseMuteOff(&amp;quot;Sonos_Schlafzimmer&amp;quot;) }&#039;) }&lt;br /&gt;
define Sonos_Schlafzimmer_WantStopPlayingOff notify Sonos_Schlafzimmer:Mute.*0 \&lt;br /&gt;
	{ deleteDefineIfExists(&#039;Schlafzimmer_Sonos_Stop_Timer&#039;) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird mittels des Attributs &amp;lt;code&amp;gt;buttonEvents&amp;lt;/code&amp;gt; ein Event bei zweimaligen Drücken von &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;ute innerhalb von 1 Sekunde definiert. &lt;br /&gt;
Anschließend wird auf dieses Event reagiert, indem der Player mit der Wiedergabe beginnen soll.&lt;br /&gt;
Desweiteren wird auf das Ändern von Mute reagiert, indem beim Aktivieren von Mute (also einmal drücken) ein Timer gestartet wird, der nach 30 Sekunden die Wiedergabe anhält, und den Mute-Zustand wieder zurücksetzt. Das letzte notify existiert nur, damit man das Beenden der Wiedergabe innerhalb der 30 Sekunden noch verhindern kann.&lt;br /&gt;
&lt;br /&gt;
Hier ist zu beachten, dass diese Events natürlich nicht unterscheiden können, ob das ganze am Player selbst oder über einen Controller geschaltet wurde. Von beiden Stellen aus kann diese Funktionalität verursacht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für einen Offline-Sprachsynthetisierer ===&lt;br /&gt;
Man kann mit den Attributen &#039;&#039;Speak1&#039;&#039;, &#039;&#039;Speak2&#039;&#039;, &#039;&#039;Speak3&#039;&#039; und &#039;&#039;Speak4&#039;&#039; am zentralen Sonos-Device Kommandozeilen definieren, die einen Text in eine Sounddatei umwandeln.&lt;br /&gt;
Hier soll dies am Beispiel von &#039;&#039;espeak&#039;&#039; verdeutlicht werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wav:/usr/bin/espeak -v %language% -w %filename% &amp;quot;%text%&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst muss das Ausgabedateiformat definiert werden, damit die internen Funktionen entsprechend reagieren können. Anschließend wird die Befehlszeile mit den entsprechenden Platzhaltern angegeben.&lt;br /&gt;
Hier muss beachtet werden, dass der Platzhalter &#039;&#039;%language%&#039;&#039; mit dem zweiten Parameter der FHEM-Befehlseingabe gefüllt wird. In diesem Beispiel muss man dort also &#039;&#039;german&#039;&#039; angeben (anstatt &#039;&#039;de&#039;&#039; bei Google), um eine deutsche Ausgabe zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel hat den kleinen Nachteil, dass die Ausgabe in einer WAV-Datei erfolgt, die keinerlei Tag-Informationen tragen kann. Um das zu ändern, kann man einen Konverter nachschalten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mp3:/usr/bin/espeak -v %language% --stdout &amp;quot;%text%&amp;quot; | /usr/bin/avconv -i - %filename%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird die Ausgabe von &#039;&#039;espeak&#039;&#039; direkt in das MP3-Format umgewandelt, und intern mit den entsprechenden Tags versehen. Hier ist allerdings der Nachteil, dass es etwas länger dauert (auf meinem Raspberry Pi ca. 1-3 Sekunden).&lt;br /&gt;
&lt;br /&gt;
Die in diesem Beispiel verwendeten Pakete können unter Debian mittels der Anweisungen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install espeak&lt;br /&gt;
sudo apt-get install ffmpeg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
installiert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel zu InfoSummarize ===&lt;br /&gt;
Standard, wie er angelegt wird:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
InfoSummarize1 = &amp;lt;NormalAudio&amp;gt;&amp;lt;Artist prefix=&amp;quot;(&amp;quot; suffix=&amp;quot;)&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;Title prefix=&amp;quot; &#039;&amp;quot; suffix=&amp;quot;&#039;&amp;quot; ifempty=&amp;quot;[Keine Musikdatei]&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;Album prefix=&amp;quot; vom Album &#039;&amp;quot; suffix=&amp;quot;&#039;&amp;quot;/&amp;gt;&amp;lt;/NormalAudio&amp;gt; \&lt;br /&gt;
	&amp;lt;StreamAudio&amp;gt;&amp;lt;Sender suffix=&amp;quot;:&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;SenderCurrent prefix=&amp;quot; &#039;&amp;quot; suffix=&amp;quot;&#039; -&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;SenderInfo prefix=&amp;quot; &amp;quot;/&amp;gt;&amp;lt;/StreamAudio&amp;gt;&lt;br /&gt;
InfoSummarize2 = &amp;lt;TransportState/&amp;gt;&amp;lt;InfoSummarize1 prefix=&amp;quot; =&amp;gt; &amp;quot;/&amp;gt;&lt;br /&gt;
InfoSummarize3 = &amp;lt;Volume prefix=&amp;quot;Lautstärke: &amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;Mute instead=&amp;quot; ~ Kein Ton&amp;quot; ifempty=&amp;quot; ~ Ton An&amp;quot; emptyval=&amp;quot;0&amp;quot;/&amp;gt;\&lt;br /&gt;
	 ~ Balance: &amp;lt;Balance ifempty=&amp;quot;Mitte&amp;quot; emptyval=&amp;quot;0&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;HeadphoneConnected instead=&amp;quot; ~ Kopfhörer aktiv&amp;quot; ifempty=&amp;quot; ~ Kein Kopfhörer&amp;quot; \&lt;br /&gt;
		emptyval=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass man auf andere InfoSummarize-Felder verweisen darf, solange man diese nur in aufsteigender Reihenfolge verwendet. Rekursionen oder Vorwärtrsreferenzen werden nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Hier noch ein Beispiel, um die Informationen des nächsten Titels zusammenzufassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
InfoSummarize4 = &amp;lt;NormalAudio&amp;gt;Nächster Titel: &amp;lt;nextArtist prefix=&amp;quot;(&amp;quot; suffix=&amp;quot;)&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;nextTitle prefix=&amp;quot; &#039;&amp;quot; suffix=&amp;quot;&#039;&amp;quot; ifempty=&amp;quot;[Keine Musikdatei]&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;nextAlbum prefix=&amp;quot; vom Album &#039;&amp;quot; suffix=&amp;quot;&#039;&amp;quot;/&amp;gt;&amp;lt;/NormalAudio&amp;gt;\&lt;br /&gt;
	&amp;lt;StreamAudio&amp;gt;Kein nächster Titel ermittelbar&amp;lt;/StreamAudio&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine Cover-Anzeige des nächsten Titels ===&lt;br /&gt;
Mit diesem Beispiel wird gezeigt, wie man sich einen Weblink für die Anzeige des Covers des nächsten Titels erzeugen kann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define NextAlbumArt_Wohnzimmer weblink image fhem/icons/SONOSPLAYER/Sonos_Wohnzimmer_NextAlbumArt&lt;br /&gt;
attr NextAlbumArt_Wohnzimmer group Wohnzimmer&lt;br /&gt;
attr NextAlbumArt_Wohnzimmer htmlattr width=&amp;quot;200&amp;quot;&lt;br /&gt;
attr NextAlbumArt_Wohnzimmer room Sonos&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für das Übertragen eines Titels an einen anderen Player ===&lt;br /&gt;
Mein Sohn hat öfter den Wunsch, einen gerade im Wohnzimmer laufenden Titel auch in seine eigene Abspielliste zu bekommen. Der Weg am Sonos-Controller über eine gespeicherte Playliste ist dabei sehr umständlich.&lt;br /&gt;
Ich habe ein 8-fach Sensorfeld an der Wohnzimmerwand, wo ich ein Feld dafür programmiert habe, das Reading &#039;&#039;currentTrackURI&#039;&#039; mittels der Set-Anweisung &#039;&#039;AddURIToQueue&#039;&#039; in die aktuelle Abspielliste meines Sohnes zu packen.&lt;br /&gt;
Das ist natürlich nichts besonderes, aber vielleicht für den einen oder anderen auch eine nette Idee:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define wohnzimmer_Sensorfeld_Notify notify wohnzimmer_Sensorfeld { \&lt;br /&gt;
	fhem &amp;quot;set Sonos_Sohnemann AddURIToQueue &amp;quot;.\&lt;br /&gt;
		ReadingsVal(&amp;quot;Sonos_Wohnzimmer&amp;quot;, &amp;quot;currentTrackURI&amp;quot;, &amp;quot;&amp;quot;) \&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine eigene ReadingsGroup zur Darstellung der Cover- und Titelinformationen ===&lt;br /&gt;
Wenn man das Standarddesign der generierten [[readingsGroup]] überarbeiten möchte, muss man sich einfach eine eigene Prozedur in der &#039;&#039;&#039;99_myUtils.pm&#039;&#039;&#039; anlegen, die dann in der [[readingsGroup]] verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
Da die Original-Vorlage wegen des Vollbildmodus sehr umfangreich ist, gibt es hier nur eine abgespeckte Version, die nur die Anzeige selbst übernimmt. Wer gerne den Vollbildmodus anpassen möchte, kann sich die entsprechende Prozedur &#039;&#039;&#039;SONOS_getCoverTitleRG&#039;&#039;&#039; einfach aus dem Modulcode kopieren (umbenennen nicht vergessen).&lt;br /&gt;
&lt;br /&gt;
Hier die Vorlage der drei Prozeduren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub getCoverTitleRG($;$$) {&lt;br /&gt;
	my ($device, $width, $space) = @_;&lt;br /&gt;
	$width = 500 if (!defined($width));&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;lt;div style=&amp;quot;float: left;&amp;quot;&amp;gt;&#039;.getCoverRG($device).\&lt;br /&gt;
		&#039;&amp;lt;/div&amp;gt;&amp;lt;div style=&amp;quot;margin-left: 150px; min-width: &#039;.$width.\&lt;br /&gt;
		&#039;px;&amp;gt;&#039;.getTitleRG($device, $space).&#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub getCoverRG($;$) {&lt;br /&gt;
	my ($device) = @_;&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;lt;img style=&amp;quot;margin-right: 5px; border: 1px solid lightgray; \&lt;br /&gt;
		height: 175px&amp;quot; src=&amp;quot;&#039;.ReadingsVal($device, &#039;currentAlbumArtURL&#039;, &#039;&#039;).&#039;&amp;quot; /&amp;gt;&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub SONOS_getTitleRG($;$) {&lt;br /&gt;
	my ($device, $space) = @_;&lt;br /&gt;
	$space = 20 if (!defined($space));&lt;br /&gt;
	&lt;br /&gt;
	my $infoString = &#039;&#039;;&lt;br /&gt;
	&lt;br /&gt;
	my $transportState = ReadingsVal($device, &#039;transportState&#039;, &#039;&#039;);&lt;br /&gt;
	$transportState = &#039;Spiele&#039; if ($transportState eq &#039;PLAYING&#039;);&lt;br /&gt;
	$transportState = &#039;Pausiere&#039; if ($transportState eq &#039;PAUSED_PLAYBACK&#039;);&lt;br /&gt;
	$transportState = &#039;Stop bei&#039; if ($transportState eq &#039;STOPPED&#039;);&lt;br /&gt;
  &lt;br /&gt;
	# Läuft Radio oder ein &amp;quot;normaler&amp;quot; Titel&lt;br /&gt;
	if (ReadingsVal($device, &#039;currentNormalAudio&#039;, 1) == 1) {&lt;br /&gt;
		$infoString = sprintf(&#039;&amp;lt;div style=&amp;quot;margin-left: -150px;&amp;quot;&amp;gt;%s Titel %s \&lt;br /&gt;
			von %s&amp;lt;br /&amp;gt;Titel: &amp;lt;b&amp;gt;%s&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;Interpret: &amp;lt;b&amp;gt;%s&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;Album: \&lt;br /&gt;
			&amp;lt;b&amp;gt;%s&amp;lt;/b&amp;gt;&amp;lt;div style=&amp;quot;height: %dpx;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;.encode(&#039;UTF-8&#039;, \&lt;br /&gt;
			&#039;Nächste Wiedergabe:&#039;).&#039;&amp;lt;/div&amp;gt;&amp;lt;div style=&amp;quot;float: left; margin-left: \&lt;br /&gt;
			0px;&amp;quot;&amp;gt;&amp;lt;img style=&amp;quot;margin: 0px; padding: 0px; margin-right: 5px; \&lt;br /&gt;
			border: 1px solid lightgray;&amp;quot; height=&amp;quot;55&amp;quot;  border=&amp;quot;0&amp;quot; src=&amp;quot;%s&amp;quot; /&amp;gt;\&lt;br /&gt;
			&amp;lt;/div&amp;gt;&amp;lt;div style=&amp;quot;margin-left: 0px;&amp;quot;&amp;gt;Titel: %s&amp;lt;br /&amp;gt;Artist: %s&amp;lt;br /&amp;gt;\&lt;br /&gt;
			Album: %s&amp;lt;/div&amp;gt;&#039;,&lt;br /&gt;
				$transportState, &lt;br /&gt;
				ReadingsVal($device, &#039;currentTrack&#039;, &#039;&#039;), &lt;br /&gt;
				ReadingsVal($device, &#039;numberOfTracks&#039;, &#039;&#039;),&lt;br /&gt;
				ReadingsVal($device, &#039;currentTitle&#039;, &#039;&#039;),&lt;br /&gt;
				ReadingsVal($device, &#039;currentArtist&#039;, &#039;&#039;),&lt;br /&gt;
				ReadingsVal($device, &#039;currentAlbum&#039;, &#039;&#039;),&lt;br /&gt;
				$space,&lt;br /&gt;
				ReadingsVal($device, &#039;nextAlbumArtURL&#039;, &#039;&#039;),&lt;br /&gt;
				ReadingsVal($device, &#039;nextTitle&#039;, &#039;&#039;),&lt;br /&gt;
				ReadingsVal($device, &#039;nextArtist&#039;, &#039;&#039;),&lt;br /&gt;
				ReadingsVal($device, &#039;nextAlbum&#039;, &#039;&#039;));&lt;br /&gt;
	} else {&lt;br /&gt;
		$infoString = sprintf(&#039;&amp;lt;div style=&amp;quot;margin-left: -150px;&amp;quot;&amp;gt;%s Radiostream\&lt;br /&gt;
			&amp;lt;br /&amp;gt;Sender: &amp;lt;b&amp;gt;%s&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;Info: &amp;lt;b&amp;gt;%s&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&#039;.encode(&#039;UTF-8&#039;, \&lt;br /&gt;
			&#039;Läuft:&#039;).&#039; &amp;lt;b&amp;gt;%s&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&#039;,&lt;br /&gt;
				$transportState,&lt;br /&gt;
				ReadingsVal($device, &#039;currentSender&#039;, &#039;&#039;),&lt;br /&gt;
				ReadingsVal($device, &#039;currentSenderInfo&#039;, &#039;&#039;),&lt;br /&gt;
				ReadingsVal($device, &#039;currentSenderCurrent&#039;, &#039;&#039;));&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return $infoString;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese kann man als Kopiervorlage für eigene Ideen verwenden. Die Backslashs vor den Zeilenumbrüchen sind hauptsächlich der Optik halber hier. Generell empfehle ich die so getrennten Befehle in eine Zeile zu schreiben...&lt;br /&gt;
&lt;br /&gt;
Hier noch eine beispielhafte [[readingsGroup]] dazu:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Sonos_WohnzimmerRG readingsGroup Sonos_Wohnzimmer:\&lt;br /&gt;
	&amp;lt;{getCoverTitleRG($DEVICE)}@infoSummarize1&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine ReadingsGroup für die Darstellung von Listen (Favoriten, Playlisten und Radios) ===&lt;br /&gt;
Es gibt eine mitgelieferte Prozedur, die für diese Darstellung verwendet werden kann. Diese stellt die Listen einfach als zweispaltige Tabelle dar (links das Cover, rechts der Titel als ausführbarer Link).&lt;br /&gt;
Für die Datenlieferung (z.B. die Favoriten in einem Reading) muss man sich noch ein entsprechendes userReading schaffen.&lt;br /&gt;
Beim Generieren der Devices vom Autocreate-Mechanismus werden diese Elemente und Attribute bereits mit erzeugt. Es muss lediglich ein Automatismus zum Aktualisieren des entsprechenden Readings geschaffen werden, oder dieses einmal manuell ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Hier die Vorlage für das userReadings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Sonos_Wohnzimmer userReadings Favourites:LastActionResult.*?\&lt;br /&gt;
	GetFavouritesWithCovers.* { if (ReadingsVal($name, \&lt;br /&gt;
	&amp;quot;LastActionResult&amp;quot;, &amp;quot;&amp;quot;) =~ m/.*?: (.*)/) { return $1; } }, Radios:\&lt;br /&gt;
	LastActionResult.*?GetRadiosWithCovers.* { if (ReadingsVal($name, \&lt;br /&gt;
	&amp;quot;LastActionResult&amp;quot;, &amp;quot;&amp;quot;) =~ m/.*?: (.*)/) { return $1; } }, Playlists:\&lt;br /&gt;
	LastActionResult.*?GetPlaylistsWithCovers.* { if (ReadingsVal($name, \&lt;br /&gt;
	&amp;quot;LastActionResult&amp;quot;, &amp;quot;&amp;quot;) =~ m/.*?: (.*)/) { return $1; } }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird jeweils ein Reading für Favoriten, Playlisten und Radios angelegt, sobald im Reading &#039;&#039;&#039;LastActionResult&#039;&#039;&#039; dieses Ergebnis asynchron geliefert wurde.&lt;br /&gt;
&lt;br /&gt;
Die Lieferung selbst kann man mit einem &#039;&#039;&#039;at&#039;&#039;&#039;-Statement zu bestimmten Zeitpunkten erzeugen/aktualisieren lassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define refreshFavouritesWohnzimmer at *06:00 get Sonos_Wohnzimmer FavouritesWithCovers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ganze muss natürlich für jede gewünschte Liste an jedem Player aktualisiert werden. Man kann also auch sowas schreiben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define refreshFavouritesSonos at *06:00 get Sonos_.*.Favourites FavouritesWithCovers&lt;br /&gt;
define refreshPlaylistsSonos at *06:01 get Sonos_.*.Playlists PlaylistsWithCovers&lt;br /&gt;
define refreshRadiosSonos at *06:02 get Sonos_.*.Radios RadiosWithCovers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Möchte man eine andere Darstellung, so muss man sich eine eigene Prozedur in eine &#039;&#039;&#039;99_myUtils.pm&#039;&#039;&#039; packen. Hier eine Kopiervorlage:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub getListRG($$;$) {&lt;br /&gt;
	my ($device, $reading, $ul) = @_;&lt;br /&gt;
	$ul = 0 if (!defined($ul));&lt;br /&gt;
	&lt;br /&gt;
	my $resultString = &#039;&#039;;&lt;br /&gt;
	&lt;br /&gt;
	# Manchmal ist es etwas komplizierter mit den Zeichensätzen...&lt;br /&gt;
	my %elems = %{eval(decode(&#039;CP1252&#039;, ReadingsVal($device, $reading, &#039;{}&#039;)))};&lt;br /&gt;
	&lt;br /&gt;
	for my $key (keys %elems) {&lt;br /&gt;
		my $command;&lt;br /&gt;
		if ($reading eq &#039;Favourites&#039;) {&lt;br /&gt;
			$command = &#039;cmd.&#039;.$device.uri_escape(&#039;=set &#039;.$device.&#039; \&lt;br /&gt;
				StartFavourite &#039;.uri_escape($elems{$key}-&amp;gt;{Title}));&lt;br /&gt;
		} elsif ($reading eq &#039;Playlists&#039;) {&lt;br /&gt;
			$command = &#039;cmd.&#039;.$device.uri_escape(&#039;=set &#039;.$device.&#039; \&lt;br /&gt;
				StartPlaylist &#039;.uri_escape($elems{$key}-&amp;gt;{Title}));&lt;br /&gt;
		} elsif ($reading eq &#039;Radios&#039;) {&lt;br /&gt;
			$command = &#039;cmd.&#039;.$device.uri_escape(&#039;=set &#039;.$device.&#039; \&lt;br /&gt;
				StartRadio &#039;.uri_escape($elems{$key}-&amp;gt;{Title}));&lt;br /&gt;
		}&lt;br /&gt;
		$command = &amp;quot;FW_cmd(&#039;/fhem?XHR=1&amp;amp;$command&#039;)&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if ($ul) {&lt;br /&gt;
			$resultString .= &#039;&amp;lt;li style=&amp;quot;list-style-type: none; display: inline;&amp;quot;&amp;gt;\&lt;br /&gt;
				&amp;lt;a onclick=&amp;quot;&#039;.$command.&#039;&amp;quot;&amp;gt;&amp;lt;img style=&amp;quot;border: solid 1px lightgray; \&lt;br /&gt;
				margin: 3px;&amp;quot; width=&amp;quot;70&amp;quot; src=&amp;quot;&#039;.$elems{$key}-&amp;gt;{Cover}.&#039;&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$resultString .= &#039;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;img width=&amp;quot;70&amp;quot; src=&amp;quot;&#039;.$elems{$key}-&amp;gt;{Cover}.\&lt;br /&gt;
				&#039;&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a onclick=&amp;quot;&#039;.$command.&#039;&amp;quot;&amp;gt;&#039;.$elems{$key}-&amp;gt;{Title}.&amp;quot;&amp;lt;/a&amp;gt;\&lt;br /&gt;
				&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if ($ul) {&lt;br /&gt;
		return &#039;&amp;lt;ul style=&amp;quot;margin-left: 0px; padding-left: 0px; list-style-type: none; \&lt;br /&gt;
			display: inline;&amp;quot;&amp;gt;&#039;.$resultString.&#039;&amp;lt;/ul&amp;gt;&#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		return &#039;&amp;lt;table&amp;gt;&#039;.$resultString.&#039;&amp;lt;/table&amp;gt;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese Prozedur hat einen optionalen Parameter ($ul). Mit diesem kann man angeben, ob eine Tabelle mit vertikaler Darstellung ($ul=0) oder eine Unordered-List mit horizontaler Darstellung ($ul=1) erzeugt wird.&lt;br /&gt;
Die Variante mit den ListItems ist auch für eine Darstellung in einem Dashboard geeignet.&lt;br /&gt;
Da bei der horizontalen Darstellung kein Platz für Namen ist, eignet sich diese Darstellung nur für Listen, deren Icon für jeden Eintrag unterschiedlich ist (Playlisten kann man hier also nicht mehr unterscheiden :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die eigentliche [[readingsGroup]] verwendet dann diese Prozedur:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Sonos_WohnzimmerFavouriteListRG readingsGroup Sonos_Wohnzimmer:\&lt;br /&gt;
	&amp;lt;{getListRG($DEVICE,&amp;quot;Favourites&amp;quot;)}@Favourites&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder für die Variante mit den List-Elementen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Sonos_WohnzimmerFavouriteListRG readingsGroup Sonos_Wohnzimmer:\&lt;br /&gt;
	&amp;lt;{getListRG($DEVICE,&amp;quot;Favourites&amp;quot;,1)}@Favourites&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit kann man sich dynamische Listen auf Basis der Informationen im Sonosplayer für die Darstellung erzeugen lassen.&lt;br /&gt;
&lt;br /&gt;
Die Backslashs vor den Zeilenumbrüchen sind hauptsächlich der Optik halber hier. Generell empfehle ich die so getrennten Befehle in eine Zeile zu schreiben...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für die Anzeige der Gruppenkonstellation in einer ReadingsGroup ===&lt;br /&gt;
[[Datei:ReadingsGroupSonosGruppierung.png|right|75px|Beispiel der Visualisierung der Gruppenkonstellation im Style &amp;quot;dark&amp;quot;]]&lt;br /&gt;
Mit der folgende Prozedur (in die &#039;&#039;&#039;99_myUtils.pm&#039;&#039;&#039; schreiben) und der [[readingsGroup]] läßt sich auf einfache Weise die Gruppenkonstellation stets aktuell darstellen.&lt;br /&gt;
&lt;br /&gt;
Die Prozedur, die die Zerlegung des Strings und in diesem Fall die Aufbereitung als UL (Unordered-List) übernimmt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub getGroupsRG() {&lt;br /&gt;
	my $groups = CommandGet(undef, SONOS_getSonosPlayerByName(undef)-&amp;gt;{NAME}.\&lt;br /&gt;
		&#039; Groups&#039;);&lt;br /&gt;
	&lt;br /&gt;
	my $result = &#039;&#039;;&lt;br /&gt;
	my $i = 0;&lt;br /&gt;
	while ($groups =~ m/\[(.*?)\]/ig) {&lt;br /&gt;
		my @member = split(/, /, $1);&lt;br /&gt;
		@member = map { my $elem = $_; $elem = FW_makeImage(&#039;icoSONOSPLAYER_icon-&#039;.\&lt;br /&gt;
			ReadingsVal($elem, &#039;playerType&#039;, &#039;&#039;).&#039;.png&#039;, &#039;&#039;, &#039;&#039;).ReadingsVal($elem,\&lt;br /&gt;
			&#039;roomNameAlias&#039;, $elem); $elem; } @member;&lt;br /&gt;
		&lt;br /&gt;
		$result .= &#039;&amp;lt;li&amp;gt;&#039;.++$i.&#039;. Gruppe:&amp;lt;ul style=&amp;quot;list-style-type: none; \&lt;br /&gt;
			padding-left: 0px;&amp;quot;&amp;gt;&amp;lt;li&amp;gt;&#039;.join(&#039;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&#039;, @member).&#039;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	return &#039;&amp;lt;ul&amp;gt;&#039;.$result.&#039;&amp;lt;/ul&amp;gt;&#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und hier die entsprechende ReadingsGroup dazu:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define SonosRG readingsGroup Sonos:&amp;lt;{getGroupsRG()}@ZoneGroupState&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird eine einfache Darstellung der Gruppenkonstellation durchgeführt, die man sich natürlich selber nach Belieben anpassen kann/soll.&lt;br /&gt;
&lt;br /&gt;
Die Backslashs vor den Zeilenumbrüchen sind hauptsächlich der Optik halber hier. Generell empfehle ich die so getrennten Befehle in eine Zeile zu schreiben...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine ReadingsGroup, die die Informationen des Masters anzeigt ===&lt;br /&gt;
Wenn Player in einer Gruppe sind, werden keine Titelinformationen des eigentlichten Streams angezeigt. Man kann sich jetzt zu jedem Player eine [[readingsGroup]] bauen, die die Informationen des Gruppenmasters anzeigen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Sonos_WohnzimmerRG2 readingsGroup Sonos_Wohnzimmer:infoSummarize2@{\&lt;br /&gt;
	SONOSPLAYER_GetMasterPlayerName($DEVICE)}&lt;br /&gt;
attr Sonos_WohnzimmerRG2 valueFormat {&amp;quot; &amp;quot;}&lt;br /&gt;
attr Sonos_WohnzimmerRG2 valuePrefix {SONOS_getCoverTitleRG(\&lt;br /&gt;
	SONOSPLAYER_GetMasterPlayerName($DEVICE))}&lt;br /&gt;
attr Sonos_WohnzimmerRG2 noheading 1&lt;br /&gt;
attr Sonos_WohnzimmerRG2 nonames 1&lt;br /&gt;
attr Sonos_WohnzimmerRG2 notime 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Hinweis&#039;&#039;: Diese ReadingsGroup wird automatisch per longpoll aktualisiert. Lediglich bei einer Umgruppierung muss bislang die Seite neu geladen werden. Es kann aber gut sein, dass man das in Zukunft auch per longpoll hinbekommen kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für ein Shell-Skript zum Aufräumen eines Speak-Verzeichnisses ===&lt;br /&gt;
Mit der freundlichen Freigabe von Loredo und CQuadrat hier ein kleines Shell-Skript, mit dem länger nicht abgespielte Dateien gelöscht werden können.&lt;br /&gt;
Bei allen Varianten muss berücksichtigt werden, dass der ausführende Benutzer die Dateien auch löschen darf. Bitte die Dateirechte prüfen.&lt;br /&gt;
&lt;br /&gt;
==== Variante mit Ausgabe der gelöschten Dateien ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
FILES=`ls /mnt/SonosSpeak/RINCON*.mp3*`&lt;br /&gt;
CURRENTTIME=`date +&amp;quot;%s&amp;quot;`&lt;br /&gt;
PASTDAYS=75&lt;br /&gt;
&lt;br /&gt;
THESHOLDATIME=`expr $CURRENTTIME - $PASTDAYS \* 24 \* 60 \* 60`&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;Cleaning up all files older than $PASTDAYS days ...\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for f in $FILES&lt;br /&gt;
do&lt;br /&gt;
&lt;br /&gt;
  FILEATIME=`stat -c &amp;quot;%X&amp;quot; $f`&lt;br /&gt;
&lt;br /&gt;
  if [[ &amp;quot;$FILEATIME&amp;quot; &amp;lt; &amp;quot;$THESHOLDATIME&amp;quot; ]]; then&lt;br /&gt;
        echo &amp;quot;cleaned up $f: last access on `stat -c &amp;quot;%x&amp;quot; $f`&amp;quot;&lt;br /&gt;
        rm $f&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Unter Umständen gibt es eine aktuellere Version unter [https://gist.github.com/jpawlowski/689d1cf74334488cd127 cleanupSonosSpeak.sh auf GitHub].&lt;br /&gt;
&lt;br /&gt;
==== Variante für die crontab ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * find /mnt/SonosSpeak -name &amp;quot;RINCON*&amp;quot; ! -atime -75 -delete&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier wird jeden Tag um 4:00 Uhr der Ordner mit den Sprachausgabedateien bereinigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Betrieb des Sonos an einer Funksteckdose (regelmäßiges Ausschalten) - Verbindungsprobleme ===&lt;br /&gt;
&lt;br /&gt;
Wenn das Sonossystem per Funksteckdose regelmäßig vom Netz genommen wird, bereitet der Neustart und das anschließende &lt;br /&gt;
Verbinden mit FHEM oft Probleme. Das Sonosmodul bleibt auf dem Status &amp;quot;disappeared&amp;quot; stehen und das Playerdevice ebenfalls.&lt;br /&gt;
Ergo ist eine Bedienung per FHEM oder die Sprachausgabe nicht mehr möglich.&lt;br /&gt;
&lt;br /&gt;
Um diesem Problem Abhilfe zu schaffen reicht ein kleines notify oder DOIF, welches den Player beim Abschalten &lt;br /&gt;
das Attribut disable = 1 verschafft und beim Wiedereinschalten dieses Attribut löscht.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define RebootSonosDOIF DOIF ([FunksteckerSonos:state] eq &amp;quot;on&amp;quot; )(deleteattr MeinSonosDevice disable) (save) &lt;br /&gt;
                       DOELSEIF ([FunksteckerSonos:state] eq &amp;quot;off&amp;quot; )(attr MeinSonosDevice disable 1)(save)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Setzen von &amp;quot;disable&amp;quot; sorgt dafür, dass der Sonosthread beendet wird und beim Einschalten ein neuer Prozess erstellt wird.&lt;br /&gt;
Diese automatische Änderung an der Konfiguration des Device benötigt ein save config im Nachgang der DOIF- oder notify-Aktion. &lt;br /&gt;
Daher wird der jeweilige attr-Befehl mit einem (save) abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
Wichtig hierbei (wie auch in der Überschrift erwähnt) funktioniert das nur, wenn die einzelnen Sonosplayer an einer schaltbaren Steckdose betrieben werden.&lt;br /&gt;
&lt;br /&gt;
Das DOIF triggert nur bei Änderung des &amp;quot;state&amp;quot; der jeweilige Funksteckdose.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiele für FTUI-Integrationen ===&lt;br /&gt;
Hier können diverse Beispiele für eine FTUI (FHEM Tablet User Interface) Integration aufgeführt werden. Dabei sollten die Beispiele &#039;&#039;vollständig&#039;&#039; sein, und auch alle notwendigen Dummies und/oder Userreadings beschreiben.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel von Reinerlein ====&lt;br /&gt;
[[Datei:ReinersSonosFTUIIntegration.jpg|mini|Beispiel der SONOS-FTUI-Integration von Reinerlein]]&lt;br /&gt;
[[Datei:ReinersSonosFTUIIntegrationHeadline.jpg|mini|Kopfzeile bei Gruppenwiedergabe]]&lt;br /&gt;
Hier gebe ich mal mein Beispiel zum Besten. Es ist eine 3 Spalten x 5 Zeilen Integration mit der Möglichkeit einer Favoriten-, Playlisten- und Radioauswahl, sowie einer Titelauswahl und Gruppierungsanpassung.&lt;br /&gt;
&lt;br /&gt;
Die Formatierung der Listen erfolgt mit einem &#039;&#039;&#039;|&#039;&#039;&#039; als Trenner der Elemente, da dieses Zeichen hier nie im Titel vorkommt.&lt;br /&gt;
&lt;br /&gt;
Die Maskierung der Leerzeichen für die Schlüsselliste erfolgt auf den Punkt. Damit besteht die Möglichkeit, den Wert direkt als regulären Ausdruck an den entsprechenden Start-Befehl zu übermitteln. Es müssen nur noch die Schrägstriche &#039;&#039;&#039;/&#039;&#039;&#039; vorne und hinten angefügt werden.&lt;br /&gt;
&lt;br /&gt;
Beim Antippen des Covers wird ein Vollbild-Popup geöffnet, welches das Cover in groß, den Abspielzustand und die Abspielposition darstellt.&lt;br /&gt;
&lt;br /&gt;
Im Header jedes Players wird angezeigt, ob gerade irgendwelche Slaveplayer mitbedient werden, bzw. wer der aktuelle Masterplayer zu dieser Wiedergabe ist. Des Weiteren kann dort direkt ein Player zu der Wiedergabegruppe hinzugefügt oder aus ihr entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Im Header kann jetzt bei einer Gruppenwiedergabe auch der GroupMute-Zustand gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Über dem Cover wird nun die aktuelle Quelle des Titels angezeigt (Playlist, Album o.ä.)&lt;br /&gt;
&lt;br /&gt;
===== FTUI-Code =====&lt;br /&gt;
Der Code ist in zwei Bereiche aufgeteilt, damit die Templatemöglichkeiten für mehrere Player verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
Zunächst die Einbindung des Templates. Hier wird auch der Rahmen festgelegt. In diesem Fall der Gridster-Kasten mit 3x5 Feldgröße:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;li data-row=&amp;quot;1&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;3&amp;quot; data-sizey=&amp;quot;5&amp;quot; class=&amp;quot;border-down-gray lesstransparent&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div data-template=&amp;quot;template_musik_sonos.html&amp;quot; data-parameter=&#039;{&amp;quot;Device&amp;quot;:&amp;quot;Sonos_Wohnzimmer&amp;quot;}&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dadurch, dass der Rahmen nicht mit im Template enthalten ist, könnte man z.B. auch mehrere Player nebeneinander in einem Rahmen darstellen, dabei aber nicht den umschließenden DIV-Tag um das Template vergessen, da sonst die Titelanzeigen &#039;&#039;rauswandern&#039;&#039; könnten.&lt;br /&gt;
&#039;&#039;Hinweis:&#039;&#039; In der vorherigen Version gab es noch einen Parameter für den Raumnamen, und der Header wurde hier bei der Einbindung festgelegt. Das entfällt nun, da der Raumname per Reading ermittelt wird, und im Header nun Gruppierungsinformationen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
Für die Coverdarstellung ist ein neues Widget notwendig (welches momentan noch nicht offiziell ist), da in der neuen Sonosversion größere Radiocover geladen werden, und diese nicht unbedingt quadratisch orientiert sind.&lt;br /&gt;
&lt;br /&gt;
Das Widget kann im Forum heruntergeladen werden: [https://forum.fhem.de/index.php/topic,70265.0.html https://forum.fhem.de/index.php/topic,70265.0.html].&lt;br /&gt;
&lt;br /&gt;
Für die Lauftext-Animation sind eigene CSS-Klassen, eine Javascript-Funktion und (momentan noch) eine Anpassung des JoinedLabel-Widgets notwendig.&lt;br /&gt;
&lt;br /&gt;
Hier die notwendigen Styles und Javascript. Ich habe diese einfach in den Kopfbereich meiner index.html gepackt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Anfang Styles und Javascript für die Scrolltexte in der Sonosplayer-Ansicht --&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.flowanimation {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	animation: floatText 8s infinite alternate ease-in-out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes floatText {&lt;br /&gt;
	from {&lt;br /&gt;
		left: 0px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	to {&lt;br /&gt;
		left: calc(355px - 100%);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mycenteredtext {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	left: calc(355px / 2 - 50%);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	function checkFlowAnimation(elemName) {&lt;br /&gt;
		if ($(elemName).innerWidth() &amp;gt;= 355) {&lt;br /&gt;
			$(elemName).addClass(&#039;flowanimation&#039;);&lt;br /&gt;
		} else {&lt;br /&gt;
			$(elemName).addClass(&#039;mycenteredtext&#039;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Styles und Javascript für die Scrolltexte in der Sonosplayer-Ansicht --&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Anpassungen in der Datei &amp;quot;widget_joinedlabel.js&amp;quot; beschränken sich auf zwei Zeilen:&lt;br /&gt;
*In der Funktion &amp;quot;init_attr()&amp;quot; als letztes Statement vor der abschließenden Log-Ausgabe: &amp;lt;pre&amp;gt;elem.initData(&#039;onupdate&#039;, &#039;&#039;);&amp;lt;/pre&amp;gt;&lt;br /&gt;
*In der Funktion &amp;quot;update&amp;quot; als letztes Statement nach der &amp;quot;me.update_colorize()&amp;quot;-Anweisung: &amp;lt;pre&amp;gt;eval(elem.data(&#039;onupdate&#039;));&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier nun der Inhalt der Datei &#039;&#039;&#039;template_musik_sonos.html&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;header&amp;gt;&lt;br /&gt;
	&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;SlavePlayerNotBonded&amp;quot; data-get-on=&#039;[&amp;quot;[]&amp;quot;]&#039; data-on-class=&amp;quot;hide&amp;quot; data-off-class=&amp;quot;mini&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;GroupMute&amp;quot; data-set=&amp;quot;GroupMute&amp;quot;&lt;br /&gt;
			data-icon=&amp;quot;fa-deaf&amp;quot; data-background-icon=&amp;quot;-&amp;quot;&lt;br /&gt;
			data-on-color=&amp;quot;#aa6900&amp;quot; data-off-color=&amp;quot;gray&amp;quot;&lt;br /&gt;
			data-get-on=&amp;quot;1&amp;quot; data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
			data-set-on=&amp;quot;1&amp;quot; data-set-off=&amp;quot;0&amp;quot; class=&amp;quot;mini&amp;quot; style=&amp;quot;margin-right: -5px;&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;div data-type=&amp;quot;joinedlabel&amp;quot; data-device=&amp;quot;Device&amp;quot; data-mask=&amp;quot;[$1][ ($2)]&amp;quot; data-get=&#039;[&amp;quot;roomName&amp;quot;,&amp;quot;ZoneGroupNameDetails&amp;quot;]&#039; class=&amp;quot;truncate inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;MasterPlayer&amp;quot; data-get-on=&amp;quot;Device&amp;quot; data-on-class=&amp;quot;hide&amp;quot; class=&amp;quot;inline left-narrow&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;push&amp;quot; &lt;br /&gt;
			data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
			data-icon=&amp;quot;fa-minus-circle&amp;quot; &lt;br /&gt;
			data-background-icon=&amp;quot;-&amp;quot;&lt;br /&gt;
			data-set-on=&amp;quot;MakeStandaloneGroup&amp;quot;&lt;br /&gt;
			class=&amp;quot;inline mini gray&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;MasterPlayer&amp;quot; data-get-on=&amp;quot;Device&amp;quot; data-off-class=&amp;quot;hide&amp;quot; class=&amp;quot;inline left-narrow&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;popup&amp;quot; class=&amp;quot;&amp;quot; data-width=&amp;quot;400px&amp;quot; data-height=&amp;quot;110px&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;symbol&amp;quot;&lt;br /&gt;
				data-icon=&amp;quot;fa-chevron-circle-down&amp;quot;&lt;br /&gt;
				class=&amp;quot;mini&amp;quot;&lt;br /&gt;
				style=&amp;quot;height: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div class=&amp;quot;dialog&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;header&amp;gt;&amp;lt;div data-type=&amp;quot;joinedlabel&amp;quot; data-device=&amp;quot;Device&amp;quot; data-mask=&amp;quot;Wiedergabegruppe[ für $1] anpassen&amp;quot; data-get=&#039;[&amp;quot;roomName&amp;quot;]&#039; class=&amp;quot;inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/header&amp;gt;&lt;br /&gt;
				&lt;br /&gt;
				&amp;lt;div class=&amp;quot;top-space-10 left-align left-space&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;div&amp;gt;&lt;br /&gt;
						&amp;lt;div class=&amp;quot;large middle inline&amp;quot;&amp;gt;Player hinzufügen: &amp;lt;/div&amp;gt;&lt;br /&gt;
						&amp;lt;div data-type=&amp;quot;select&amp;quot; &lt;br /&gt;
							data-device=&amp;quot;Device&amp;quot; &lt;br /&gt;
							data-list=&amp;quot;AvailablePlayerList&amp;quot; &lt;br /&gt;
							data-alias=&amp;quot;AvailablePlayerListAlias&amp;quot; &lt;br /&gt;
							data-delimiter=&amp;quot;|&amp;quot;&lt;br /&gt;
							data-get=&amp;quot;-&amp;quot;&lt;br /&gt;
							data-set=&amp;quot;AddMember&amp;quot;&lt;br /&gt;
							class=&amp;quot;inline w3x&amp;quot;&lt;br /&gt;
							onchange=&amp;quot;$(&#039;.dialog-close&#039;).trigger(&#039;click&#039;);&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
					&lt;br /&gt;
					&amp;lt;div&amp;gt;&lt;br /&gt;
						&amp;lt;div class=&amp;quot;large middle inline&amp;quot;&amp;gt;Player entfernen: &amp;lt;/div&amp;gt;&lt;br /&gt;
						&amp;lt;div data-type=&amp;quot;select&amp;quot; &lt;br /&gt;
							data-device=&amp;quot;Device&amp;quot; &lt;br /&gt;
							data-list=&amp;quot;SlavePlayerNotBondedList&amp;quot; &lt;br /&gt;
							data-alias=&amp;quot;SlavePlayerNotBondedListAlias&amp;quot; &lt;br /&gt;
							data-delimiter=&amp;quot;|&amp;quot;&lt;br /&gt;
							data-get=&amp;quot;-&amp;quot;&lt;br /&gt;
							data-set=&amp;quot;RemoveMember&amp;quot;&lt;br /&gt;
							class=&amp;quot;inline w3x&amp;quot;&lt;br /&gt;
							onchange=&amp;quot;$(&#039;.dialog-close&#039;).trigger(&#039;click&#039;);&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/header&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div data-type=&amp;quot;joinedlabel&amp;quot; data-device=&amp;quot;Device&amp;quot; data-mask=&amp;quot;&amp;amp;nbsp;[~ $1 ~]&amp;amp;nbsp;&amp;quot; data-get=&#039;[&amp;quot;currentSource&amp;quot;]&#039; class=&amp;quot;bottom-narrow mini white&amp;quot; style=&amp;quot;padding-top: 3px; background: rgba(170, 105, 0, 0.6);&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;div data-type=&amp;quot;popup&amp;quot; data-width=&amp;quot;100%&amp;quot; data-height=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div style=&amp;quot;margin-bottom: -40px;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;imagecover&amp;quot;&lt;br /&gt;
				data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
				data-get=&amp;quot;currentAlbumArtURL&amp;quot;&lt;br /&gt;
				data-opacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
				data-width=&amp;quot;350px&amp;quot;&lt;br /&gt;
				data-height=&amp;quot;350px&amp;quot;&lt;br /&gt;
				class=&amp;quot;&amp;quot;&lt;br /&gt;
				onclick=&amp;quot;$(&#039;.dialog-close&#039;).trigger(&#039;click&#039;);&amp;quot;&lt;br /&gt;
				style=&amp;quot;margin-left: 12px; margin-top: 12px; border: 1px solid rgba(170, 105, 0, 0.6);&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentTrackProviderIconRoundURL&amp;quot; data-get-on=&amp;quot;&amp;quot; data-on-class=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;inline&amp;quot; style=&amp;quot;width: 40px; height: 40px; background: rgba(0, 0, 0, 0.40); position: relative; top: -349px; left: -152px;&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;div data-type=&amp;quot;imagecover&amp;quot;&lt;br /&gt;
						data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
						data-get=&amp;quot;currentTrackProviderIconRoundURL&amp;quot;&lt;br /&gt;
						data-opacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
						data-width=&amp;quot;30px&amp;quot;&lt;br /&gt;
						data-height=&amp;quot;30px&amp;quot;&lt;br /&gt;
						class=&amp;quot;&amp;quot;&lt;br /&gt;
						style=&amp;quot;margin-left: 5px; margin-top: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentTrackProviderIconRoundURL&amp;quot; data-get-on=&amp;quot;&amp;quot; data-off-class=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;inline&amp;quot; style=&amp;quot;width: 40px; height: 40px; position: relative; top: -349px; left: -152px;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div class=&amp;quot;dialog&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;header&amp;gt;&amp;lt;div data-type=&amp;quot;joinedlabel&amp;quot; data-device=&amp;quot;Device&amp;quot; data-mask=&amp;quot;Cover[ für $1]&amp;quot; data-get=&#039;[&amp;quot;roomName&amp;quot;]&#039; class=&amp;quot;inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/header&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;imagecover&amp;quot;&lt;br /&gt;
				data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
				data-get=&amp;quot;currentTrackProviderIconRoundURL&amp;quot;&lt;br /&gt;
				data-opacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
				data-width=&amp;quot;30px&amp;quot;&lt;br /&gt;
				data-height=&amp;quot;30px&amp;quot;&lt;br /&gt;
				class=&amp;quot;&amp;quot;&lt;br /&gt;
				style=&amp;quot;position: absolute; top: 25px; left: 5px;&amp;quot;&lt;br /&gt;
				style=&amp;quot;margin-left: 5px; margin-top: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;switch&amp;quot;&lt;br /&gt;
				data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
				data-get=&amp;quot;transportState&amp;quot;&lt;br /&gt;
				data-states=&#039;[&amp;quot;PLAYING&amp;quot;,&amp;quot;PAUSED_PLAYBACK&amp;quot;,&amp;quot;STOPPED&amp;quot;]&#039;&lt;br /&gt;
				data-background-icon=&amp;quot;-&amp;quot;&lt;br /&gt;
				data-background-colors=&#039;[&amp;quot;white&amp;quot;,&amp;quot;white&amp;quot;,&amp;quot;white&amp;quot;]&#039;&lt;br /&gt;
				data-colors=&#039;[&amp;quot;white&amp;quot;,&amp;quot;white&amp;quot;,&amp;quot;white&amp;quot;]&#039;&lt;br /&gt;
				data-icons=&#039;[&amp;quot;fa-play&amp;quot;,&amp;quot;fa-pause&amp;quot;,&amp;quot;fa-pause&amp;quot;]&#039;&lt;br /&gt;
				class=&amp;quot;inline readonly&amp;quot;&lt;br /&gt;
				style=&amp;quot;position: absolute; top: 10px; right: -10px;&amp;quot;&lt;br /&gt;
				onclick=&amp;quot;$(&#039;.dialog-close&#039;).trigger(&#039;click&#039;);&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;imagecover&amp;quot;&lt;br /&gt;
				data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
				data-get=&amp;quot;currentAlbumArtURL&amp;quot;&lt;br /&gt;
				data-opacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
				data-width=&amp;quot;100%&amp;quot;&lt;br /&gt;
				data-height=&amp;quot;calc(100vh - 60px)&amp;quot;&lt;br /&gt;
				class=&amp;quot;&amp;quot;&lt;br /&gt;
				onclick=&amp;quot;$(&#039;.dialog-close&#039;).trigger(&#039;click&#039;);&amp;quot;&lt;br /&gt;
				style=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentNormalAudio&amp;quot; data-get-on=&amp;quot;1&amp;quot; data-off-class=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div data-type=&amp;quot;slider&amp;quot;&lt;br /&gt;
					data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
					data-get=&amp;quot;currentTrackPositionSimulatedSec&amp;quot;&lt;br /&gt;
					data-max=&amp;quot;currentTrackDurationSec&amp;quot; data-min=&amp;quot;0&amp;quot;&lt;br /&gt;
					data-step=&amp;quot;1&amp;quot;&lt;br /&gt;
					data-handle-diameter=&amp;quot;5&amp;quot;&lt;br /&gt;
					data-width=&amp;quot;68%&amp;quot;&lt;br /&gt;
					class=&amp;quot;horizontal top-narrow readonly centered&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentNormalAudio&amp;quot; data-get-on=&amp;quot;1&amp;quot; data-off-class=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div data-type=&amp;quot;joinedlabel&amp;quot; data-device=&amp;quot;Device&amp;quot; data-mask=&amp;quot;[$1][ ~ $2][ ~ $3]&amp;quot; data-get=&#039;[&amp;quot;currentTitle&amp;quot;,&amp;quot;currentArtist&amp;quot;,&amp;quot;currentAlbum&amp;quot;]&#039; class=&amp;quot;truncate top-space&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentStreamAudio&amp;quot; data-get-on=&amp;quot;1&amp;quot; data-off-class=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div data-type=&amp;quot;joinedlabel&amp;quot; data-device=&amp;quot;Device&amp;quot; data-mask=&amp;quot;[$1 ~ ][$2][: $3]&amp;quot; data-get=&#039;[&amp;quot;currentSenderInfo&amp;quot;,&amp;quot;currentSender&amp;quot;,&amp;quot;currentSenderCurrent&amp;quot;]&#039; class=&amp;quot;truncate top-space&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentNormalAudio&amp;quot; data-get-on=&amp;quot;1&amp;quot; data-off-class=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentTrackPositionSimulated&amp;quot; class=&amp;quot;inline&amp;quot; style=&amp;quot;width: 3em;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;slider&amp;quot;&lt;br /&gt;
			data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
			data-set=&amp;quot;CurrentTrackPosition&amp;quot;&lt;br /&gt;
			data-get=&amp;quot;currentTrackPositionSimulatedSec&amp;quot;&lt;br /&gt;
			data-max=&amp;quot;currentTrackDurationSec&amp;quot; data-min=&amp;quot;0&amp;quot;&lt;br /&gt;
			data-step=&amp;quot;1&amp;quot;&lt;br /&gt;
			data-handle-diameter=&amp;quot;5&amp;quot;&lt;br /&gt;
			data-width=&amp;quot;250&amp;quot;&lt;br /&gt;
			class=&amp;quot;horizontal tap inline&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentTrackDuration&amp;quot; class=&amp;quot;inline&amp;quot; style=&amp;quot;width: 3em;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div class=&amp;quot;newline&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentTrack&amp;quot; class=&amp;quot;inline center-align&amp;quot; style=&amp;quot;width: 3em;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;slider&amp;quot;&lt;br /&gt;
				data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
				data-set=&amp;quot;Track&amp;quot;&lt;br /&gt;
				data-get=&amp;quot;currentTrack&amp;quot;&lt;br /&gt;
				data-max=&amp;quot;numberOfTracks&amp;quot; data-min=&amp;quot;0&amp;quot;&lt;br /&gt;
				data-step=&amp;quot;1&amp;quot;&lt;br /&gt;
				data-handle-diameter=&amp;quot;5&amp;quot;&lt;br /&gt;
				data-width=&amp;quot;250&amp;quot;&lt;br /&gt;
				class=&amp;quot;horizontal tap inline&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;numberOfTracks&amp;quot; class=&amp;quot;inline center-align&amp;quot; style=&amp;quot;width: 3em;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentStreamAudio&amp;quot; data-get-on=&amp;quot;1&amp;quot; data-off-class=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div style=&amp;quot;height: 40px;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/div&amp;gt; &amp;lt;!-- Leerer Ersatz für die bei Streams fehlende Positionsanzeige --&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;div class=&amp;quot;large top-space&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentNormalAudio&amp;quot; data-get-on=&amp;quot;1&amp;quot; data-off-class=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;div style=&amp;quot;height: 21px;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div style=&amp;quot;width: 355px; position: absolute; overflow: hidden; height: 21px; margin-left: 10px; margin-right: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;div style=&amp;quot;position: absolute;&amp;quot;&amp;gt;&lt;br /&gt;
						&amp;lt;div id=&amp;quot;Device_Title&amp;quot; data-type=&amp;quot;joinedlabel&amp;quot; data-device=&amp;quot;Device&amp;quot; data-mask=&amp;quot;[$1]&amp;quot; data-get=&#039;[&amp;quot;currentTitle&amp;quot;]&#039; data-onupdate=&amp;quot;checkFlowAnimation(&#039;#Device_Title&#039;);&amp;quot; class=&amp;quot;bold&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div style=&amp;quot;height: 21px;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div style=&amp;quot;width: 355px; position: absolute; overflow: hidden; height: 21px; margin-left: 10px; margin-right: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;div style=&amp;quot;position: absolute;&amp;quot;&amp;gt;&lt;br /&gt;
						&amp;lt;div id=&amp;quot;Device_Interpret&amp;quot; data-type=&amp;quot;joinedlabel&amp;quot; data-device=&amp;quot;Device&amp;quot; data-mask=&amp;quot;[$1][ ~ $2]&amp;quot; data-get=&#039;[&amp;quot;currentArtist&amp;quot;,&amp;quot;currentAlbum&amp;quot;]&#039; data-onupdate=&amp;quot;checkFlowAnimation(&#039;#Device_Interpret&#039;);&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
						&amp;lt;/div&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentStreamAudio&amp;quot; data-get-on=&amp;quot;1&amp;quot; data-off-class=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;div style=&amp;quot;height: 21px;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div style=&amp;quot;width: 355px; position: absolute; overflow: hidden; height: 21px; margin-left: 10px; margin-right: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;div style=&amp;quot;position: absolute;&amp;quot;&amp;gt;&lt;br /&gt;
						&amp;lt;div id=&amp;quot;Device_SenderInfo&amp;quot; data-type=&amp;quot;joinedlabel&amp;quot; data-device=&amp;quot;Device&amp;quot; data-mask=&amp;quot;[$1]&amp;quot; data-get=&#039;[&amp;quot;currentSenderInfo&amp;quot;]&#039; data-onupdate=&amp;quot;checkFlowAnimation(&#039;#Device_SenderInfo&#039;);&amp;quot; class=&amp;quot;bold&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div style=&amp;quot;height: 21px;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div style=&amp;quot;width: 355px; position: absolute; overflow: hidden; height: 21px; margin-left: 10px; margin-right: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;div style=&amp;quot;position: absolute;&amp;quot;&amp;gt;&lt;br /&gt;
						&amp;lt;div id=&amp;quot;Device_Sender&amp;quot; data-type=&amp;quot;joinedlabel&amp;quot; data-device=&amp;quot;Device&amp;quot; data-mask=&amp;quot;[$1][: $2]&amp;quot; data-get=&#039;[&amp;quot;currentSender&amp;quot;,&amp;quot;currentSenderCurrent&amp;quot;]&#039; data-onupdate=&amp;quot;checkFlowAnimation(&#039;#Device_Sender&#039;);&amp;quot;class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;div class=&amp;quot;top-space&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;Mute&amp;quot; data-set=&amp;quot;Mute&amp;quot;&lt;br /&gt;
			data-icon=&amp;quot;fa-deaf&amp;quot; data-background-icon=&amp;quot;-&amp;quot;&lt;br /&gt;
			data-on-color=&amp;quot;#aa6900&amp;quot; data-off-color=&amp;quot;gray&amp;quot;&lt;br /&gt;
			data-get-on=&amp;quot;1&amp;quot; data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
			data-set-on=&amp;quot;1&amp;quot; data-set-off=&amp;quot;0&amp;quot; class=&amp;quot;inline mini&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentNormalAudio&amp;quot; data-get-on=&amp;quot;1&amp;quot; data-off-class=&amp;quot;hide&amp;quot; class=&amp;quot;inline top-space&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;Repeat&amp;quot; data-set=&amp;quot;Repeat&amp;quot;&lt;br /&gt;
				data-icon=&amp;quot;fa-repeat&amp;quot; data-background-icon=&amp;quot;-&amp;quot;&lt;br /&gt;
				data-on-color=&amp;quot;#aa6900&amp;quot; data-off-color=&amp;quot;gray&amp;quot;&lt;br /&gt;
				data-get-on=&amp;quot;1&amp;quot; data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
				data-set-on=&amp;quot;1&amp;quot; data-set-off=&amp;quot;0&amp;quot; class=&amp;quot;inline mini&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
				data-icon=&amp;quot;fa-step-backward&amp;quot; data-background-icon=&amp;quot;-&amp;quot;&lt;br /&gt;
				data-off-color=&amp;quot;#fff&amp;quot; data-on-color=&amp;quot;#aa6900&amp;quot;&lt;br /&gt;
				data-set-on=&amp;quot;Previous&amp;quot; class=&amp;quot;inline mini&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
				data-set=&amp;quot;CurrentTrackPosition&amp;quot;&lt;br /&gt;
				data-icon=&amp;quot;fa-backward&amp;quot; data-background-icon=&amp;quot;-&amp;quot;&lt;br /&gt;
				data-off-color=&amp;quot;#fff&amp;quot; data-on-color=&amp;quot;#aa6900&amp;quot;&lt;br /&gt;
				data-set-on=&amp;quot;-30&amp;quot; class=&amp;quot;inline mini&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;switch&amp;quot;&lt;br /&gt;
			data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
			data-get=&amp;quot;transportState&amp;quot;&lt;br /&gt;
			data-states=&#039;[&amp;quot;PLAYING&amp;quot;,&amp;quot;PAUSED_PLAYBACK&amp;quot;,&amp;quot;STOPPED&amp;quot;]&#039;&lt;br /&gt;
			data-set-states=&#039;[&amp;quot;Pause&amp;quot;,&amp;quot;Play&amp;quot;,&amp;quot;Play&amp;quot;]&#039;&lt;br /&gt;
			data-background-icon=&amp;quot;fa-circle-thin&amp;quot;&lt;br /&gt;
			data-background-colors=&#039;[&amp;quot;#aa6900&amp;quot;,&amp;quot;white&amp;quot;,&amp;quot;white&amp;quot;]&#039;&lt;br /&gt;
			data-colors=&#039;[&amp;quot;#aa6900&amp;quot;,&amp;quot;white&amp;quot;,&amp;quot;white&amp;quot;]&#039;&lt;br /&gt;
			data-icons=&#039;[&amp;quot;fa-pause&amp;quot;,&amp;quot;fa-play&amp;quot;,&amp;quot;fa-play&amp;quot;]&#039;&lt;br /&gt;
			class=&amp;quot;inline small&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;classchanger&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;currentNormalAudio&amp;quot; data-get-on=&amp;quot;1&amp;quot; data-off-class=&amp;quot;hide&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
				data-set=&amp;quot;CurrentTrackPosition&amp;quot;&lt;br /&gt;
				data-icon=&amp;quot;fa-forward&amp;quot; data-background-icon=&amp;quot;-&amp;quot;&lt;br /&gt;
				data-off-color=&amp;quot;#fff&amp;quot; data-on-color=&amp;quot;#aa6900&amp;quot;&lt;br /&gt;
				data-set-on=&amp;quot;+30&amp;quot; class=&amp;quot;inline mini&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
				data-icon=&amp;quot;fa-step-forward&amp;quot; data-background-icon=&amp;quot;-&amp;quot;&lt;br /&gt;
				data-off-color=&amp;quot;#fff&amp;quot; data-on-color=&amp;quot;#aa6900&amp;quot;&lt;br /&gt;
				data-set-on=&amp;quot;Next&amp;quot; class=&amp;quot;inline mini&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;Device&amp;quot; data-get=&amp;quot;Shuffle&amp;quot; data-set=&amp;quot;Shuffle&amp;quot;&lt;br /&gt;
				data-icon=&amp;quot;fa-random&amp;quot; data-background-icon=&amp;quot;-&amp;quot;&lt;br /&gt;
				data-on-color=&amp;quot;#aa6900&amp;quot; data-off-color=&amp;quot;gray&amp;quot;&lt;br /&gt;
				data-get-on=&amp;quot;1&amp;quot; data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
				data-set-on=&amp;quot;1&amp;quot; data-set-off=&amp;quot;0&amp;quot; class=&amp;quot;inline mini&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;popup&amp;quot; class=&amp;quot;inline&amp;quot; data-width=&amp;quot;650px&amp;quot; data-height=&amp;quot;210px&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;div data-type=&amp;quot;push&amp;quot;&lt;br /&gt;
				data-icon=&amp;quot;fa-list&amp;quot; data-background-icon=&amp;quot;-&amp;quot;&lt;br /&gt;
				data-off-color=&amp;quot;#fff&amp;quot; data-on-color=&amp;quot;#aa6900&amp;quot;&lt;br /&gt;
				class=&amp;quot;mini&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div class=&amp;quot;dialog&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;header&amp;gt;&amp;lt;div data-type=&amp;quot;joinedlabel&amp;quot; data-device=&amp;quot;Device&amp;quot; data-mask=&amp;quot;Musikauswahl[ für $1]&amp;quot; data-get=&#039;[&amp;quot;roomName&amp;quot;]&#039; class=&amp;quot;inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/header&amp;gt;&lt;br /&gt;
				&lt;br /&gt;
				&amp;lt;div class=&amp;quot;top-space-10 left-align left-space&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;div&amp;gt;&lt;br /&gt;
						&amp;lt;div class=&amp;quot;large middle inline&amp;quot;&amp;gt;Favoriten: &amp;lt;/div&amp;gt;&lt;br /&gt;
						&amp;lt;div data-type=&amp;quot;select&amp;quot; &lt;br /&gt;
							data-device=&amp;quot;Device&amp;quot; &lt;br /&gt;
							data-list=&amp;quot;FavouritesList&amp;quot; &lt;br /&gt;
							data-alias=&amp;quot;FavouritesListAlias&amp;quot; &lt;br /&gt;
							data-delimiter=&amp;quot;|&amp;quot;&lt;br /&gt;
							data-quote=&amp;quot;/&amp;quot;&lt;br /&gt;
							data-get=&amp;quot;currentFavouriteNameMasked&amp;quot;&lt;br /&gt;
							data-set=&amp;quot;StartFavourite&amp;quot;&lt;br /&gt;
							class=&amp;quot;inline w3x&amp;quot;&lt;br /&gt;
							onchange=&amp;quot;$(&#039;.dialog-close&#039;).trigger(&#039;click&#039;);&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
					&lt;br /&gt;
					&amp;lt;div&amp;gt;&lt;br /&gt;
						&amp;lt;div class=&amp;quot;large middle inline&amp;quot;&amp;gt;Playlists: &amp;lt;/div&amp;gt;&lt;br /&gt;
						&amp;lt;div data-type=&amp;quot;select&amp;quot; &lt;br /&gt;
							data-device=&amp;quot;Device&amp;quot; &lt;br /&gt;
							data-list=&amp;quot;PlaylistsList&amp;quot; &lt;br /&gt;
							data-alias=&amp;quot;PlaylistsListAlias&amp;quot; &lt;br /&gt;
							data-delimiter=&amp;quot;|&amp;quot;&lt;br /&gt;
							data-quote=&amp;quot;/&amp;quot;&lt;br /&gt;
							data-get=&amp;quot;currentPlaylistNameMasked&amp;quot;&lt;br /&gt;
							data-set=&amp;quot;StartPlaylist&amp;quot;&lt;br /&gt;
							class=&amp;quot;inline w3x&amp;quot;&lt;br /&gt;
							onchange=&amp;quot;$(&#039;.dialog-close&#039;).trigger(&#039;click&#039;);&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
					&lt;br /&gt;
					&amp;lt;div&amp;gt;&lt;br /&gt;
						&amp;lt;div class=&amp;quot;large middle inline&amp;quot;&amp;gt;Radios: &amp;lt;/div&amp;gt;&lt;br /&gt;
						&amp;lt;div data-type=&amp;quot;select&amp;quot; &lt;br /&gt;
							data-device=&amp;quot;Device&amp;quot; &lt;br /&gt;
							data-list=&amp;quot;RadiosList&amp;quot; &lt;br /&gt;
							data-alias=&amp;quot;RadiosListAlias&amp;quot; &lt;br /&gt;
							data-delimiter=&amp;quot;|&amp;quot;&lt;br /&gt;
							data-quote=&amp;quot;/&amp;quot;&lt;br /&gt;
							data-get=&amp;quot;currentRadioNameMasked&amp;quot;&lt;br /&gt;
							data-set=&amp;quot;StartRadio&amp;quot;&lt;br /&gt;
							class=&amp;quot;inline w3x&amp;quot;&lt;br /&gt;
							onchange=&amp;quot;$(&#039;.dialog-close&#039;).trigger(&#039;click&#039;);&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
					&lt;br /&gt;
					&amp;lt;div&amp;gt;&lt;br /&gt;
						&amp;lt;div class=&amp;quot;large middle inline&amp;quot;&amp;gt;Audio-Eingang: &amp;lt;/div&amp;gt;&lt;br /&gt;
						&amp;lt;div data-type=&amp;quot;select&amp;quot; &lt;br /&gt;
							data-device=&amp;quot;Device&amp;quot; &lt;br /&gt;
							data-list=&amp;quot;Sonos:LineInPlayerList&amp;quot; &lt;br /&gt;
							data-alias=&amp;quot;Sonos:LineInPlayerListAlias&amp;quot; &lt;br /&gt;
							data-delimiter=&amp;quot;|&amp;quot;&lt;br /&gt;
							data-get=&amp;quot;currentAlbum&amp;quot;&lt;br /&gt;
							data-set=&amp;quot;PlayURI&amp;quot;&lt;br /&gt;
							class=&amp;quot;inline w3x&amp;quot;&lt;br /&gt;
							onchange=&amp;quot;$(&#039;.dialog-close&#039;).trigger(&#039;click&#039;);&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
					&lt;br /&gt;
					&amp;lt;div&amp;gt;&lt;br /&gt;
						&amp;lt;div class=&amp;quot;large middle inline&amp;quot;&amp;gt;Abspielliste: &amp;lt;/div&amp;gt;&lt;br /&gt;
						&amp;lt;div data-type=&amp;quot;select&amp;quot; &lt;br /&gt;
							data-device=&amp;quot;Device&amp;quot; &lt;br /&gt;
							data-list=&amp;quot;QueueList&amp;quot; &lt;br /&gt;
							data-alias=&amp;quot;QueueListAlias&amp;quot; &lt;br /&gt;
							data-delimiter=&amp;quot;|&amp;quot;&lt;br /&gt;
							data-get=&amp;quot;currentTrack&amp;quot;&lt;br /&gt;
							data-set=&amp;quot;Track&amp;quot;&lt;br /&gt;
							class=&amp;quot;inline w3x&amp;quot;&lt;br /&gt;
							onchange=&amp;quot;$(&#039;.dialog-close&#039;).trigger(&#039;click&#039;);&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;div data-type=&amp;quot;spinner&amp;quot;&lt;br /&gt;
		data-device=&amp;quot;Device&amp;quot;&lt;br /&gt;
		data-get=&amp;quot;Volume&amp;quot;&lt;br /&gt;
		data-set=&amp;quot;Volume&amp;quot;&lt;br /&gt;
		data-max=&amp;quot;50&amp;quot;&lt;br /&gt;
		data-step=&amp;quot;1&amp;quot;&lt;br /&gt;
		data-width=&amp;quot;350&amp;quot;&lt;br /&gt;
		data-icon-left=&amp;quot;fa-volume-down tall&amp;quot;&lt;br /&gt;
		data-icon-right=&amp;quot;fa-volume-up tall&amp;quot;&lt;br /&gt;
		data-gradient-color=&#039;[&amp;quot;orange&amp;quot;,&amp;quot;red&amp;quot;]&#039;&lt;br /&gt;
		class=&amp;quot;tap value positiononly top-space centered&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Notwendige Userreadings =====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Vorherige Version der Listenermittlung per Userreading&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
Für die Funktionalität der Favoriten- / Playlisten- / Radioauswahl werden u.U. Userreadings benötigt, die die entsprechenden Listen ermitteln, und für die Verwendung im FTUI aufbereiten.&lt;br /&gt;
Außerdem gibt es ein Userreading für die Anzeige der Position innerhalb des Titels. Dieses kann man selber mittels eines wiederkehrenden AT- oder DOIF-Befehls aktualisieren lassen (ich verwende dafür eine 15 Sekündige Aktualisierung mittels DOIF, solange eine Wiedergabe läuft).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Userreading an jedem Sonosplayer-Device:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favourites:LastActionResult.*?GetFavouritesWithCovers.* { &lt;br /&gt;
  if (ReadingsVal($name, &amp;quot;LastActionResult&amp;quot;, &amp;quot;&amp;quot;) =~ m/.*?: (.*)/) { &lt;br /&gt;
    return $1; &lt;br /&gt;
  } &lt;br /&gt;
}, &lt;br /&gt;
&lt;br /&gt;
Radios:LastActionResult.*?GetRadiosWithCovers.* { &lt;br /&gt;
  if (ReadingsVal($name, &amp;quot;LastActionResult&amp;quot;, &amp;quot;&amp;quot;) =~ m/.*?: (.*)/) { &lt;br /&gt;
    return $1; &lt;br /&gt;
  } &lt;br /&gt;
}, &lt;br /&gt;
&lt;br /&gt;
Playlists:LastActionResult.*?GetPlaylistsWithCovers.* { &lt;br /&gt;
  if (ReadingsVal($name, &amp;quot;LastActionResult&amp;quot;, &amp;quot;&amp;quot;) =~ m/.*?: (.*)/) { &lt;br /&gt;
    return $1; &lt;br /&gt;
  } &lt;br /&gt;
}, &lt;br /&gt;
&lt;br /&gt;
currentTrackPosition:LastActionResult.*?GetCurrentTrackPosition.* { &lt;br /&gt;
  if (ReadingsVal($name, &amp;quot;LastActionResult&amp;quot;, &amp;quot;&amp;quot;) =~ m/.*?: (.*)/) { &lt;br /&gt;
    return $1; &lt;br /&gt;
  } &lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
currentTrackPositionSec:currentTrackPosition.* {&lt;br /&gt;
  return SONOS_GetTimeSeconds(ReadingsVal($name, &amp;quot;currentTrackPosition&amp;quot;, &amp;quot;00:00:00&amp;quot;));&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
currentTrackDurationSec:currentTrackDuration.* {&lt;br /&gt;
 return SONOS_GetTimeSeconds(ReadingsVal($name, &amp;quot;currentTrackDuration&amp;quot;, &amp;quot;00:00:00&amp;quot;));&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
FavouritesList:LastActionResult.*?GetFavourites:.* { &lt;br /&gt;
  if (ReadingsVal($name, &amp;quot;LastActionResult&amp;quot;, &amp;quot;&amp;quot;) =~ m/.*?: (.*)/) { &lt;br /&gt;
    my @list = map { $_ =~ s/ /./g; $_ } map { substr($_, 1, -1) } split(&#039;,&#039;, $1);&lt;br /&gt;
    return join(&#039;|&#039;, @list);&lt;br /&gt;
  } &lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
FavouritesListAlias:LastActionResult.*?GetFavourites:.* { &lt;br /&gt;
  if (ReadingsVal($name, &amp;quot;LastActionResult&amp;quot;, &amp;quot;&amp;quot;) =~ m/.*?: (.*)/) { &lt;br /&gt;
    my @list = map { substr($_, 1, -1) } split(&#039;,&#039;, $1);&lt;br /&gt;
    return join(&#039;|&#039;, @list);&lt;br /&gt;
  } &lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
currentFavouriteNameMasked:currentFavouriteName.* {&lt;br /&gt;
  my $favouriteName = ReadingsVal($name, &amp;quot;currentFavouriteName&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
  $favouriteName =~ s/ /\./g;&lt;br /&gt;
  return $favouriteName;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
PlaylistsList:LastActionResult.*?GetPlaylists:.* { &lt;br /&gt;
  if (ReadingsVal($name, &amp;quot;LastActionResult&amp;quot;, &amp;quot;&amp;quot;) =~ m/.*?: (.*)/) { &lt;br /&gt;
    my @list = map { $_ =~ s/ /./g; $_ } map { substr($_, 1, -1) } split(&#039;,&#039;, $1);&lt;br /&gt;
    return join(&#039;|&#039;, @list);&lt;br /&gt;
  } &lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
PlaylistsListAlias:LastActionResult.*?GetPlaylists:.* { &lt;br /&gt;
  if (ReadingsVal($name, &amp;quot;LastActionResult&amp;quot;, &amp;quot;&amp;quot;) =~ m/.*?: (.*)/) { &lt;br /&gt;
    my @list = map { substr($_, 1, -1) } split(&#039;,&#039;, $1);&lt;br /&gt;
    return join(&#039;|&#039;, @list);&lt;br /&gt;
  } &lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
currentPlaylistNameMasked:currentPlaylistName.* {&lt;br /&gt;
  my $name = ReadingsVal($name, &amp;quot;currentPlaylistName&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
  $name =~ s/ /\./g;&lt;br /&gt;
  return $name;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
RadiosList:LastActionResult.*?GetRadios:.* { &lt;br /&gt;
  if (ReadingsVal($name, &amp;quot;LastActionResult&amp;quot;, &amp;quot;&amp;quot;) =~ m/.*?: (.*)/) { &lt;br /&gt;
    my @list = map { $_ =~ s/ /./g; $_ } map { substr($_, 1, -1) } split(&#039;,&#039;, $1);&lt;br /&gt;
    return join(&#039;|&#039;, @list);&lt;br /&gt;
  } &lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
RadiosListAlias:LastActionResult.*?GetRadios:.* { &lt;br /&gt;
  if (ReadingsVal($name, &amp;quot;LastActionResult&amp;quot;, &amp;quot;&amp;quot;) =~ m/.*?: (.*)/) { &lt;br /&gt;
    my @list = map { substr($_, 1, -1) } split(&#039;,&#039;, $1);&lt;br /&gt;
    return join(&#039;|&#039;, @list);&lt;br /&gt;
  } &lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
currentRadioNameMasked:currentRadioName.* {&lt;br /&gt;
  my $name = ReadingsVal($name, &amp;quot;currentRadioName&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
  $name =~ s/ /\./g;&lt;br /&gt;
  return $name;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
currentFavouriteNameMasked:currentFavouriteName.* {&lt;br /&gt;
  my $favouriteName = ReadingsVal($name, &amp;quot;currentFavouriteName&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
  $favouriteName =~ s/ /\./g;&lt;br /&gt;
  return $favouriteName;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
currentPlaylistNameMasked:currentPlaylistName.* {&lt;br /&gt;
  my $name = ReadingsVal($name, &amp;quot;currentPlaylistName&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
  $name =~ s/ /\./g;&lt;br /&gt;
  return $name;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
currentRadioNameMasked:currentRadioName.* {&lt;br /&gt;
  my $name = ReadingsVal($name, &amp;quot;currentRadioName&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
  $name =~ s/ /\./g;&lt;br /&gt;
  return $name;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
ZoneGroupNameDetails:(MasterPlayer|roomName|SlavePlayer).* {&lt;br /&gt;
  my $result = ReadingsVal(ReadingsVal($name, &#039;MasterPlayer&#039;, $name), &#039;roomName&#039;, &#039;k.A.&#039;);&lt;br /&gt;
  $result = &#039;&#039; if ($name eq ReadingsVal($name, &#039;MasterPlayer&#039;, $name));&lt;br /&gt;
  foreach my $slave (@{eval(ReadingsVal($name, &#039;SlavePlayer&#039;, &#039;[]&#039;))}) {&lt;br /&gt;
    $result .= &#039; + &#039;.ReadingsVal($slave, &#039;roomName&#039;, $slave);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return $result;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
SlavePlayerList:SlavePlayer:.* {&lt;br /&gt;
  my @player = @{eval(ReadingsVal($name, &#039;SlavePlayer&#039;, &#039;[]&#039;))};&lt;br /&gt;
  return (scalar(@player) ? &#039;-|&#039; : &#039;&#039;).join(&#039;|&#039;, @player);&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
SlavePlayerListAlias:SlavePlayer:.* {&lt;br /&gt;
  my @player = @{eval(ReadingsVal($name, &#039;SlavePlayer&#039;, &#039;[]&#039;))};&lt;br /&gt;
  return (scalar(@player) ? &#039;Auswahl|&#039; : &#039;&#039;).join(&#039;|&#039;, map { $_ = ReadingsVal($_, &#039;roomName&#039;, $_); $_ } @player);&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
AvailablePlayerList:(MasterPlayer|SlavePlayer):.* {&lt;br /&gt;
  my @player = @{eval(ReadingsVal(&#039;Sonos&#039;, &#039;MasterPlayer&#039;, &#039;[]&#039;))};&lt;br /&gt;
  &lt;br /&gt;
  # Selber entfernen...&lt;br /&gt;
  splice(@player, SONOS_posInList($name, @player), 1);&lt;br /&gt;
  &lt;br /&gt;
  # Slaveplayer entfernen...&lt;br /&gt;
  foreach my $elem (@{eval(ReadingsVal($name, &#039;SlavePlayer&#039;, &#039;[]&#039;))}) {&lt;br /&gt;
    my $pos = SONOS_posInList($elem, @player);&lt;br /&gt;
    splice(@player, $pos, 1) if ($pos &amp;gt;= 0);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  return (scalar(@player) ? &#039;-|&#039; : &#039;&#039;).join(&#039;|&#039;, @player);&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
AvailablePlayerListAlias:(MasterPlayer|SlavePlayer):.* {&lt;br /&gt;
  my @player = @{eval(ReadingsVal(&#039;Sonos&#039;, &#039;MasterPlayer&#039;, &#039;[]&#039;))};&lt;br /&gt;
  &lt;br /&gt;
  # Selber entfernen...&lt;br /&gt;
  splice(@player, SONOS_posInList($name, @player), 1);&lt;br /&gt;
  &lt;br /&gt;
  # Slaveplayer entfernen...&lt;br /&gt;
  foreach my $elem (@{eval(ReadingsVal($name, &#039;SlavePlayer&#039;, &#039;[]&#039;))}) {&lt;br /&gt;
    my $pos = SONOS_posInList($elem, @player);&lt;br /&gt;
    splice(@player, $pos, 1) if ($pos &amp;gt;= 0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (scalar(@player) ? &#039;Auswahl|&#039; : &#039;&#039;).join(&#039;|&#039;, map { $_ = ReadingsVal($_, &#039;roomName&#039;, $_); $_ } @player);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit werden bei einem Abruf der Favoriten / Playlists / Radios mittels entsprechendem Get-Befehl die entsprechenden Listen für alle Features aufbereitet und am Sonosplayer-Device bereitgestellt.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&#039;&#039;Aktuelle Userreading&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Mit der aktuellen Modulversion werden hierfür keinerlei Userreadings mehr benötigt.&lt;br /&gt;
&lt;br /&gt;
Mit dem Attribute &#039;&#039;getListsDirectlyToReadings&#039;&#039; werden alle möglichen Listen zu Favoriten, Playlists, Radios und der aktuellen Abspielliste (= Queue) automatisch in die richtigen Readings geschrieben.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren kann man mit dem Attribut &#039;&#039;simulateCurrentTrackPosition&#039;&#039; eine Simulation der aktuellen Titelposition aktivieren, sodass eine wiederkehrende Aktualisierung durch ein DOIF o.ä. nicht mehr notwendig ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Automatische Aktualisierung der Favoriten / Playlisten / Radios durch Notifies =====&lt;br /&gt;
Mit den folgenden Notifies kann man auf die Mitteilung der Sonosplayer über eine neue Version der jeweiligen Liste reagieren, und diese im Playerdevice automatisch aktualisieren lassen.&lt;br /&gt;
Damit hat man stets die aktuellen und zum Sonos-System passenden Listen in den Userreadings.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Sonos_GetNewFavouritesNotify notify Sonos_[^_]+:FavouritesVersion.* { fhem(&amp;quot;get $NAME FavouritesWithCovers&amp;quot;);; fhem(&amp;quot;get $NAME Favourites&amp;quot;);; }&lt;br /&gt;
&lt;br /&gt;
define Sonos_GetNewPlaylistsNotify notify Sonos_[^_]+:PlaylistsVersion.* { fhem(&amp;quot;get $NAME PlaylistsWithCovers&amp;quot;);; fhem(&amp;quot;get $NAME Playlists&amp;quot;);; }&lt;br /&gt;
&lt;br /&gt;
define Sonos_GetNewRadiosNotify notify Sonos_[^_]+:RadiosVersion.* { fhem(&amp;quot;get $NAME RadiosWithCovers&amp;quot;);; fhem(&amp;quot;get $NAME Radios&amp;quot;);; }&lt;br /&gt;
&lt;br /&gt;
define Sonos_GetNewQueueNotify notify Sonos_[^_]+:QueueVersion.* { fhem(&amp;quot;get $NAME QueueWithCovers&amp;quot;);; fhem(&amp;quot;get $NAME Queue&amp;quot;);; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Code Snippets]]&lt;br /&gt;
[[Category:Unterhaltungselektronik]]&lt;br /&gt;
[[Kategorie:Akustische Ausgabe]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_HMInfo_TempList/Weekplan&amp;diff=31293</id>
		<title>HomeMatic HMInfo TempList/Weekplan</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_HMInfo_TempList/Weekplan&amp;diff=31293"/>
		<updated>2019-09-29T11:19:16Z</updated>

		<summary type="html">&lt;p&gt;Moontear: Ich halte eine kurze Zusammenfassung sinnvoll, da ich jedes Mal diesen Artikel durchforste welche Befehle ich durchführen muss zum umschalten.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Behandlung von Wochenprogrammen für Thermostate&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=HMinfo Weekplan&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMinfo.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HMInfo TempList&#039;&#039;&#039; ist eine Funktion des Moduls [[Homematic_HMInfo|HMInfo]], die es erlaubt Temperaturlisten (Wochenprogramme) von [[HomeMatic Type Thermostat|Thermostaten]] zu verwalten.  &lt;br /&gt;
&lt;br /&gt;
== Einleitung== &lt;br /&gt;
Homematic bietet eine Reihe von Heizkörperthermostaten, welche mit einem Wochenprogramm ausgestattet sind. Die Erstellung und Verwaltung dieser Wochenprogramme ist im Device zumindest umständlich, siehe dazu [[HomeMatic_Type_Thermostat#Templates]]&lt;br /&gt;
== Begriffe==&lt;br /&gt;
Wir müssen strikt 3 Wochenpläne unterscheiden:&lt;br /&gt;
* &#039;&#039;activeList&#039;&#039; Wochenplan im Device. Dieser, und nur dieser ist &#039;&#039;&#039;wirksam&#039;&#039;&#039;. Er kann nicht direkt in FHEM dargestellt werden. FHEM muss die Daten auslesen um sie verarbeiten zu können. Siehe hierzu kommandos und attribute des Device:getConfig und autoReadReg. &lt;br /&gt;
* &#039;&#039;referenceList&#039;&#039; Wochenplan in FHEM. Für jedes Device wird ein Wochenplan (bei einigen Devices können es sogar mehrere sein) dargestellt. Dies ist die aus dem Device gelesene activeList. Es liegt in der Verantwortung des User, die Liste aktuell zu halten. &lt;br /&gt;
* &#039;&#039;tempTemplates&#039;&#039; Vorlagen für Wochenpläne. Diese werden in externen Dateien erstellt. Man kann Devices eines der tempTemplates zuweisen um es zu prüfen oder einzuspielen.&lt;br /&gt;
&lt;br /&gt;
== Wochenprogramme ==&lt;br /&gt;
=== Datei ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Ab firmware-Version 1.5 unterstützen die HM-TC-RT-DN nach Angaben eines Forennutzers auch Angaben im 5-Minuten-Raster.}}&lt;br /&gt;
Zur Verwendung einer Temperaturliste als Wochenprogramm muss eine Datei erzeugt werden, mit folgendem Inhalt:&lt;br /&gt;
* Für jede Temperaturliste eine Namensliste in der Form &amp;lt;code&amp;gt;entities:&amp;lt;name1&amp;gt;,&amp;lt;name2&amp;gt;,...&amp;lt;/code&amp;gt;&lt;br /&gt;
** ein Name darf in einer Datei &#039;&#039;&#039;nicht&#039;&#039;&#039; doppelt vorkommen. &lt;br /&gt;
** der gleiche Name darf in unterschiedlichen Dateien verwendet werden.&lt;br /&gt;
* In jeder Temperaturliste eine Zeile pro Tag, beginnend mit &amp;lt;code&amp;gt;tempList&amp;lt;Wochtentag&amp;gt;&amp;gt; ....&amp;lt;/code&amp;gt;&lt;br /&gt;
** Es muss eine Zeile je Wochentag vorhanden sein&lt;br /&gt;
* In jeder Zeile nach dem Wochentagscode eine Liste von Zeit/Wert-Paaren, diese stellen das jeweilige Tagesprogramm dar, z.B. &#039;&#039;&#039;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&#039;&#039;&#039;,&lt;br /&gt;
** Jedes Tagesprogramm beginnt um 00:00 Uhr. &lt;br /&gt;
** Das erste Paar 08:00 14.0 bedeutet also, dass von 00:00 &#039;&#039;&#039;bis 08:00&#039;&#039;&#039; eine Temperatur von 14.0 eingestellt werden soll. &lt;br /&gt;
** Das zweite Paar 15:00 18.0 bedeutet also, dass von 08:00 bis 15:00 18.0 Grad einzustellen sind&lt;br /&gt;
** Es sind immer Paare einzutragen&lt;br /&gt;
** der Beginn um 00:00 ist nicht einzutragen&lt;br /&gt;
** der letzte Eintrag &#039;&#039;&#039;muss&#039;&#039;&#039; an jeden Tag 24:00 sein&lt;br /&gt;
** Uhrzeiten sind auf halbe Stunden beschränkt. Einträge 08:00 und 08:30 sind gültig. 08:20 ist ungültig.&lt;br /&gt;
Beispiel:&lt;br /&gt;
 entities:tempTmpl1&lt;br /&gt;
 R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
 R_1_tempListSun&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 17.0&lt;br /&gt;
 R_2_tempListMon&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 R_3_tempListTue&amp;gt;07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 15.0&lt;br /&gt;
 R_4_tempListWed&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 R_5_tempListThu&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 R_6_tempListFri&amp;gt;07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 entities:tempTWohnzimmer&lt;br /&gt;
 R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 17.0&lt;br /&gt;
 R_1_tempListSun&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
 R_2_tempListMon&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 R_3_tempListTue&amp;gt;07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 15.0&lt;br /&gt;
 R_4_tempListWed&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 R_5_tempListThu&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 R_6_tempListFri&amp;gt;07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 &lt;br /&gt;
==== Erstellen der ersten Template-Datei====&lt;br /&gt;
Um nicht auf der grünen Wiese beginnen zu müssen, empfiehlt es sich den aktuellen Ist-Zustand (die &#039;&#039;referenceList&#039;&#039;) mit dem unten beschriebenen HMInfo-Befehl &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; in eine Datei zu schreiben. Vorab sollten die HMInfo-Attribute &amp;lt;code&amp;gt;configDir&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;configTempFile&amp;lt;/code&amp;gt; gesetzt sein.&lt;br /&gt;
 attr &amp;lt;HMInfo&amp;gt; configDir setup&lt;br /&gt;
 attr &amp;lt;HMInfo&amp;gt; configTempFile myWeekplan.cfg&lt;br /&gt;
 set &amp;lt;HMInfo&amp;gt; tempList save&lt;br /&gt;
Der letzte Befehl speichert die &#039;&#039;referenceList&#039;&#039; jedes Gerät in der Datei &amp;lt;code&amp;gt;setup/myWeekplan.cfg&amp;lt;/code&amp;gt;. Als &#039;&#039;Entity&#039;&#039; wird der Name des Thermostaten verwendet – das Attribut &#039;&#039;tempListTmpl&#039;&#039; wird nicht beachtet. Die Datei kann anschließend mit einem Text-Editor bearbeitet werden. Wochenpläne können zusammengefasst und verändert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Achtung&#039;&#039;: bei der Verwendung von [[configdb]] wird die Datei nicht in das Dateisystem, sondern gleich in die configDB geschrieben. Mit Hilfe des Kommandos&lt;br /&gt;
&lt;br /&gt;
  configdb filelist&lt;br /&gt;
  configdb fileexport myWeekplan.cfg&lt;br /&gt;
&lt;br /&gt;
kann diese exportiert, bearbeitet und danach wieder in die configdb eingelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== Templates zuweisen===&lt;br /&gt;
tempListTemplates werden immer in Files verwaltet. Man kann Templates in mehreren Files verwalten. Ferner gibt es unterschiedliche Methoden, ein File zu spezifizieren. &lt;br /&gt;
* &#039;&#039;&#039;attr tempListTmpl im Device&#039;&#039;&#039;: hier spezifiziert man das Template. Will man sich von templates entkoppeln sollte man &#039;&#039;&#039;tempListTmpl none&#039;&#039;&#039; unbedingt setzen.&lt;br /&gt;
** &#039;&#039;&#039;Wohnzimmer&#039;&#039;&#039;: das template &#039;&#039;&#039;Wohnzimmer&#039;&#039;&#039; wird im default File gesucht&lt;br /&gt;
** &#039;&#039;&#039;myWeekplan.cfg:Wohnzimmer&#039;&#039;&#039;: das template &#039;&#039;&#039;Wohnzimmer&#039;&#039;&#039; wird im File &#039;&#039;myWeekplan.cfg&#039;&#039; mit relativen Pfad von FHEM home gesucht&lt;br /&gt;
** &#039;&#039;&#039;./setup/myWeekplan.cfg:Wohnzimmer&#039;&#039;&#039;: das template &#039;&#039;&#039;Wohnzimmer&#039;&#039;&#039; wird im File &#039;&#039;myWeekplan.cfg&#039;&#039; mit relativen Pfad &#039;&#039;./setup&#039;&#039; gesucht&lt;br /&gt;
** &#039;&#039;&#039;/opt/fhem/myWeekplan.cfg:Wohnzimmer&#039;&#039;&#039;: das template &#039;&#039;&#039;Wohnzimmer&#039;&#039;&#039; wird im File &#039;&#039;myWeekplan.cfg&#039;&#039; mit absoluten Pfad &#039;&#039;/opt/fhem/&#039;&#039; gesucht&lt;br /&gt;
* &#039;&#039;&#039;attr configTempFile in HMInfo&#039;&#039;&#039;: spezifiziert weekplan configurationsfiles. Es ist eine Liste Wochenplan Files welche genutzt werden. Ist das Attribut nicht gesetzt wird als &#039;&#039;default tempList.cfg&#039;&#039; genutzt.&lt;br /&gt;
**  &#039;&#039;&#039;attr hm configTempFile myWeekPlan.cfg&#039;&#039;&#039;: FHEM kennt ein File mit Wochenplan. Dies ist auch das Default für alle tempListTmpl in denen kein File spezifiziert. &lt;br /&gt;
**  &#039;&#039;&#039;attr hm configTempFile mySummerPlan.cfg,myWinterPlan.cfg,myPartyPlan.cfg&#039;&#039;&#039;: FHEM sind 3 Files bekannt. Der erste Eintrag &#039;&#039;mySummerPlan.cfg&#039;&#039; ist der Default für tempListTmpl .&lt;br /&gt;
* &#039;&#039;&#039;attr configDir in HMInfo&#039;&#039;&#039;: spezifiziert einen Pfad, der &#039;&#039;auch&#039;&#039; für configTemplFile genutzt wird. Es erleichtert Konfigurations-Dateien in einem separaten Verzeichnis anzulegen. &#039;&#039;attr hm configDir setup&#039;&#039; wäre ein sinnvoller Eintrag. Das Verzeichnis &#039;&#039;setup&#039;&#039; unter fhem sollte erstellt werden. Ist das Attribut nicht gesetzt ist fhemHome der default.&lt;br /&gt;
&lt;br /&gt;
=== HMInfo Kommandos ===&lt;br /&gt;
Die HMInfo-Befehle, die Temperaturlisten verwalten, folgen dem Schema:&lt;br /&gt;
  set &amp;lt;HMInfo&amp;gt; tempList &amp;lt;Befehl&amp;gt; [&amp;lt;Dateiname&amp;gt;]&lt;br /&gt;
Die verfügbaren Befehle sind:&lt;br /&gt;
; &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt;&lt;br /&gt;
: Speichert den aktuellen Zustand der Thermostate (&#039;&#039;referenceList&#039;&#039;) in der &#039;&#039;tempList&#039;&#039;-Datei ab. Zu beachten ist, dass die aktuell in FHEM vorhandenen Werte benutzt werden. Der Benutzer muss selbst sicher stellen, dass diese mit den Werten im Gerät übereinstimmen. Alle eventuell vorher in der Datei vorhandenen Werte werden überschrieben.&lt;br /&gt;
; &amp;lt;code&amp;gt;verify&amp;lt;/code&amp;gt;&lt;br /&gt;
: Vergleicht den Ist-Zustand (&#039;&#039;referenceList&#039;&#039;) mit dem Soll-Zustand (dem Wochenplan aus dem &#039;&#039;tempListTmpl&#039;&#039;-Attribut). Abweichungen werden angezeigt, aber nicht behoben. Diese Prüfung ist auch Teil von HMInfos &amp;lt;code&amp;gt;configCheck&amp;lt;/code&amp;gt;.&lt;br /&gt;
; &amp;lt;code&amp;gt;restore&amp;lt;/code&amp;gt;&lt;br /&gt;
: Stellt den Soll-Zustand wieder her. Funktioniert im Prinzip wie &amp;lt;code&amp;gt;verify&amp;lt;/code&amp;gt;, jedoch werden alle Abweichungen vom Soll-Zustand korrigiert. Zu beachten ist die Verzögerung beim Schreiben (siehe [[HomeMatic HMInfo#protoEvents|HMInfo protoEvents]], Device Status und Beschreibung des Device) und dass nach dem Schreiben die &#039;&#039;referenceList&#039;&#039; neu geladen werden muss. Es wird empfohlen, &amp;lt;code&amp;gt;autoReadReg&amp;lt;/code&amp;gt; auf Level&amp;amp;nbsp;5 zu setzen. Ein Restore kann jederzeit ausgeführt werden. Sind alle Daten aktuell, wird &#039;&#039;keine&#039;&#039; Temperaturliste geschrieben; es erfolgt keinerlei Funkverkehr. &lt;br /&gt;
; &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt;&lt;br /&gt;
: Gibt eine Übersicht über die genutzten Templates aus.&lt;br /&gt;
&lt;br /&gt;
Das Web-Frontend verwendet den nahezu identischen Befehl &amp;lt;code&amp;gt;tempListG&amp;lt;/code&amp;gt;. Da dieser Befehl keine weiteren Argumente zulässt kann das Frontend ein Pulldown-Menü anzeigen. Das &amp;quot;G&amp;quot; steht für &amp;quot;Global&amp;quot; – da keine Filter unterstützt werden, wirken alle Befehle auf alle HomeMatic-Geräte.&lt;br /&gt;
&lt;br /&gt;
==Nutzungsbeispiele==&lt;br /&gt;
=== Mehrere Heizkörper in einem Raum===&lt;br /&gt;
Wenn sich in einem Raum mehrere Heizkörperthermostate befinden, sollten diese –&amp;amp;nbsp;wie in [[HM-CC-RT-DN]] beschrieben&amp;amp;nbsp;– gepeert werden.&lt;br /&gt;
HomeMatic geht davon aus, dass alle HM-CC-RT-DNs den selben Wochenplan haben (gilt ggf. auch für einen zugehörigen [[HM-TC-IT-WM-W-EU]]).&lt;br /&gt;
&lt;br /&gt;
Um dies zu erreichen definiert man einen Wochenplan für das Zimmer, beispielsweise &amp;lt;code&amp;gt;Wohnzimmer.cfg&amp;lt;/code&amp;gt;. Anschließend wird dieser Wochenplan allen Teammitgliedern zugewiesen:&lt;br /&gt;
&lt;br /&gt;
  attr &amp;lt;HM-CC-RT-DN#1&amp;gt;_Clima tempListTmpl Wohnzimmer&lt;br /&gt;
  attr &amp;lt;HM-CC-RT-DN#2&amp;gt;_Clima tempListTmpl Wohnzimmer&lt;br /&gt;
  attr &amp;lt;HM-CC-RT-DN#3&amp;gt;_Clima tempListTmpl Wohnzimmer&lt;br /&gt;
  attr &amp;lt;HM-TC-IT-WM-W-EU&amp;gt;_Climate tempListTmpl Wohnzimmer&lt;br /&gt;
  set hm tempListG restore&lt;br /&gt;
&lt;br /&gt;
=== Mehrere Heizkörper mit gleichen Profil===&lt;br /&gt;
Will man Wohnräume identisch behandeln im Hinblick auf den Wochenplan weisst man den Thermostaten identische Profile zu. &lt;br /&gt;
&lt;br /&gt;
 attr RTSusi_Clima tempListTmpl Kinderzimmer&lt;br /&gt;
 attr RTjonas_Clima tempListTmpl Kinderzimmer&lt;br /&gt;
 attr RTwohnzimmer_Clima tempListTmpl Kinderzimmer&lt;br /&gt;
 set hm tempListG restore&lt;br /&gt;
=== Wohnungsnutzung umschalten===&lt;br /&gt;
Das Heizprofil kann man Zentral umstellen. Verlässt man die Wohnung zum Urlaub, der Sommer naht, man macht die üblich 3-Woche Party... . Alle Thermostate sollen umgestellt werden, zentral mit wenigen Kommandos, einfach zu prüfen. Sinnvoll ist es mehrere tempList.cfg Files anzulegen. Nehmen wir 4 Files an, Winter, Urlaub zu hause UrlaubIn, Urlaub nicht zu hause UrlaubOut sowie Sommer. Ferner hat man (der Einfachheit halber) 3 RTs: RTwohn, RTschlaf, RTkueche. &lt;br /&gt;
Die RTs haben jeweils ihr attr tempListTmpl gesetzt entsprechend ihrem Namen. &lt;br /&gt;
Man legt also die 4 Files an mit entities die man zusammenfassen kann (templisten muss man natürlich befüllen:&lt;br /&gt;
 File Winter.cfg&lt;br /&gt;
  entity: RTwohn&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
  entity: RTschlaf&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
  entity: RTkueche&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
 File UrlaubIn.cfg&lt;br /&gt;
  entity: RTwohn,RTkueche&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
  entity: RTschlaf&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
 File UrlaubOut.cfg&lt;br /&gt;
  entity: RTwohn,RTschlaf,RTkueche&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
 File Sommer.cfg&lt;br /&gt;
  entity: RTwohn,RTschlaf,RTkueche&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
In HMInfo sollte man nun verwalten:&lt;br /&gt;
 attr RTwohn_Clima tempListTmpl RTwohn&lt;br /&gt;
 attr RTkueche_Clima tempListTmpl RTkueche&lt;br /&gt;
 attr RTschlaf_Clima tempListTmpl RTschlaf&lt;br /&gt;
 attr hm configTempFile Winter.cfg,Sommer.cfg,UrlaubIn.cfg,UrlaubOut.cfg&lt;br /&gt;
&lt;br /&gt;
Winter.cfg ist nun default. Mit set hm tempListG verify kann man prüfen, dass es entsprechend genutzt ist. Nun will man in Urlaub fahren. Man schaltet das Default durch umstellen der Reihenfolge um und aktiviert es durch ein restore:&lt;br /&gt;
 attr hm configTempFile UrlaubOut.cfg,Winter.cfg,Sommer.cfg,UrlaubIn.cfg&lt;br /&gt;
 set hm tempListG restore&lt;br /&gt;
&lt;br /&gt;
UrlaubOut.cfg ist default. Alle notwendigen Änderungen werden in die RTs programmiert.&lt;br /&gt;
Unberührt bleibt Opas Zimmer, der nicht das default file sondern ein dediziertes nutzt.&lt;br /&gt;
&lt;br /&gt;
  attr RTopa_Clima tempListTmpl Winter.cfg:RTopa&lt;br /&gt;
&lt;br /&gt;
Das template RTopa muss also nur im File Winter.cfg vorhanden sein:&lt;br /&gt;
&lt;br /&gt;
=== Vorgehen Winter/Sommerumstellung ===&lt;br /&gt;
Wenn man von dem einen auf das andere Heizprogramm umschalten möchte (ausgehend davon dass es Winter.cfg und Sommer.cfg gibt, und man auf Winter umstellen möchte), sind die typischen Befehle die Folgenden:&lt;br /&gt;
&lt;br /&gt;
  attr hm configTempFile Winter.cfg,Sommer.cfg&lt;br /&gt;
  set hm tempListG restore&lt;br /&gt;
  set hm tempListG verify&lt;br /&gt;
&lt;br /&gt;
Nach einer kurzen Zeit sollten alle Heizkörper ein &#039;&#039;passed&#039;&#039; per verify wiedergeben. Dass sie sofort nach setzen der neuen Konfiguration per &#039;&#039;restore&#039;&#039; ein fail wiedergeben ist normal.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Dewpoint&amp;diff=29467</id>
		<title>Dewpoint</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Dewpoint&amp;diff=29467"/>
		<updated>2019-02-10T17:35:16Z</updated>

		<summary type="html">&lt;p&gt;Moontear: attribute &amp;#039;absFeuchte&amp;#039; is deprecated, please use &amp;#039;absoluteHumidity&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:dewpoint}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Berechnung des Taupunkts&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=dewpoint&lt;br /&gt;
|ModTechName=98_dewpoint.pm&lt;br /&gt;
|ModOwner=Willi Herzig}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[dewpoint]] bietet Funktionen im Zusammenhang mit der Taupunktberechnung an. Die verfügbaren Funktionen, über einen Parameter bei der Definition gesteuert, sind &lt;br /&gt;
* dewpoint (Taupunkt)&lt;br /&gt;
* fan (erzeugt ein Event, das zur Lüftersteuerung verwendet werden kann)&lt;br /&gt;
* alarm (erzeugt einen &amp;quot;Schimmel-Alarm&amp;quot;, wenn eine Referenztemperatur unter den Taupunkt fällt)&lt;br /&gt;
{{todo|Seite muss noch vervollständigt werden --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 13:49, 14. Mär. 2016 (CET)}}&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Es muss ein Device geben, das die zur Berechnung erforderlichen Basisdaten &#039;&#039;Temperatur&#039;&#039; und &#039;&#039;Feuchte&#039;&#039; liefert. Die Namen der entsprechenden Readings können bei der Definition des &#039;&#039;dewpoint&#039;&#039; Device angegeben werden. &lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
Ein &#039;&#039;dewpoint&#039;&#039; Device (siehe auch {{Link2CmdRef|Anker=dewpoint}}) wird definiert mit:&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; dewpoint &amp;lt;type&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
Mögliche Werte und Bedeutung von&lt;br /&gt;
;type&lt;br /&gt;
*dewpoint - aus &#039;&#039;temp_name&#039;&#039; und &#039;&#039;hum_name&#039;&#039; wird der Taupunkt berechnet und als Reading mit dem Namen &#039;&#039;new_name&#039;&#039; an die durch &#039;&#039;devicename-regex&#039;&#039; spezifizierten Devices hinzugefügt&lt;br /&gt;
*fan - &lt;br /&gt;
*alarm - &lt;br /&gt;
&lt;br /&gt;
Die vollständige Syntax für den Typ &#039;&#039;dewpoint&#039;&#039;:&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; dewpoint &#039;&#039;&#039;dewpoint&#039;&#039;&#039; &amp;lt;devicename-regex&amp;gt; [&amp;lt;temp_name&amp;gt; &amp;lt;hum_name&amp;gt; &amp;lt;new_name&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
wobei die Platzhalter folgende Bedeutung haben:&lt;br /&gt;
;name&lt;br /&gt;
:der Name des definierten &#039;&#039;dewpoint&#039;&#039; Device&lt;br /&gt;
;devicename-regex&lt;br /&gt;
:Spezifikation des Geräts / der Geräte, von denen &#039;&#039;temp_name&#039;&#039; und &#039;&#039;hum_name&#039;&#039; gelesen und &#039;&#039;new_name&#039;&#039; geschrieben werden soll &lt;br /&gt;
;temp_name&lt;br /&gt;
:Name des Readings, das den Temperaturwert enthält; wenn dieser Parameter nicht angegeben ist, wird &#039;&#039;temperature&#039;&#039; angenommen&lt;br /&gt;
;hum_name&lt;br /&gt;
:Name des Readings, das den Feuchtewert enthält; wenn dieser Parameter nicht angegeben ist, wird &#039;&#039;humidity&#039;&#039; angenommen&lt;br /&gt;
;new_name&lt;br /&gt;
:Name des Readings, das den berechneten Taupunkt aufnehmen soll; wenn dieser Parameter nicht angegeben ist, wird &#039;&#039;dewpoint&#039;&#039; angenommen&lt;br /&gt;
&lt;br /&gt;
==== Statuszeile ====&lt;br /&gt;
Will man den Taupunkt nicht als einzelnes Reading &#039;&#039;dewpoint&#039;&#039;, sondern in Kurzform zusammen mit den anderen Werten in der Statuszeile anzeigen lassen, so muss man für &#039;&#039;temp_name&#039;&#039; und &#039;&#039;hum_name&#039;&#039; die Spezialwerte &#039;&#039;T&#039;&#039; und &#039;&#039;H&#039;&#039; angeben:&lt;br /&gt;
:&amp;lt;code&amp;gt;define dew_state dewpoint dewpoint .* T H D&amp;lt;/code&amp;gt;&lt;br /&gt;
Dies bewirkt, dass bei allen abgefragten Geräten die Werte &#039;&#039;T&#039;&#039; und &#039;&#039;H&#039;&#039; aus der Statuszeile ausgelesen werden und selbige dann wie folgt um den Taupunkt mit dem Buchstaben &#039;&#039;D&#039;&#039; erweitert wird:&lt;br /&gt;
&amp;lt;pre&amp;gt;T: 18.2 H: 55 D: 9.0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
;absoluteHumidity&lt;br /&gt;
:Beim Setzen dieses Attributs wird zusätzlich die absolute Luftfeuchtigkeit (in Gramm Wasser pro Kubikmeter Luft) berechnet und als Reading mit dem Namen &#039;&#039;absoluteHumidity&#039;&#039; ausgegeben. Hat man das Dewpoint-Device vorher so definiert, dass es den Taupunkt an den Status anhängt:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define dew_state dewpoint dewpoint .* T H D&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr dew_state absoluteHumidity 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:dann braucht man nichts weiter zu tun, die absolute Feuchtigkeit wird ab sofort unter dem Buchstaben &#039;&#039;A&#039;&#039; an den Status angehängt:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;T: 18.2 H: 55 D: 9.0 A: 8.5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Für den Taupunkt konnte man mit dem Parameter &#039;&#039;new_name&#039;&#039; einen eigenen Namen für das erzeugten Reading festlegen. Für die absolute Luftfeuchte ist dieser Parameter nicht vorhanden, das Reading hat immer den Standardnamen &#039;&#039;absoluteHumidity&#039;&#039; bzw. &#039;&#039;A&#039;&#039; in der Statuszeile.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
== Alternativen zu diesem Modul ==&lt;br /&gt;
&lt;br /&gt;
=== Berechnung direkt im userReading ===&lt;br /&gt;
&lt;br /&gt;
Um den Taupunkt einfach berechnen zu können, kann neben dem Modul &#039;&#039;dewpoint&#039;&#039; auch das Folgende userReading gesetzt werden (der Code dazu wurde direkt aus dem Modul entnommen und ist so über das Webinterface einzugeben).&lt;br /&gt;
&lt;br /&gt;
Das Userreading hat den Vorteil, nicht mit anderen Modulen in Konflikt zu geraten.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;Device&amp;gt; userReadings dew:temperature.* { &lt;br /&gt;
 my $dp;&lt;br /&gt;
 my $temperature = ReadingsVal($name,&amp;quot;temperature&amp;quot;,0);&lt;br /&gt;
 my $humidity = ReadingsVal($name,&amp;quot;humidity&amp;quot;,0);&lt;br /&gt;
 my $A = 17.2694;&lt;br /&gt;
 my $B = ($temperature &amp;gt; 0) ? 237.3 : 265.5;&lt;br /&gt;
 my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) );&lt;br /&gt;
 my $e = $humidity/ 100 * $es;&lt;br /&gt;
 if ($e == 0) { Log 1, &amp;quot;Error: dewpoint() e==0: temp=$temperature, hum=$humidity&amp;quot;;&lt;br /&gt;
  return 0;&lt;br /&gt;
 } &lt;br /&gt;
 my $e1 = $e / 610.78;&lt;br /&gt;
 my $f = log( $e1 ) / $A;&lt;br /&gt;
 my $f1 = 1 - $f;&lt;br /&gt;
 if ($f1 == 0) { &lt;br /&gt;
  Log 1, &amp;quot;Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity&amp;quot;;&lt;br /&gt;
  return 0;&lt;br /&gt;
 }&lt;br /&gt;
 $dp = $B * $f / $f1 ;&lt;br /&gt;
 sprintf &amp;quot;%.2f&amp;quot;, $dp;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
(Das obige Beispiel wurde nach Umstellung auf &amp;quot;Source&amp;quot;-Formatierung noch nicht getestet. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 13:49, 14. Mär. 2016 (CET))&lt;br /&gt;
&lt;br /&gt;
=== Variante über 99_myUtils ===&lt;br /&gt;
&lt;br /&gt;
Noch besser ist es, die im vorigen Abschnitt durchgeführte Berechnung nicht für jedes Device per userReading wieder neu einzugeben, sondern diese einmalig als Funktion in der 99_myUtils zu hinterlegen und diese dann im jeweiligen Device im userReading nur noch aufzurufen.&lt;br /&gt;
&lt;br /&gt;
Dazu ist in der 99_myUtils folgende sub anzulegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub urDewpoint&lt;br /&gt;
{&lt;br /&gt;
	my ($dname,$tname,$hname) = @_;&lt;br /&gt;
&lt;br /&gt;
	#Prüfen, ob überhaupt ein Device(-name) als Parameter übergeben wurde&lt;br /&gt;
	if(!defined($dname)) {&lt;br /&gt;
		Log3 undef,1,&amp;quot;Error: urDewpoint - No device specified!&amp;quot;;&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#Prüfen, ob das angegebene Device überhaupt existiert&lt;br /&gt;
	if(!$defs{$dname}) {&lt;br /&gt;
		Log3 undef,1,&amp;quot;Error: urDewpoint - Device $dname is not defined!&amp;quot;;&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	#Wenn keine Readingsnamen für die Temperatur oder Luftfeuchtigkeit &lt;br /&gt;
	#übergebenwurde wird per default temperature oder humidity verwendet&lt;br /&gt;
	$tname=&#039;temperature&#039; if(!defined($tname));&lt;br /&gt;
	$hname=&#039;humidity&#039; if(!defined($hname));&lt;br /&gt;
	&lt;br /&gt;
	my $dp;&lt;br /&gt;
	&lt;br /&gt;
	#Auslesen der Readingswerte für Temperatur und Luftfeuchtigkeit aus den&lt;br /&gt;
	#entsprechenden Readings des Devic&lt;br /&gt;
	my $temperature = ReadingsVal($dname,$tname,0);&lt;br /&gt;
	my $humidity = ReadingsVal($dname,$hname,0);&lt;br /&gt;
	&lt;br /&gt;
	#Magische Berechnung :)&lt;br /&gt;
	my $A = 17.2694;&lt;br /&gt;
	my $B = ($temperature &amp;gt; 0) ? 237.3 : 265.5;&lt;br /&gt;
	my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) );&lt;br /&gt;
	my $e = $humidity/ 100 * $es;&lt;br /&gt;
	if ($e == 0) { &lt;br /&gt;
		Log3 undef,1, &amp;quot;Error: urDewpoint: $dname - e==0: temp=$temperature, hum=$humidity&amp;quot;;&lt;br /&gt;
		return &#039;ERR&#039;;&lt;br /&gt;
	} &lt;br /&gt;
	my $e1 = $e / 610.78;&lt;br /&gt;
	my $f = log( $e1 ) / $A;&lt;br /&gt;
	my $f1 = 1 - $f;&lt;br /&gt;
	if ($f1 == 0) { &lt;br /&gt;
		Log3 undef,1, &amp;quot;Error: urDewpoint: $dname - (1-f)==0: temp=$temperature, hum=$humidity&amp;quot;;&lt;br /&gt;
		return &#039;ERR&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$dp = $B * $f / $f1 ;&lt;br /&gt;
	&lt;br /&gt;
	#Rückgabe der Taupunkt-Temperatur&lt;br /&gt;
	return sprintf &amp;quot;%.2f&amp;quot;, $dp;	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann dann im jeweiligen Device ganz einfach ein userReading definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;Device&amp;gt; userReadings dew:temperature.* {urDewpoint($name)}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Readings-Namen für Temperatur und Luftfeuchtigkeit bei Device können bei bedarf auch abweichend angegeben werden. Bei den Homematic-Wandthermostaten heßt das Reading für die tatsächlich gemessene Temperatur measured-temp und nicht temperature, dann würde die definition des userReading wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;Device&amp;gt; userReadings dew:measured-temp.* {urDewpoint($name,&#039;measured-temp&#039;)}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Forendiskussion um {{Link2Forum|Topic=8576|LinkText=Lüften oder nicht}}&lt;br /&gt;
* Forendiskussion um {{Link2Forum|Topic=23080|LinkText=Temperaturdifferenz}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=26706</id>
		<title>Alexa-Fhem</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=26706"/>
		<updated>2018-05-14T09:58:47Z</updated>

		<summary type="html">&lt;p&gt;Moontear: node.js 4.3 ist deprecated. Neue Node.JS funktioniert ebenfalls wunderbar in der Lambda Funktion&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=81324|Message=733986|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;
{{Randnotiz|RNTyp=[g|Info]|RNText=createKey.sh erzeugt ein Zertifikat, das 365 Tage gültig ist. Dies muss deswegen jedes Jahr erneuert werden }}&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 den 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/fhem/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 ===={{Randnotiz|RNTyp=r|RNText=Die AWS Seiten sehen inzwischen etwas anders aus. Eine angepasste Beschreibung findet sich im  {{Link2Forum|Topic=81790|Message=739211|LinkText=Forum}}. Bitte auch die Hinweise dort lesen.}}&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 6.10 (oder 8.10). &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>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Withings&amp;diff=25652</id>
		<title>Withings</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Withings&amp;diff=25652"/>
		<updated>2018-03-02T23:32:48Z</updated>

		<summary type="html">&lt;p&gt;Moontear: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Übersicht==&lt;br /&gt;
Das Withings Modul kann mit Withings / Nokia Health Produkten umgehen. Das Modul (32_withings.pm) lässt sich direkt aus dem Forumpost beziehen: {{Link2Forum|Topic=64944|LinkText=Forumsthread}}&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
* es müssen folgende PERL Module installiert sein: JSON, LWP::Simple and Digest::MD5&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
Withings Device definieren:&lt;br /&gt;
  define &amp;lt;name&amp;gt; withings [ACCOUNT] &amp;lt;login&amp;gt; &amp;lt;password&amp;gt;&lt;br /&gt;
  define &amp;lt;name&amp;gt; withings &amp;lt;device&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls ein Withings Device angelegt wird, werden automatisch alle Devices im Withings / Nokia Health Account in FHEM angelegt.&lt;br /&gt;
===Beispiel===&lt;br /&gt;
  define withings withings abc@test.com myPassword&lt;br /&gt;
&lt;br /&gt;
==Readings==&lt;br /&gt;
Folgende Readings bietet das Modul aktuell an:&lt;br /&gt;
  height&lt;br /&gt;
  weight&lt;br /&gt;
  fatFreeMass&lt;br /&gt;
  muscleRatio&lt;br /&gt;
  fatMassWeight&lt;br /&gt;
  fatRatio&lt;br /&gt;
  boneMassWeight&lt;br /&gt;
  boneRatio&lt;br /&gt;
  hydration&lt;br /&gt;
&lt;br /&gt;
  diastolicBloodPressure&lt;br /&gt;
  systolicBloodPressure&lt;br /&gt;
  heartPulse&lt;br /&gt;
  pulseWave&lt;br /&gt;
  spo2&lt;br /&gt;
&lt;br /&gt;
  bodyTemperature&lt;br /&gt;
  skinTemperature&lt;br /&gt;
  temperature&lt;br /&gt;
&lt;br /&gt;
  dailySteps&lt;br /&gt;
  dailyDistance&lt;br /&gt;
  dailyElevation&lt;br /&gt;
  dailyDescent&lt;br /&gt;
  dailyDurationLight&lt;br /&gt;
  dailyDurationModerate&lt;br /&gt;
  dailyDurationIntense&lt;br /&gt;
  dailyCaloriesActive&lt;br /&gt;
  dailyCaloriesPassive&lt;br /&gt;
&lt;br /&gt;
  sleepDurationAwake&lt;br /&gt;
  sleepDurationLight&lt;br /&gt;
  sleepDurationDeep&lt;br /&gt;
  sleepDurationREM&lt;br /&gt;
  wakeupCount&lt;br /&gt;
&lt;br /&gt;
  co2&lt;br /&gt;
  temperature&lt;br /&gt;
  light&lt;br /&gt;
  noise&lt;br /&gt;
  voc&lt;br /&gt;
  battery&lt;br /&gt;
  batteryLevel&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Waagen]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Withings&amp;diff=25651</id>
		<title>Withings</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Withings&amp;diff=25651"/>
		<updated>2018-03-02T23:32:35Z</updated>

		<summary type="html">&lt;p&gt;Moontear: Neuanlage des kurzes Wiki Artikels für den Withings Forum Post um diesen einfacher finden zu können&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Übersicht==&lt;br /&gt;
Das Withings Modul kann mit Withings / Nokia Health Produkten umgehen. Das Modul (32_withings.pm) lässt sich direkt aus dem Forumpost beziehen: {{Link2Forum|Topic=64944|LinkText=Forumsthread}}&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
* es müssen folgende PERL Module installiert sein: JSON, LWP::Simple and Digest::MD5&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
Withings Device definieren:&lt;br /&gt;
  define &amp;lt;name&amp;gt; withings [ACCOUNT] &amp;lt;login&amp;gt; &amp;lt;password&amp;gt;&lt;br /&gt;
  define &amp;lt;name&amp;gt; withings &amp;lt;device&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls ein Withings Device angelegt wird, werden automatisch alle Devices im Withings / Nokia Health Account in FHEM angelegt.&lt;br /&gt;
===Beispiel:===&lt;br /&gt;
  define withings withings abc@test.com myPassword&lt;br /&gt;
&lt;br /&gt;
==Readings==&lt;br /&gt;
Folgende Readings bietet das Modul aktuell an:&lt;br /&gt;
  height&lt;br /&gt;
  weight&lt;br /&gt;
  fatFreeMass&lt;br /&gt;
  muscleRatio&lt;br /&gt;
  fatMassWeight&lt;br /&gt;
  fatRatio&lt;br /&gt;
  boneMassWeight&lt;br /&gt;
  boneRatio&lt;br /&gt;
  hydration&lt;br /&gt;
&lt;br /&gt;
  diastolicBloodPressure&lt;br /&gt;
  systolicBloodPressure&lt;br /&gt;
  heartPulse&lt;br /&gt;
  pulseWave&lt;br /&gt;
  spo2&lt;br /&gt;
&lt;br /&gt;
  bodyTemperature&lt;br /&gt;
  skinTemperature&lt;br /&gt;
  temperature&lt;br /&gt;
&lt;br /&gt;
  dailySteps&lt;br /&gt;
  dailyDistance&lt;br /&gt;
  dailyElevation&lt;br /&gt;
  dailyDescent&lt;br /&gt;
  dailyDurationLight&lt;br /&gt;
  dailyDurationModerate&lt;br /&gt;
  dailyDurationIntense&lt;br /&gt;
  dailyCaloriesActive&lt;br /&gt;
  dailyCaloriesPassive&lt;br /&gt;
&lt;br /&gt;
  sleepDurationAwake&lt;br /&gt;
  sleepDurationLight&lt;br /&gt;
  sleepDurationDeep&lt;br /&gt;
  sleepDurationREM&lt;br /&gt;
  wakeupCount&lt;br /&gt;
&lt;br /&gt;
  co2&lt;br /&gt;
  temperature&lt;br /&gt;
  light&lt;br /&gt;
  noise&lt;br /&gt;
  voc&lt;br /&gt;
  battery&lt;br /&gt;
  batteryLevel&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Waagen]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=System%C3%BCbersicht&amp;diff=25650</id>
		<title>Systemübersicht</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=System%C3%BCbersicht&amp;diff=25650"/>
		<updated>2018-03-02T23:21:43Z</updated>

		<summary type="html">&lt;p&gt;Moontear: /* Interfaces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein FHEM &#039;&#039;&#039;System&#039;&#039;&#039; besteht im Prinzip aus den in der nachfolgenden &#039;&#039;&#039;Übersicht&#039;&#039;&#039; aufgeführten Bestandteilen.&lt;br /&gt;
[[Datei:Systemübersicht.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Bei der Komponente &#039;&#039;&#039;Server&#039;&#039;&#039; muss unterschieden werden zwischen dem eigentlichen &#039;&#039;&#039;FHEM&#039;&#039;&#039; Hausautomations-Server (implementiert in der Perl-Datei fhem.pl) und der Hardware, auf der dieser Server ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
Als Server &#039;&#039;&#039;Hardware&#039;&#039;&#039; sind (z.&amp;amp;nbsp;B.) möglich:&lt;br /&gt;
* Windows Rechner&lt;br /&gt;
* Linux Rechner&lt;br /&gt;
* OS X Rechner&lt;br /&gt;
* Router (z.&amp;amp;nbsp;B. [[AVM Fritz!Box|FritzBox]])&lt;br /&gt;
* Einplatinencomputer, wie [[:Kategorie:Raspberry Pi|Raspberry Pi]], [[BeagleBone Black]]&lt;br /&gt;
* DockStar, PogoPlug, etc.&lt;br /&gt;
* diverse NAS Systeme wie Buffalo Linkstation, Synology Diskstation&lt;br /&gt;
&lt;br /&gt;
(Diese Aufstellung ist nur eine unvollständige Auswahl; Details zu unterstützten Server Systemen finden sich in der Kategorie [[:Kategorie:Server Hardware|Server Hardware]]).&lt;br /&gt;
&lt;br /&gt;
== Perl ==&lt;br /&gt;
Auf dem Server muss Perl installiert sein. Zur erforderlichen Version gibt es widersprüchliche Aussagen, die vor allem daraus resultieren, dass verschiedene FHEM-Module von verschiedenen Entwicklern stammen und daher unterschiedliche Anforderungen stellen. Laut FHEM-Webseite wird mindestens Version 5.6 benötigt, faktisch setzen aber viele Module 5.10 oder sogar 5.12 voraus. Der Betrieb mit Grundfunktionen ist jedoch zumindest ab Version 5.8.8 mit Einschränkungen möglich.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Das Hausautomations-System wird definiert über die [[Konfiguration]], die im Regelfall aus der &lt;br /&gt;
* reinen Textdatei &amp;lt;code&amp;gt;fhem.cfg&amp;lt;/code&amp;gt; (Standard nach der Erstinstallation) oder alternativ einer&lt;br /&gt;
* [[configdb|SQL-Datenbank]]&lt;br /&gt;
besteht.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration enthält Definitionen für die Bestandteile (Geräte) und Funktionen des jeweiligen Hausautomations-Systems. Die verfügbaren Befehle und deren Syntax sind in der Befehlsreferenz ({{Link2CmdRef}}) aufgeführt und beschrieben. Zu einigen Hilfsmodulen gibt es [[:Kategorie:Hilfsmodul|detaillierte Beschreibungen]] mit Beispielen.&lt;br /&gt;
&lt;br /&gt;
== Benutzeroberfläche ==&lt;br /&gt;
Der Zugriff auf FHEM erfolgt mittels Webbrowser oder App über die verfügbaren &#039;&#039;&#039;[[:Kategorie:FHEM Frontends|FHEM Benutzeroberflächen]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
In den FHEM Server integriert ist ein Webserver ([[PGM2]]), der im Prinzip immer zur Verfügung steht. Abhängig vom benutzten Klienten ist PGM2 über &lt;br /&gt;
* &amp;lt;code&amp;gt;serverhostnameoderIP:8083/fhem&amp;lt;/code&amp;gt; (Desktop-Darstellung = Port 8083),&lt;br /&gt;
* &amp;lt;code&amp;gt;serverhostnameoderIP:8084/fhem&amp;lt;/code&amp;gt; (Smartphone-Darstellung = Port 8084) oder &lt;br /&gt;
* &amp;lt;code&amp;gt;serverhostnameoderIP:8085/fhem&amp;lt;/code&amp;gt; (Tablet-Darstellung = Port 8085) &lt;br /&gt;
erreichbar.&lt;br /&gt;
&lt;br /&gt;
Eine Auswahl der Benutzeroberflächen:&lt;br /&gt;
* PGM2 - das Standardinterface&lt;br /&gt;
* [[FLOORPLAN]]&lt;br /&gt;
* [[FHEM Tablet UI]]&lt;br /&gt;
* [[SmartVISU]]&lt;br /&gt;
* diverse Apps für iOS und Android (Auswahl unter: [[:Kategorie:FHEM Frontends|FHEM Benutzeroberflächen]])&lt;br /&gt;
&lt;br /&gt;
Beispielhafte Screenshots diverser Benutzeroberflächen: http://fhem.de/fhem.html#Screenshots&lt;br /&gt;
&lt;br /&gt;
== Module ==&lt;br /&gt;
Die Funktionalität von FHEM kann über &#039;&#039;&#039;Module&#039;&#039;&#039; erweitert werden. Module können die unterschiedlichsten Aufgaben übernehmen vom Anbinden eines Hardwaresystems&lt;br /&gt;
über die Bereitstellung eines Frontends bis zur Automatisierung von Aufgaben. Beispiele für Module:&lt;br /&gt;
* 00_CUL.pm - Implementierung der Unterstützung für den [[CUL]]&lt;br /&gt;
* 11_FHT.pm - Unterstützung der [[:Kategorie:FHT Components|FHT]] Heizungssteuerung&lt;br /&gt;
* 95_FLOORPLAN.pm - Grundriss (oder Ähnliches) als Benutzeroberfläche &lt;br /&gt;
* uvm.&lt;br /&gt;
&lt;br /&gt;
Module können unterteilt werden in&lt;br /&gt;
* [[:Kategorie:FHEM Befehl|Befehlsmodule]] (FHEM-Befehle sind teilweise eigenständige Module) &lt;br /&gt;
* [[:Kategorie:Hilfsmodul|Hilfsmodule]]&lt;br /&gt;
* [[:Kategorie:Gerätemodul|Gerätemodule]]&lt;br /&gt;
Die offiziell in FHEM enthaltenen Module sind in der {{Link2CmdRef}} beschrieben. Sie werden über den [[Update]]-Befehl von FHEM verteilt und aktualisiert. Voraussetzung für die Aufnahme als offizielles Modul sind Supportwille durch den Entwickler und Dokumentation des Moduls.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich existiert eine Vielzahl von [[:Kategorie:Modul (Inoffiziell)|inoffiziellen Modulen]], die manuell in FHEM installiert werden können. Auch die Aktualisierung erfolgt nicht über den Update-Befehl, sondern muss durch den Nutzer selbst erfolgen. Inoffizielle Module sind an den verschiedensten Stellen zu finden:&lt;br /&gt;
* [[:Kategorie:Modul (Contrib)|Contrib]]-Verzeichnis im offiziellen FHEM-Sourcecode-SVN [http://svn.fhem.de/trac/browser/trunk/fhem/contrib]&lt;br /&gt;
* Beiträge im [https://forum.fhem.de/ FHEM-Forum]&lt;br /&gt;
* private Homepages&lt;br /&gt;
&lt;br /&gt;
== Interfaces ==&lt;br /&gt;
Die Verbindung zu den angeschlossenen &#039;&#039;&#039;Geräten&#039;&#039;&#039; der Hausautomation wird im Allgemeinen - geräteabhängig - über [[Interface|Interfaces]] (manchmal auch als &#039;&#039;&#039;Gateway&#039;&#039;&#039; bezeichnet) hergestellt. Das kann z.&amp;amp;nbsp;B. im Falle von [[HomeMatic]] ein [[HMLAN Konfigurator]] sein, ein mittels LAN mit dem FHEM Server verbundenes Gerät, das die FHEM Steuerbefehle  in das HomeMatic Funkprotokoll umsetzt - und auch die Funktelegramme der HomeMatic Komponenten an FHEM zurückgibt. Entsprechende Interfaces gibt es auch für andere Funkprotokolle und für die drahtgebundenen Systeme.&lt;br /&gt;
&lt;br /&gt;
Eine (unvollständige) Liste solcher Interfaces (siehe auch [[:Kategorie:Interfaces|Kategorie Interfaces]]):&lt;br /&gt;
* [[CUL]] - je nach Einstellung für die Kommunikation mit [[:Kategorie:FS20 Components|FS20]], [[:Kategorie:FHT Components|FHT]] und andere [[SlowRF]] Protokolle, [[MAX|MAX!]] Heizungssteuerung oder [[:Kategorie:HomeMatic Components|HomeMatic]] und, mit Einschränkungen, InterTechno (nur senden)&lt;br /&gt;
* [[CUNO]], ähnlich CUL, jedoch nicht per USB sondern per IP angebunden (z.Zt. -Stand Januar 2014 - nicht für HomeMatic empfohlen)&lt;br /&gt;
* [[HMLAN Konfigurator|HomeMatic LAN Konfigurations-Adapter]] - HomeMatic&lt;br /&gt;
* [[MAX#MAXLAN|MAX! Cube LAN-Gateway]]&lt;br /&gt;
* Schnittstellen(karten) für [[:Kategorie:1-Wire|1-Wire]]&lt;br /&gt;
* TCM(120/310) zur Anbindung von [[:Kategorie:EnOcean Components|EnOcean]]&lt;br /&gt;
* [[Arduino]] mit Firmata über USB oder Netzwerk&lt;br /&gt;
* [[panStamp]] als Möglichkeit Arduinos mit diversen Sensor- und I/O- Boards per 868MHz Funk über das SWAP protokoll anzubinden&lt;br /&gt;
* [[JeeLink]], ein weiteres USB-Stick Interface (ebenfalls arduino basiert) für diverse 433MHz und 868MHz Komponenten&lt;br /&gt;
* [[RFXtrx]] für InterTechno, RSL, ELRO etc., Wetter-Sensoren (Oregon-Scientific, Cresta, La Crosse, TFA, UPM) und andere 433&amp;amp;nbsp;Mhz Geräte.&lt;br /&gt;
* manche Komponenten ([[:Kategorie:IP Components|IP Komponenten]]) können über TCP/IP (LAN) direkt vom FHEM Server aus angesprochen werden; hier ist dann kein weiteres Interface im eigentlichen Sinne erforderlich. Dies gilt auch für diverse Module die Geräte über WEB Dienste des Herstellers anbinden (z.&amp;amp;nbsp;B. [[Withings]], [[netatmo]]).&lt;br /&gt;
&lt;br /&gt;
== Protokolle ==&lt;br /&gt;
Der Kommunikation zwischen Interfaces und Geräten liegt jeweils ein bestimmtes Protokoll zugrunde. Unterstützte Protokolle mit ihren Eigenschaften sind in der folgenden Tabelle aufgelistet.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Übersicht über unterstützte Funkprotokolle&lt;br /&gt;
|-&lt;br /&gt;
! Name !! rfMode !! Frequenz !! Modulation !! Datenrate !! class=&amp;quot;unsortable&amp;quot; | Interfaces !! class=&amp;quot;unsortable&amp;quot; | Modul !! class=&amp;quot;unsortable&amp;quot; | Geräte (Beispiel) !! class=&amp;quot;unsortable&amp;quot; | Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [[FS20_Allgemein|FS20]] || SlowRF || 868,35MHz || AM || 1kHz || CU*, FHZ || {{Link2CmdRef|Anker=FS20|Label=FS20}} || - || -&lt;br /&gt;
|-&lt;br /&gt;
| FHT  || SlowRF || 868,35MHz || AM || 1kHz || CU*, FHZ || {{Link2CmdRef|Anker=CUL_FHTTK|Label=FHTTK}}, {{Link2CmdRef|Anker=FHT|Label=FHT}} || Heizungsregelung || -&lt;br /&gt;
|-&lt;br /&gt;
| S300 || SlowRF || 868,35MHz || AM || 1kHz || CU*, FHZ || {{Link2CmdRef|Anker=CUL_WS|Label=CUL_WS}} || Temperatur-/Feuchtesensoren || -&lt;br /&gt;
|-&lt;br /&gt;
| HMS || SlowRF || 868,35MHz || AM || 1kHz || CU*O, FHZ || - || ?? || -&lt;br /&gt;
|-&lt;br /&gt;
| EM || SlowRF || 868,35MHz || AM || 1kHz || CU*, FHZ || {{Link2CmdRef|Anker=CUL_EM|Label=CUL_EM}} || Energiemonitore (Strom, Gas) || -&lt;br /&gt;
|-&lt;br /&gt;
| [[HomeMatic ]]|| HomeMatic || 868,3MHz || FM || 10kHz || CU*, [[HM-CFG-LAN_LAN_Konfigurations-Adapter|HMLan]], [[HM-CFG-USB_USB_Konfigurations-Adapter|HMUsb]] || {{Link2CmdRef|Anker=CUL_HM|Label=CUL_HM}}  || [[:Kategorie:HomeMatic_Components|diverse]] || -&lt;br /&gt;
|-&lt;br /&gt;
| [[MAX|MAX!]] || MAX || 868,3MHz || FM || 20kHz || CU*, [[MAX#MAXLAN|MAXLAN]] ||  {{Link2CmdRef|Lang=de|Anker=MAX|Label=MAX}} ||  [[:Kategorie:MAX|Wandthermostat, Heizkörperthermostate, Fensterkontakt, Zwischenstecker]] ||  -&lt;br /&gt;
|-&lt;br /&gt;
| IT || - || 433MHz || AM? || 1kHz || CU*433, || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| Firmata WiFi || - || 2,4/5 GHz ||  ||  ||  || {{Link2CmdRef|Anker=FRM|Label=FRM}} || Arduino || -&lt;br /&gt;
|-&lt;br /&gt;
| SWAP || - || 868 (433/915) MHz || GFSK || 38.3835 Kbps || panStamp (+panStick) || {{Link2CmdRef|Anker=SWAP|Label=SWAP}} || RGB LED Driver, diverse Sensoren und Aktoren || -&lt;br /&gt;
|-&lt;br /&gt;
| [[:Kategorie:EnOcean  Components|EnOcean]] || - || 315 / 868 / 902 / 928MHz || ASK || 125 kbit/s || {{Link2CmdRef|Anker=TCM|Label=TCM}} || {{Link2CmdRef|Anker=EnOcean|Label=EnOcean}} || Batterielose Funksensoren, diverse Aktoren || -&lt;br /&gt;
|-&lt;br /&gt;
| PCA || - || 868,35MHz || ?? || ?? || [[JeeLink]] || {{Link2CmdRef|Anker=PCA301|Label=PCA301}} || [[PCA301 Funkschaltsteckdose mit Energieverbrauchsmessung|PCA301]] || -&lt;br /&gt;
|-&lt;br /&gt;
| [[La Crosse]] || - || 868,35MHz || ?? || ?? || [[JeeLink]], LGW || {{Link2CmdRef|Anker=Lacrosse|Label=Lacrosse}} || LaCrosse IT+ (Technoline) Sensoren || -&lt;br /&gt;
|-&lt;br /&gt;
| ZigBee Light Link || - || 2,4 GHz ||  ||  || HUE Bridge (RaspBee) || {{Link2CmdRef|Anker=HUEBridge|Label=HUEBridge}} || Philips HUE und LightLink Lampen (auch Osram LIGHTIFY an der HUE-Bridge)|| [http://www.developers.meethue.com/documentation/how-hue-works]&lt;br /&gt;
|-&lt;br /&gt;
| [[MySensors]] || - || 2,4 GHz ||  ||  || MySensors Gateway  || [[MYSENSORS]] || [http://www.mysensors.org/build/ Selbstbau-Sensoren] || -&lt;br /&gt;
|-&lt;br /&gt;
| [[:Kategorie:Z-Wave Components|Z-Wave]] || - || 868MHz || 2-FSK || 9.600 bit/s oder 40 Kbit/s || {{Link2CmdRef|Anker=ZWDongle|Label=ZWDongle}} || {{Link2CmdRef|Anker=ZWave|Label=ZWave}} || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [[WMBUS]] || WMBus_T, WMBus_S || 868MHz || ?? || 100 kbit/s / 32.768 kbit/s || CU* || {{Link2CmdRef|Anker=WMBUS|Label=WMBUS}} || Wasseruhren, Wärmezähler, Elektrozähler || - &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; | &#039;&#039;Tabelle muss noch vervollständigt werden&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | &#039;&#039;&#039;Legende:&#039;&#039;&#039; &lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; | CU* = CUL, CUN, CUNO / &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Übersicht über drahtgebundene Systeme&lt;br /&gt;
|-&lt;br /&gt;
! Name !!  class=&amp;quot;unsortable&amp;quot; | Interfaces (Hardware) !! class=&amp;quot;unsortable&amp;quot; | Modul !! class=&amp;quot;unsortable&amp;quot; | Geräte (Beispiel) !! class=&amp;quot;unsortable&amp;quot; | Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [[1-Wire]]  || [[Interfaces für 1-Wire|diverse]] || {{Link2CmdRef|Anker=OWX|Label=OWX}} || [[:Kategorie:1-Wire|1-Wire]] || -&lt;br /&gt;
|-&lt;br /&gt;
| [[EIB_/_KNX|EIB/KNX]]  || {{Link2CmdRef|Anker=TUL|Label=TUL}} || {{Link2CmdRef|Anker=EIB|Label=EIB}} || [[:Kategorie:EIB/KNX|EIB/KNX]] || -&lt;br /&gt;
|-&lt;br /&gt;
| Firmata || RS-232, USB, Ethernet || {{Link2CmdRef|Anker=FRM|Label=FRM}} || Arduino || -&lt;br /&gt;
|-&lt;br /&gt;
| [[HomeMatic Wired]]  || [[HomeMatic Wired RS485 LAN Gateway|HM485 LAN Gateway]] || {{Link2CmdRef|Anker=HM485_LAN|Label=HM485_LAN}} || [[:Kategorie:HomeMatic Components|Präfix HMW]] || -&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | &#039;&#039;Tabelle muss noch vervollständigt werden&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | &#039;&#039;&#039;Legende:&#039;&#039;&#039; &lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Komponenten ==&lt;br /&gt;
Der eigentliche Zweck eines Hausautomatisierungs-Projekts sind dann letztendlich die &#039;&#039;&#039;Geräte&#039;&#039;&#039; (Komponenten / Aktoren / [[:Kategorie:Schalter (Empfänger)|Empfänger]]), die automatisch gesteuert werden sollen, bzw. auch Auslöser für Aktionen ([[:Kategorie:Schalter (Sender)|Sender]]) und Lieferant von Datenmaterial ([[:Kategorie:Hardware Typen|Sensoren]]) sind.&lt;br /&gt;
&lt;br /&gt;
Diese Geräte sind, sofern es eine detaillierte Beschreibung dazu gibt, in den jeweiligen Unterseiten der [[:Kategorie:Hardware|Hardwareliste]] aufgeführt.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.enocean.com/de/home/ EnOcean] Homepage&lt;br /&gt;
* [http://www.elv.de ELV], (Haupt-)Lieferant von FS20, FHT, HomeMatic, MAX!&lt;br /&gt;
* [https://github.com/firmata/protocol Firmata] Protokoll&lt;br /&gt;
* [http://www.panstamp.com panStamp], panStamp Hersteller&lt;br /&gt;
* [http://jeelabs.com/products/jeelink Jeelabs], JeeLink Hersteller&lt;br /&gt;
* [http://www.zigbee.org/ Zigbee] Homepage&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM]]&lt;br /&gt;
[[Kategorie:FHEM-Verwendung]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=CUL&amp;diff=20773</id>
		<title>CUL</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=CUL&amp;diff=20773"/>
		<updated>2017-03-18T18:22:19Z</updated>

		<summary type="html">&lt;p&gt;Moontear: /* Hinweise zum Betrieb mit FHEM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;CUL&#039;&#039;&#039; (&#039;&#039;&#039;C&#039;&#039;&#039;C1101 &#039;&#039;&#039;U&#039;&#039;&#039;SB &#039;&#039;&#039;L&#039;&#039;&#039;ite) ist ein RF-Gerät im Formfaktor eines USB-Dongles mit externer [[CUL Ausstattung|Antenne]]. Die über das ISM/SRD Band empfangenen Daten werden durch einen Onboard 8&amp;amp;nbsp;bit Atmel Prozessor vorverarbeitet. Mit verfügbarer quelloffener [[#FW|Firmware]] kann das CUL verschiedene 868MHz [[CUL HomeMatic und FS20|Protokolle]] empfangen und senden, insbesondere die FS20/FHT/S300/EM/HMS sowie durch kurzfristiges Umschaltung auf 433&amp;amp;nbsp;MHz Intertechno (z.&amp;amp;nbsp;B. viele Baumarkt Funksteckdosen) Protokolle. &lt;br /&gt;
&lt;br /&gt;
Im Umfeld von FS20/FHT/EM/S300/HMS (&amp;quot;[[Rfmode|rfmode]] - [[SlowRF]]&amp;quot;) wird die Dekodierung der per AM in 1&amp;amp;nbsp;kHz übertragenen Signale per [[#FW|culfw]] auf dem Atmel Prozessor direkt erledigt und dann per USB an den Hostrechner weitergegeben.&lt;br /&gt;
&lt;br /&gt;
Das CUL kann mittels des CULModuls von FHEM angesprochen und somit wie eine FHZ1X00PC verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Das CUL kann auch im HM-Mode als HomeMatic Zentrale alternativ zur CCU oder dem [[HMLAN Konfigurator]] betrieben werden. Bei CULs älter als Version&amp;amp;#160;3 ist jedoch der Speicher zu klein, um die Software für FS20/FHT/S300/EM/HMS und HomeMatic zugleich im Speicher zu halten, hier muss man sich beim [[CUL an einer Fritzbox 7390 flashen|Flashen]] der Firmware für eine Protokollfamilie entscheiden. Mit zwei CULs ist aber auch der Mischbetrieb an einem FHEM Hostrechner möglich.&lt;br /&gt;
&lt;br /&gt;
Ebenso gibt es ein Modul zur Ansteuerung der [[MAX]]! Heizungsteuerung. Auch hier ist ein Mischbetrieb (MAX! und z.&amp;amp;nbsp;B. FS20 gleichzeitig über ein CUL) obwohl technisch nicht unmöglich {{Link2Forum|Topic=10510|LinkText=nicht angeraten}}.&lt;br /&gt;
&lt;br /&gt;
Ferner ist der Einsatz eines CUL als [[RFR CUL]] für den &#039;&#039;SlowRF&#039;&#039; Mode (jedoch nicht für den &#039;&#039;HomeMatic&#039;&#039; Mode) möglich, um die Reichweite zu erhöhen. Die Verbindung erfolgt hierbei über Funk, sodass keine USB Verbindung zum FHEM Hostrechner erforderlich ist.&lt;br /&gt;
&lt;br /&gt;
Alle diese Modi sind in der Original-[[#FW|culfw]] enthalten und werden z.B. durch die Wahl des &#039;&#039;rfmode&#039;&#039; eingestellt.&lt;br /&gt;
&lt;br /&gt;
Obwohl die eigentliche Betriebsfrequenz der FHT und FS20-Komponenten 868,35 MHz ist, ist bei den aktuellen CUL Firmwareversionen zum Betrieb mit FHEM die Frequenz auf 868,30 MHz eingestellt. Dies hat sich als Kompromiss zum besseren Empfang von EM1000EM (Energiemonitor) Geräten bewährt, &#039;&#039;&#039;obwohl&#039;&#039;&#039; diese nominal mit 868,360 MHz arbeiten. Praktisch ist die Genauigkeit der Sendefrequenz der meisten &#039;&#039;SlowRF&#039;&#039; Geräte wegen der primitiven Sender sehr schlecht und kann deutlich von der nominalen Frequenz abweichen.&lt;br /&gt;
&lt;br /&gt;
Frequenz und Bandbreite können daher im &#039;&#039;SlowRF&#039;&#039; Mode frei angepasst und somit für die örtlichen Empfangsgegebenheiten optimiert werden.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Nachfolgende Beispiele sind so wie dargestellt in die FHEM-Eingabezeile oder per Telnet auf FHEM zu übertragen und per &amp;lt;Taste&amp;gt;Enter&amp;lt;/Taste&amp;gt; abzuschicken (nicht &amp;quot;save&amp;quot; klicken); &#039;&#039;&#039;&#039;&#039;myCUL&#039;&#039;&#039;&#039;&#039; ist dabei nur ein Platzhalter und durch den Namen &#039;&#039;&#039;Ihres&#039;&#039;&#039; CUL zu ersetzen. Da diese Funktionen durch die culfw (Firmware) bereitgestellt werden, funktionieren sie auf allen Geräten, die die culfw verwenden ([[CUNO]], [[COC]], CSM:&lt;br /&gt;
&lt;br /&gt;
* Ist Empfang eingeschaltet ?&lt;br /&gt;
*: &amp;lt;code&amp;gt; get myCUL raw C35&amp;lt;/code&amp;gt; (13 = ja, z.&amp;amp;nbsp;b.: C35 = 0D / 13)&lt;br /&gt;
* Auslesen der culfw Version:&lt;br /&gt;
*: &amp;lt;code&amp;gt;get myCUL raw V&amp;lt;/code&amp;gt;&lt;br /&gt;
* LED ausschalten (Achtung: Buchstabe l (L) vorweg für LED, keine Zahl 1)&lt;br /&gt;
*: &amp;lt;code&amp;gt;set myCUL raw l00&amp;lt;/code&amp;gt;&lt;br /&gt;
* LED einschalten&lt;br /&gt;
*: &amp;lt;code&amp;gt;set myCUL raw l01&amp;lt;/code&amp;gt; Blinkt bei Senden oder Empfangen von Paketen&lt;br /&gt;
* LED soll blinken (einmal in der Sekunde)&lt;br /&gt;
*: &amp;lt;code&amp;gt;set myCUL raw l02&amp;lt;/code&amp;gt;&lt;br /&gt;
* Reboot / Reset des CUL:&lt;br /&gt;
*: &amp;lt;code&amp;gt;set myCUL raw B00. &amp;lt;/code&amp;gt; Andere Werte als 00 starten das CUL im Bootloader-Modus (=&amp;amp;gt; neue Firmware)&lt;br /&gt;
* Freie CUL Sendezeit ([[1% Regel]]):&lt;br /&gt;
*: &amp;lt;code&amp;gt;get myCUL raw X&amp;lt;/code&amp;gt; 2. Wert ist Sendezeit in 10ms Slots, ein FS20 Befehl braucht ca. 210ms (also 21 Slots), eine FHT Kommunikation wesentlich mehr. Alternativ auch &amp;lt;code&amp;gt;get myCUL credit10ms&amp;lt;/code&amp;gt; ergibt Sendezeit in 10ms Slots&lt;br /&gt;
* Freie Kapazität des FHT Buffers&lt;br /&gt;
*: &amp;lt;code&amp;gt; get myCUL raw T03&amp;lt;/code&amp;gt; Ergebniss bytes in HEX. Leer = 4a&lt;br /&gt;
* Inhalt des FHT Buffers&lt;br /&gt;
*: &amp;lt;code&amp;gt; get myCUL raw T02&amp;lt;/code&amp;gt; (CUL V2 Buffer ist 74 Bytes gross, Platz für 14 bis 31 FHT Messages). Rückgabe n/a = Buffer ist leer&lt;br /&gt;
* Eingestellte [[Was_ist_der_Hauscode%3F|FHT-ID]]&lt;br /&gt;
*: &amp;lt;code&amp;gt; get myCUL raw T01&amp;lt;/code&amp;gt; &lt;br /&gt;
* Eingestellte Frequenz, Bandbreite etc. Ausgeben&lt;br /&gt;
*: &amp;lt;code&amp;gt; get myCUL ccconf&amp;lt;/code&amp;gt;. &amp;lt;br&amp;gt;Rückgabe z.&amp;amp;nbsp;B.: &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;myCUL ccconf =&amp;amp;gt; freq:868.300MHz bWidth:325kHz rAmpl:42dB sens:4dB&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* eingestelle Bandbreite erhöhen (z.b. auf 464 kHz, mehr hat meist keinen Sinn):&lt;br /&gt;
*:&amp;lt;code&amp;gt;set myCUL bWidth 464&amp;lt;/code&amp;gt;&lt;br /&gt;
* Einstellen der Sendestärke:&lt;br /&gt;
*: &amp;lt;code&amp;gt;set myCUL raw x09&amp;lt;/code&amp;gt; Einstellen der Sendeleistung.&lt;br /&gt;
&lt;br /&gt;
Gültige Werte für die Sendeleistung sind 00-09. Verwendet werden sollten nur die Werte 05-09, diese entsprechen&lt;br /&gt;
-10/-5/0/5/10 Sendeleistung in db. Default ist x08 = +5db. Bitte im Interesse von Nachbarn und der Abhörsicherheit den kleinsten problemlos funktionierenden Wert einstellen. Dies ist meistens x07 oder x08. Da speziell die Kommunikation mit den FHTs bidirektional ist, kann die Kommunikation durch höhere Werte oft nicht verbessert werden, da die FHTs selber dadurch nicht stärker senden. Besser versuchen, Lage und Antennenausrichtung des CUL zu verändern. Siehe auch Diskussion unter [https://groups.google.com/group/cul-fans/browse_thread/thread/683ca5c892eae1c3/c682a640f1ba863c?lnk=gst&amp;amp;amp;q=bWidth+freq#c682a640f1ba863c GoogleGroups-CUL-Fans]&lt;br /&gt;
&lt;br /&gt;
Werte x00-x04 sind &#039;&#039;&#039;mit&#039;&#039;&#039; Ramping und führen zum Verlust der Kommunikationsfähigkeit mit anderen CULs, z.&amp;amp;nbsp;B. [[RFR CUL]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Beim CUL im HomeMatic-Modus kann man (ohne Firmware-Modifikation) die Empfangs-/Sendeparameter &#039;&#039;&#039;nicht&#039;&#039;&#039; verstellen. Die üblichen freq/x09 etc. haben hier keine Wirkung ({{Link2Forum|Topic=10203|Message=57191|LinkText=Quelle}}).&lt;br /&gt;
&lt;br /&gt;
Weiterhin kann man zunehmend mehr Debuggingoutput auf dem CUL einschalten mit&amp;amp;#160;:&lt;br /&gt;
* &amp;lt;code&amp;gt; set CUL1 raw X61&amp;lt;/code&amp;gt; Communication wird im Detail angezeigt&lt;br /&gt;
* &amp;lt;code&amp;gt;set CUL1 raw X25&amp;lt;/code&amp;gt; auch checksum Fehler / unerkannte Protokolle werden gemeldet&lt;br /&gt;
* &amp;lt;code&amp;gt;set CUL1 raw X2F&amp;lt;/code&amp;gt; alle empfangenen Flanken werden gemeldet&lt;br /&gt;
* &amp;lt;code&amp;gt;set CUL1 raw X80&amp;lt;/code&amp;gt; RSSI / Signalstaerke jeder Flanke wird gemeldet&lt;br /&gt;
* &amp;lt;code&amp;gt;set CUL1 raw X21&amp;lt;/code&amp;gt; normal Modus&lt;br /&gt;
&lt;br /&gt;
Achtung: Auf Gross- und Kleinschreibung des &amp;quot;x,X&amp;quot; achten!&lt;br /&gt;
&lt;br /&gt;
Die kompletten Kommandos mit Erklärung für CUL sind in der [http://culfw.de/commandref.html commandref] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Versionen ==&lt;br /&gt;
Das CUL gibt es in mehreren Versionen, die sich überwiegend in Prozessor und Speicherkonfiguration unterscheiden.&lt;br /&gt;
&lt;br /&gt;
* CUL V1 - AT90USB162 Prozessor, 0,5Kb RAM, 16Kb Flashmemory, 0,5 kByte EEPROM. Einsatzfähigkeit unbekannt (aber vermutlich wie V2). Wird nicht mehr hergestellt.&lt;br /&gt;
* CUL V2 - AT90USB162 Prozessor, 0,5Kb RAM, 16Kb Flashmemory, 0,5 kByte EEPROM. Einsatzfähig. Der Flashspeicher ist jedoch zu klein für eine culfw (CUL Firmware), die Code für &#039;&#039;SlowRF&#039;&#039; Geräte und zugleich &#039;&#039;HomeMatic&#039;&#039; Geräte enthält. Es muss also vor dem Flashen der Firmware zwischen zwei jeweils reduzierten Versionen gewählt werden. Da ein CUL ohnehin nicht beide Sendemodi &#039;&#039;&#039;zeitgleich&#039;&#039;&#039; betreiben kann, ist dies keine wirkliche Einschränkung. Wird nicht mehr hergestellt.&lt;br /&gt;
* CUL V3 - ATMega32U4 Prozessor, 2,5 kB RAM, 32 kB Flashmemory, 1 kByte EEPROM). Voll einsatzfähig.&lt;br /&gt;
* CUL V4 - ATMega32U2 Prozessor, 1 kB RAM 32 kB Flashmemory, 1 kByte EEPROM. Voll einsatzfähig. Genau genommen ein &amp;quot;Sparmodell&amp;quot; des V3, um Lieferengpässe des atmega32u4 Prozessors zu umgehen. Der reduzierte RAM-Speicher verursacht (zumindest gegenwärtig) beim Betrieb mit culfw und FHEM keine Einschränkungen oder Nachteile. Achtung: Flashen des CULv4 setzt DFU-Programmer 0.5.4 oder höher voraus.&lt;br /&gt;
&lt;br /&gt;
Die für die aktuellen Modelle lieferbare Abschirmung ist in der Regel nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
== Firmware {{Anker|FW}} ==&lt;br /&gt;
Die für den CUL und verwandte Hardware wie [[CUN]] und CUR im Zusammenhang mit FHEM überwiegend eingesetzte Firmware findet sich auf der&lt;br /&gt;
* [http://culfw.de CUL Firmware Homepage]&lt;br /&gt;
Dort kann die jeweils aktuelle Version nachgesehen und herunter geladen werden.&lt;br /&gt;
Alten Stände, Version für Entwickler und ganz aktuelle Änderungen findet man auf der&lt;br /&gt;
* [https://sourceforge.net/projects/culfw/ Sourceforge Projektseite der culfw]&lt;br /&gt;
Hier kann man sich z.B. mit&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
svn co svn://svn.code.sf.net/p/culfw/code/trunk/culfw&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
die aktuelle Version laden.&lt;br /&gt;
Zusätzlich gibt es eine für InterTechno angepasste Version:&lt;br /&gt;
* [https://github.com/heliflieger/a-culfw Alternative culfw for cul devices] auf GitHub und im {{Link2Forum|Topic=35064|LinkText=Forum}}&lt;br /&gt;
Hier könnte es aber zu Funktionseinschränkungen bei anderen Protokollen kommen.&lt;br /&gt;
In dieser Version ist auch ein Portierung auf ARM-Prozessoren enthalten (siehe {{Link2Forum|Topic=38404|LinkText=Forum}}) mit der die CUL-Firmware auch auf dem HM-CFG-USB-2 und dem [[MAX]] Cube betrieben werden kann.&lt;br /&gt;
&lt;br /&gt;
Generell ist das Angebot an Speicherplatz auf dem im CUL verwendeten ATMega32U2 sehr eingeschränkt, wodurch Erweiterungen ohne Abstriche an anderer Stelle kaum mehr möglich sind. Es wird also die optimale CUL-Firmware für alle Zwecke nie geben, so dass man die Auswahl am konkreten Bedarf klären muss. Wer die Firmware selbst compiliert kann gezielt Funktionen die nicht benötigt werden weg lassen und dafür ggf. Funktionen die sonst nicht eingefügt sind hinzufügen.&lt;br /&gt;
&lt;br /&gt;
== Sendefrequenz ==&lt;br /&gt;
Das CUL gibt es in Ausführungen für 868 und 433 MHz. &lt;br /&gt;
Die Sende- und Empfangsfrequenz des CUL sind in weiten Bereichen einstellbar, im &#039;&#039;SlowRF&#039;&#039; Mode auch durch direkte Befehle aus FHEM (im &#039;&#039;HomeMatic&#039;&#039; Mode derzeit nicht unterstützt). Der wesentliche Unterschied der 868 und 433 MHz CULs ist ein auf die Frequenz richtig abgestimmter HF-Eingangskreis inklusive Antennenlänge.&lt;br /&gt;
&lt;br /&gt;
Es ist es durchaus möglich, ein 868 MHz CUL auf 433 MHz einzustellen. Da dann aber die HF-Eingangskreis-Abstimmung und Antennenlänge nicht korrekt sind, ist Empfangs- und Sendeleistung suboptimal, die Reichweite sinkt. Dennoch wird diese Möglichkeit des freien Einstellens durch das FHEM Intertechnomodul genutzt, da Intertechnokomponenten mit 433 MHz arbeiten. Dazu wird beim Senden eines Intertechno-Befehls die Frequenz eines 868 MHz CULs kurz umgestellt.&lt;br /&gt;
&lt;br /&gt;
== Antenne ==&lt;br /&gt;
Der CUL ist mit RP-SMA-Stecker für die Antenne aber auch mit angelöteter Drahtantenne lieferbar.&lt;br /&gt;
Funktional besteht kein Unterschied: auch die &amp;quot;richtige&amp;quot; Antenne ist (in diesem Fall) nur ein Draht, jedoch  gummiummantelt und eventuell mit einem Knickgelenk und einem Schraubanschluss versehen, d.h. die Drahtantenne sieht nur unschön aus.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist nur die Länge. Diese muss vorteilhafterweise so groß sein wie ein Viertel der Wellenlänge der Frequenz (&amp;quot;Lambda/4&amp;quot;). Die sind bei 868 Mhz ca. 8,6 Zentimeter. Antennenlängen die länger oder kürzer sind verschlechtern in der Regel die Leistung. Daher ist eine z.B. 10 Zentimeter lange Antenne (obwohl länger) schlechter als 1/4 Lambda mit 8,6 Zentimeter.&lt;br /&gt;
&lt;br /&gt;
Über besondere Antennenkonstruktionen  (bitte nach Colinear, Jpole, Yagi suchen) oder Antennen die &amp;quot;Lambda/2&amp;quot; oder gar (&amp;quot;Lambda&amp;quot;) lang sind  (also ca. 17,2  bzw. 34,5 Zentimeter) kann ein höher Gewinn erreicht werden. Einher geht aber gleichzeitig eine stärkere Richtwirkung der Antenne. Je kürzer die Antenne, desto kugelförmiger die Abstrahlung. Bei längeren Antennen wird die Abstrahlung mehr und mehr zylinderähnlich, also mit horizontaler Richtwirkung (und in die Richtung ist das Signal dann stärker, daher der Antennen&amp;quot;gewinn&amp;quot;).&lt;br /&gt;
Das hat auch Nachteile, speziell wenn man auch &amp;quot;nach oben&amp;quot; funken will. Speziell wenn man Antennen länger als eine λ/4 Antenne (8,6 Zentimeter) in einem mehretagigen Haus verwenden will, muss man diese daher in der Regel waagerecht/horizontal ausrichten, da alles was in Richtung der Spitze (und dem Fuss) der Antenne liegt schlecht Empfangen wird.&lt;br /&gt;
&lt;br /&gt;
Daher: Je mehr Gewinn die Antenne aufweist, desto besser ist die Sende und Empfangsleistung, aber desto mehr Gedanken muss man sich um die Ausrichtung der Antenne machen, um alle Geräte zu empfangen / zu erreichen. &amp;quot;Mehr db&amp;quot; und speziell &amp;quot;länger&amp;quot; ist also nicht automatisch besser. &lt;br /&gt;
&lt;br /&gt;
Zu beachten, ist auch, dass die Sendeleistung der Module gesetzlich geregelt ist und Spezialantennen mit höherem Gewinn ggf. nur an Empfängern erlaubt sind.&lt;br /&gt;
&lt;br /&gt;
Falls man den CUL mit RP-SMA Stecker geordert hat, aber keine passend lange RP-SMA-Antenne verfügbar ist, kann (nur für erste Tests) auch eine abschraubbare Antenne für 802.11b/g WLAN-Geräte (2,4&amp;amp;nbsp;GHz) benutzt werden, so diese anschlusstechnisch auf den RP-SMA-Stecker des CUL passt (dies funktioniert zumindest mit FS20- und EM-Geräten). Deren Länge ist wie oben diskutiert aber nicht optimal, besser ist auf jeden Fall eine speziell auf den Einsatzzweck (Frequenz) abgestimmte Antenne.&lt;br /&gt;
&lt;br /&gt;
== Antennenlänge ==&lt;br /&gt;
Die genauen Antennenlängen sind praktisch schwer zu ermitteln, da auch Zuleitung auf dem CUL zugerechnet werden müssten und ggf Dämpfungen (also z.b. Durchführung der Antenne durch eine Gehäuse, oder gebogene Antennen) die Antennenlänge weiter beeinflussen. Gleichzeitig haben schon Abweichungen von wenigen Millimetern messbaren Einfluss. Die Antennenlänge ist daher immer nur eine Kompromiss.&lt;br /&gt;
&lt;br /&gt;
Exact berechnet ohne Störeinflüsse wären folgende Antennelängen nutzbar:&lt;br /&gt;
 868,35 Mhz (z.B. HM, FS20, FHT …)&lt;br /&gt;
 1/4 Lambda = 8,63 Zentimeter &lt;br /&gt;
 1/2 Lambda = 17,26 Zentimeter &lt;br /&gt;
 1 Lambda = 34,52 Zentimeter  (Bereits sehr hohe Richtwirkung)&lt;br /&gt;
&lt;br /&gt;
433,92 Mhz  (z.B. Intertechno …)&lt;br /&gt;
 1/4 Lambda = 17,27 Zentimeter &lt;br /&gt;
 1/2 Lambda = 34,54 Zentimeter &lt;br /&gt;
&lt;br /&gt;
Folgende Antennenlängen bieten sich praktisch an, diese sind immer etwas kürzer als die optimale Länge, dies wird z.T. durch Leiterlänge im CUL kompensiert.:&lt;br /&gt;
&lt;br /&gt;
 8,6 Zentimeter als 1/4 Lambda für 868,35 Mhz&lt;br /&gt;
 17,2 Zentimeter als 1/2 Lambda für 868,35 Mhz und zugleich 1/4 Lambda für 433,92 Mhz&lt;br /&gt;
 34,5 Zentimeter als Lambda für 868,35 Mhz und zugleich 1/2 Lambda für 433,92 Mhz&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Im Gegensatz zu den original FHZ Zentralen ist das CUL recht flankensteil, d.h. die Sende- und Empfangsfrequenz wird genauer eingehalten als z.&amp;amp;nbsp;B. bei einer FHZ1x00PC. Dies kann im Zusammenhang mit den eher ungenauen Sendern z.&amp;amp;nbsp;B. der FHT Raumregler zu Empfangsproblemen führen. Es kann daher mitunter sinnvoll sein, die Sende- und Empfangsbandbreite des CUL etwas zu erhöhen. Dies senkt jedoch gleichzeitig die Empfindlichkeit.&lt;br /&gt;
&lt;br /&gt;
Bei Empfangsproblemen von z.&amp;amp;nbsp;B. HEM-Sensoren oder dem S300TH kann man folgendes testen:&lt;br /&gt;
&lt;br /&gt;
* Man kann die Frequenz des CUL auf genau 868,35 MHz einstellen. Standardmäßig ist hier aus Kompatibilitätsgründen 868,30 MHz eingestellt. Diese Einstellung wird fest im NVRAM gespeichert und braucht nur einmal vorgenommen zu werden.&lt;br /&gt;
*: &amp;lt;code&amp;gt;set CUL freq 868.350&amp;lt;/code&amp;gt;&lt;br /&gt;
* Es ist möglich die &amp;quot;decision boundary&amp;quot; zu vergrößern, frei beschrieben: die &amp;quot;Entscheidungsgrenze&amp;quot; ob die empfangene Signalflanke digital &amp;quot;0&amp;quot; oder &amp;quot;1&amp;quot; darstellte ({{Link2Forum|Topic=8572|Message=44388|LinkText=siehe Diskussion hier}}). Möglich sind die Werte &amp;quot;4&amp;quot;, &amp;quot;8&amp;quot; und &amp;quot;16&amp;quot;. Default-Einstellung ist hier &amp;quot;4&amp;quot;. Zur Steigerung der Empfangsqualität soll es hilfreich sein, hier &amp;quot;8&amp;quot; einzustellen. Mitunter bringt jedoch erst die Einstellung auf &amp;quot;16&amp;quot; signifikante Verbesserungen beim Empfang von S300TH-Sensoren.&lt;br /&gt;
*: &amp;lt;code&amp;gt;set CUL sens 8&amp;lt;/code&amp;gt;&lt;br /&gt;
* Oft hilft auch, die Bandbreite auf z.&amp;amp;nbsp;B. 464 kHz aufzuweiten.&lt;br /&gt;
*: &amp;lt;code&amp;gt;set CUL bWidth 464&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Selbstbau-/Bastelprojekte ==&lt;br /&gt;
Innerhalb der FHEM-Community werden mittlerweile diverse Bastelprojekte zum Selbstbau eines CUL betrieben. Eine Auswahl dieser Projekte:&lt;br /&gt;
* [[Selbstbau CUL]]&lt;br /&gt;
* [[FHEMduino]]&lt;br /&gt;
* [[SIGNALduino]]&lt;br /&gt;
* [[MapleCUN]] mit STM32 Mikrocontroller&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Hersteller / Bezugsquelle für CUL: [http://www.busware.de/tiki-index.php?page=CUL busware.de]&lt;br /&gt;
* Google groups [https://groups.google.com/group/cul-fans/ CUL fans], mittlerweile durch das Board {{Link2Forum|Area=cul-fans}} im [http://forum.fhem.de/index.php FHEM Forum] ergänzt/ersetzt&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:CUL]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=CUL&amp;diff=20772</id>
		<title>CUL</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=CUL&amp;diff=20772"/>
		<updated>2017-03-18T18:22:04Z</updated>

		<summary type="html">&lt;p&gt;Moontear: /* Hinweise zum Betrieb mit FHEM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;CUL&#039;&#039;&#039; (&#039;&#039;&#039;C&#039;&#039;&#039;C1101 &#039;&#039;&#039;U&#039;&#039;&#039;SB &#039;&#039;&#039;L&#039;&#039;&#039;ite) ist ein RF-Gerät im Formfaktor eines USB-Dongles mit externer [[CUL Ausstattung|Antenne]]. Die über das ISM/SRD Band empfangenen Daten werden durch einen Onboard 8&amp;amp;nbsp;bit Atmel Prozessor vorverarbeitet. Mit verfügbarer quelloffener [[#FW|Firmware]] kann das CUL verschiedene 868MHz [[CUL HomeMatic und FS20|Protokolle]] empfangen und senden, insbesondere die FS20/FHT/S300/EM/HMS sowie durch kurzfristiges Umschaltung auf 433&amp;amp;nbsp;MHz Intertechno (z.&amp;amp;nbsp;B. viele Baumarkt Funksteckdosen) Protokolle. &lt;br /&gt;
&lt;br /&gt;
Im Umfeld von FS20/FHT/EM/S300/HMS (&amp;quot;[[Rfmode|rfmode]] - [[SlowRF]]&amp;quot;) wird die Dekodierung der per AM in 1&amp;amp;nbsp;kHz übertragenen Signale per [[#FW|culfw]] auf dem Atmel Prozessor direkt erledigt und dann per USB an den Hostrechner weitergegeben.&lt;br /&gt;
&lt;br /&gt;
Das CUL kann mittels des CULModuls von FHEM angesprochen und somit wie eine FHZ1X00PC verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Das CUL kann auch im HM-Mode als HomeMatic Zentrale alternativ zur CCU oder dem [[HMLAN Konfigurator]] betrieben werden. Bei CULs älter als Version&amp;amp;#160;3 ist jedoch der Speicher zu klein, um die Software für FS20/FHT/S300/EM/HMS und HomeMatic zugleich im Speicher zu halten, hier muss man sich beim [[CUL an einer Fritzbox 7390 flashen|Flashen]] der Firmware für eine Protokollfamilie entscheiden. Mit zwei CULs ist aber auch der Mischbetrieb an einem FHEM Hostrechner möglich.&lt;br /&gt;
&lt;br /&gt;
Ebenso gibt es ein Modul zur Ansteuerung der [[MAX]]! Heizungsteuerung. Auch hier ist ein Mischbetrieb (MAX! und z.&amp;amp;nbsp;B. FS20 gleichzeitig über ein CUL) obwohl technisch nicht unmöglich {{Link2Forum|Topic=10510|LinkText=nicht angeraten}}.&lt;br /&gt;
&lt;br /&gt;
Ferner ist der Einsatz eines CUL als [[RFR CUL]] für den &#039;&#039;SlowRF&#039;&#039; Mode (jedoch nicht für den &#039;&#039;HomeMatic&#039;&#039; Mode) möglich, um die Reichweite zu erhöhen. Die Verbindung erfolgt hierbei über Funk, sodass keine USB Verbindung zum FHEM Hostrechner erforderlich ist.&lt;br /&gt;
&lt;br /&gt;
Alle diese Modi sind in der Original-[[#FW|culfw]] enthalten und werden z.B. durch die Wahl des &#039;&#039;rfmode&#039;&#039; eingestellt.&lt;br /&gt;
&lt;br /&gt;
Obwohl die eigentliche Betriebsfrequenz der FHT und FS20-Komponenten 868,35 MHz ist, ist bei den aktuellen CUL Firmwareversionen zum Betrieb mit FHEM die Frequenz auf 868,30 MHz eingestellt. Dies hat sich als Kompromiss zum besseren Empfang von EM1000EM (Energiemonitor) Geräten bewährt, &#039;&#039;&#039;obwohl&#039;&#039;&#039; diese nominal mit 868,360 MHz arbeiten. Praktisch ist die Genauigkeit der Sendefrequenz der meisten &#039;&#039;SlowRF&#039;&#039; Geräte wegen der primitiven Sender sehr schlecht und kann deutlich von der nominalen Frequenz abweichen.&lt;br /&gt;
&lt;br /&gt;
Frequenz und Bandbreite können daher im &#039;&#039;SlowRF&#039;&#039; Mode frei angepasst und somit für die örtlichen Empfangsgegebenheiten optimiert werden.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Nachfolgende Beispiele sind so wie dargestellt in die FHEM-Eingabezeile oder per Telnet auf FHEM zu übertragen und per &amp;lt;Taste&amp;gt;Enter&amp;lt;/Taste&amp;gt; abzuschicken (nicht &amp;quot;save&amp;quot; klicken); &#039;&#039;&#039;&#039;&#039;myCUL&#039;&#039;&#039;&#039;&#039; ist dabei nur ein Platzhalter und durch den Namen &#039;&#039;&#039;Ihres&#039;&#039;&#039; CUL zu ersetzen. Da diese Funktionen durch die culfw (Firmware) bereitgestellt werden, funktionieren sie auf allen Geräten, die die culfw verwenden ([[CUNO]], [[COC]], CSM:&lt;br /&gt;
&lt;br /&gt;
* Ist Empfang eingeschaltet ?&lt;br /&gt;
*: &amp;lt;code&amp;gt; get myCUL raw C35&amp;lt;/code&amp;gt; (13 = ja, z.&amp;amp;nbsp;b.: C35 = 0D / 13)&lt;br /&gt;
* Auslesen der culfw Version:&lt;br /&gt;
*: &amp;lt;code&amp;gt;get myCUL raw V&amp;lt;/code&amp;gt;&lt;br /&gt;
* LED ausschalten (Achtung: Buchstabe l vorweg für LED, keine Zahl 1)&lt;br /&gt;
*: &amp;lt;code&amp;gt;set myCUL raw l00&amp;lt;/code&amp;gt;&lt;br /&gt;
* LED einschalten&lt;br /&gt;
*: &amp;lt;code&amp;gt;set myCUL raw l01&amp;lt;/code&amp;gt; Blinkt bei Senden oder Empfangen von Paketen&lt;br /&gt;
* LED soll blinken (einmal in der Sekunde)&lt;br /&gt;
*: &amp;lt;code&amp;gt;set myCUL raw l02&amp;lt;/code&amp;gt;&lt;br /&gt;
* Reboot / Reset des CUL:&lt;br /&gt;
*: &amp;lt;code&amp;gt;set myCUL raw B00. &amp;lt;/code&amp;gt; Andere Werte als 00 starten das CUL im Bootloader-Modus (=&amp;amp;gt; neue Firmware)&lt;br /&gt;
* Freie CUL Sendezeit ([[1% Regel]]):&lt;br /&gt;
*: &amp;lt;code&amp;gt;get myCUL raw X&amp;lt;/code&amp;gt; 2. Wert ist Sendezeit in 10ms Slots, ein FS20 Befehl braucht ca. 210ms (also 21 Slots), eine FHT Kommunikation wesentlich mehr. Alternativ auch &amp;lt;code&amp;gt;get myCUL credit10ms&amp;lt;/code&amp;gt; ergibt Sendezeit in 10ms Slots&lt;br /&gt;
* Freie Kapazität des FHT Buffers&lt;br /&gt;
*: &amp;lt;code&amp;gt; get myCUL raw T03&amp;lt;/code&amp;gt; Ergebniss bytes in HEX. Leer = 4a&lt;br /&gt;
* Inhalt des FHT Buffers&lt;br /&gt;
*: &amp;lt;code&amp;gt; get myCUL raw T02&amp;lt;/code&amp;gt; (CUL V2 Buffer ist 74 Bytes gross, Platz für 14 bis 31 FHT Messages). Rückgabe n/a = Buffer ist leer&lt;br /&gt;
* Eingestellte [[Was_ist_der_Hauscode%3F|FHT-ID]]&lt;br /&gt;
*: &amp;lt;code&amp;gt; get myCUL raw T01&amp;lt;/code&amp;gt; &lt;br /&gt;
* Eingestellte Frequenz, Bandbreite etc. Ausgeben&lt;br /&gt;
*: &amp;lt;code&amp;gt; get myCUL ccconf&amp;lt;/code&amp;gt;. &amp;lt;br&amp;gt;Rückgabe z.&amp;amp;nbsp;B.: &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;myCUL ccconf =&amp;amp;gt; freq:868.300MHz bWidth:325kHz rAmpl:42dB sens:4dB&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* eingestelle Bandbreite erhöhen (z.b. auf 464 kHz, mehr hat meist keinen Sinn):&lt;br /&gt;
*:&amp;lt;code&amp;gt;set myCUL bWidth 464&amp;lt;/code&amp;gt;&lt;br /&gt;
* Einstellen der Sendestärke:&lt;br /&gt;
*: &amp;lt;code&amp;gt;set myCUL raw x09&amp;lt;/code&amp;gt; Einstellen der Sendeleistung.&lt;br /&gt;
&lt;br /&gt;
Gültige Werte für die Sendeleistung sind 00-09. Verwendet werden sollten nur die Werte 05-09, diese entsprechen&lt;br /&gt;
-10/-5/0/5/10 Sendeleistung in db. Default ist x08 = +5db. Bitte im Interesse von Nachbarn und der Abhörsicherheit den kleinsten problemlos funktionierenden Wert einstellen. Dies ist meistens x07 oder x08. Da speziell die Kommunikation mit den FHTs bidirektional ist, kann die Kommunikation durch höhere Werte oft nicht verbessert werden, da die FHTs selber dadurch nicht stärker senden. Besser versuchen, Lage und Antennenausrichtung des CUL zu verändern. Siehe auch Diskussion unter [https://groups.google.com/group/cul-fans/browse_thread/thread/683ca5c892eae1c3/c682a640f1ba863c?lnk=gst&amp;amp;amp;q=bWidth+freq#c682a640f1ba863c GoogleGroups-CUL-Fans]&lt;br /&gt;
&lt;br /&gt;
Werte x00-x04 sind &#039;&#039;&#039;mit&#039;&#039;&#039; Ramping und führen zum Verlust der Kommunikationsfähigkeit mit anderen CULs, z.&amp;amp;nbsp;B. [[RFR CUL]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Beim CUL im HomeMatic-Modus kann man (ohne Firmware-Modifikation) die Empfangs-/Sendeparameter &#039;&#039;&#039;nicht&#039;&#039;&#039; verstellen. Die üblichen freq/x09 etc. haben hier keine Wirkung ({{Link2Forum|Topic=10203|Message=57191|LinkText=Quelle}}).&lt;br /&gt;
&lt;br /&gt;
Weiterhin kann man zunehmend mehr Debuggingoutput auf dem CUL einschalten mit&amp;amp;#160;:&lt;br /&gt;
* &amp;lt;code&amp;gt; set CUL1 raw X61&amp;lt;/code&amp;gt; Communication wird im Detail angezeigt&lt;br /&gt;
* &amp;lt;code&amp;gt;set CUL1 raw X25&amp;lt;/code&amp;gt; auch checksum Fehler / unerkannte Protokolle werden gemeldet&lt;br /&gt;
* &amp;lt;code&amp;gt;set CUL1 raw X2F&amp;lt;/code&amp;gt; alle empfangenen Flanken werden gemeldet&lt;br /&gt;
* &amp;lt;code&amp;gt;set CUL1 raw X80&amp;lt;/code&amp;gt; RSSI / Signalstaerke jeder Flanke wird gemeldet&lt;br /&gt;
* &amp;lt;code&amp;gt;set CUL1 raw X21&amp;lt;/code&amp;gt; normal Modus&lt;br /&gt;
&lt;br /&gt;
Achtung: Auf Gross- und Kleinschreibung des &amp;quot;x,X&amp;quot; achten!&lt;br /&gt;
&lt;br /&gt;
Die kompletten Kommandos mit Erklärung für CUL sind in der [http://culfw.de/commandref.html commandref] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Versionen ==&lt;br /&gt;
Das CUL gibt es in mehreren Versionen, die sich überwiegend in Prozessor und Speicherkonfiguration unterscheiden.&lt;br /&gt;
&lt;br /&gt;
* CUL V1 - AT90USB162 Prozessor, 0,5Kb RAM, 16Kb Flashmemory, 0,5 kByte EEPROM. Einsatzfähigkeit unbekannt (aber vermutlich wie V2). Wird nicht mehr hergestellt.&lt;br /&gt;
* CUL V2 - AT90USB162 Prozessor, 0,5Kb RAM, 16Kb Flashmemory, 0,5 kByte EEPROM. Einsatzfähig. Der Flashspeicher ist jedoch zu klein für eine culfw (CUL Firmware), die Code für &#039;&#039;SlowRF&#039;&#039; Geräte und zugleich &#039;&#039;HomeMatic&#039;&#039; Geräte enthält. Es muss also vor dem Flashen der Firmware zwischen zwei jeweils reduzierten Versionen gewählt werden. Da ein CUL ohnehin nicht beide Sendemodi &#039;&#039;&#039;zeitgleich&#039;&#039;&#039; betreiben kann, ist dies keine wirkliche Einschränkung. Wird nicht mehr hergestellt.&lt;br /&gt;
* CUL V3 - ATMega32U4 Prozessor, 2,5 kB RAM, 32 kB Flashmemory, 1 kByte EEPROM). Voll einsatzfähig.&lt;br /&gt;
* CUL V4 - ATMega32U2 Prozessor, 1 kB RAM 32 kB Flashmemory, 1 kByte EEPROM. Voll einsatzfähig. Genau genommen ein &amp;quot;Sparmodell&amp;quot; des V3, um Lieferengpässe des atmega32u4 Prozessors zu umgehen. Der reduzierte RAM-Speicher verursacht (zumindest gegenwärtig) beim Betrieb mit culfw und FHEM keine Einschränkungen oder Nachteile. Achtung: Flashen des CULv4 setzt DFU-Programmer 0.5.4 oder höher voraus.&lt;br /&gt;
&lt;br /&gt;
Die für die aktuellen Modelle lieferbare Abschirmung ist in der Regel nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
== Firmware {{Anker|FW}} ==&lt;br /&gt;
Die für den CUL und verwandte Hardware wie [[CUN]] und CUR im Zusammenhang mit FHEM überwiegend eingesetzte Firmware findet sich auf der&lt;br /&gt;
* [http://culfw.de CUL Firmware Homepage]&lt;br /&gt;
Dort kann die jeweils aktuelle Version nachgesehen und herunter geladen werden.&lt;br /&gt;
Alten Stände, Version für Entwickler und ganz aktuelle Änderungen findet man auf der&lt;br /&gt;
* [https://sourceforge.net/projects/culfw/ Sourceforge Projektseite der culfw]&lt;br /&gt;
Hier kann man sich z.B. mit&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
svn co svn://svn.code.sf.net/p/culfw/code/trunk/culfw&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
die aktuelle Version laden.&lt;br /&gt;
Zusätzlich gibt es eine für InterTechno angepasste Version:&lt;br /&gt;
* [https://github.com/heliflieger/a-culfw Alternative culfw for cul devices] auf GitHub und im {{Link2Forum|Topic=35064|LinkText=Forum}}&lt;br /&gt;
Hier könnte es aber zu Funktionseinschränkungen bei anderen Protokollen kommen.&lt;br /&gt;
In dieser Version ist auch ein Portierung auf ARM-Prozessoren enthalten (siehe {{Link2Forum|Topic=38404|LinkText=Forum}}) mit der die CUL-Firmware auch auf dem HM-CFG-USB-2 und dem [[MAX]] Cube betrieben werden kann.&lt;br /&gt;
&lt;br /&gt;
Generell ist das Angebot an Speicherplatz auf dem im CUL verwendeten ATMega32U2 sehr eingeschränkt, wodurch Erweiterungen ohne Abstriche an anderer Stelle kaum mehr möglich sind. Es wird also die optimale CUL-Firmware für alle Zwecke nie geben, so dass man die Auswahl am konkreten Bedarf klären muss. Wer die Firmware selbst compiliert kann gezielt Funktionen die nicht benötigt werden weg lassen und dafür ggf. Funktionen die sonst nicht eingefügt sind hinzufügen.&lt;br /&gt;
&lt;br /&gt;
== Sendefrequenz ==&lt;br /&gt;
Das CUL gibt es in Ausführungen für 868 und 433 MHz. &lt;br /&gt;
Die Sende- und Empfangsfrequenz des CUL sind in weiten Bereichen einstellbar, im &#039;&#039;SlowRF&#039;&#039; Mode auch durch direkte Befehle aus FHEM (im &#039;&#039;HomeMatic&#039;&#039; Mode derzeit nicht unterstützt). Der wesentliche Unterschied der 868 und 433 MHz CULs ist ein auf die Frequenz richtig abgestimmter HF-Eingangskreis inklusive Antennenlänge.&lt;br /&gt;
&lt;br /&gt;
Es ist es durchaus möglich, ein 868 MHz CUL auf 433 MHz einzustellen. Da dann aber die HF-Eingangskreis-Abstimmung und Antennenlänge nicht korrekt sind, ist Empfangs- und Sendeleistung suboptimal, die Reichweite sinkt. Dennoch wird diese Möglichkeit des freien Einstellens durch das FHEM Intertechnomodul genutzt, da Intertechnokomponenten mit 433 MHz arbeiten. Dazu wird beim Senden eines Intertechno-Befehls die Frequenz eines 868 MHz CULs kurz umgestellt.&lt;br /&gt;
&lt;br /&gt;
== Antenne ==&lt;br /&gt;
Der CUL ist mit RP-SMA-Stecker für die Antenne aber auch mit angelöteter Drahtantenne lieferbar.&lt;br /&gt;
Funktional besteht kein Unterschied: auch die &amp;quot;richtige&amp;quot; Antenne ist (in diesem Fall) nur ein Draht, jedoch  gummiummantelt und eventuell mit einem Knickgelenk und einem Schraubanschluss versehen, d.h. die Drahtantenne sieht nur unschön aus.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist nur die Länge. Diese muss vorteilhafterweise so groß sein wie ein Viertel der Wellenlänge der Frequenz (&amp;quot;Lambda/4&amp;quot;). Die sind bei 868 Mhz ca. 8,6 Zentimeter. Antennenlängen die länger oder kürzer sind verschlechtern in der Regel die Leistung. Daher ist eine z.B. 10 Zentimeter lange Antenne (obwohl länger) schlechter als 1/4 Lambda mit 8,6 Zentimeter.&lt;br /&gt;
&lt;br /&gt;
Über besondere Antennenkonstruktionen  (bitte nach Colinear, Jpole, Yagi suchen) oder Antennen die &amp;quot;Lambda/2&amp;quot; oder gar (&amp;quot;Lambda&amp;quot;) lang sind  (also ca. 17,2  bzw. 34,5 Zentimeter) kann ein höher Gewinn erreicht werden. Einher geht aber gleichzeitig eine stärkere Richtwirkung der Antenne. Je kürzer die Antenne, desto kugelförmiger die Abstrahlung. Bei längeren Antennen wird die Abstrahlung mehr und mehr zylinderähnlich, also mit horizontaler Richtwirkung (und in die Richtung ist das Signal dann stärker, daher der Antennen&amp;quot;gewinn&amp;quot;).&lt;br /&gt;
Das hat auch Nachteile, speziell wenn man auch &amp;quot;nach oben&amp;quot; funken will. Speziell wenn man Antennen länger als eine λ/4 Antenne (8,6 Zentimeter) in einem mehretagigen Haus verwenden will, muss man diese daher in der Regel waagerecht/horizontal ausrichten, da alles was in Richtung der Spitze (und dem Fuss) der Antenne liegt schlecht Empfangen wird.&lt;br /&gt;
&lt;br /&gt;
Daher: Je mehr Gewinn die Antenne aufweist, desto besser ist die Sende und Empfangsleistung, aber desto mehr Gedanken muss man sich um die Ausrichtung der Antenne machen, um alle Geräte zu empfangen / zu erreichen. &amp;quot;Mehr db&amp;quot; und speziell &amp;quot;länger&amp;quot; ist also nicht automatisch besser. &lt;br /&gt;
&lt;br /&gt;
Zu beachten, ist auch, dass die Sendeleistung der Module gesetzlich geregelt ist und Spezialantennen mit höherem Gewinn ggf. nur an Empfängern erlaubt sind.&lt;br /&gt;
&lt;br /&gt;
Falls man den CUL mit RP-SMA Stecker geordert hat, aber keine passend lange RP-SMA-Antenne verfügbar ist, kann (nur für erste Tests) auch eine abschraubbare Antenne für 802.11b/g WLAN-Geräte (2,4&amp;amp;nbsp;GHz) benutzt werden, so diese anschlusstechnisch auf den RP-SMA-Stecker des CUL passt (dies funktioniert zumindest mit FS20- und EM-Geräten). Deren Länge ist wie oben diskutiert aber nicht optimal, besser ist auf jeden Fall eine speziell auf den Einsatzzweck (Frequenz) abgestimmte Antenne.&lt;br /&gt;
&lt;br /&gt;
== Antennenlänge ==&lt;br /&gt;
Die genauen Antennenlängen sind praktisch schwer zu ermitteln, da auch Zuleitung auf dem CUL zugerechnet werden müssten und ggf Dämpfungen (also z.b. Durchführung der Antenne durch eine Gehäuse, oder gebogene Antennen) die Antennenlänge weiter beeinflussen. Gleichzeitig haben schon Abweichungen von wenigen Millimetern messbaren Einfluss. Die Antennenlänge ist daher immer nur eine Kompromiss.&lt;br /&gt;
&lt;br /&gt;
Exact berechnet ohne Störeinflüsse wären folgende Antennelängen nutzbar:&lt;br /&gt;
 868,35 Mhz (z.B. HM, FS20, FHT …)&lt;br /&gt;
 1/4 Lambda = 8,63 Zentimeter &lt;br /&gt;
 1/2 Lambda = 17,26 Zentimeter &lt;br /&gt;
 1 Lambda = 34,52 Zentimeter  (Bereits sehr hohe Richtwirkung)&lt;br /&gt;
&lt;br /&gt;
433,92 Mhz  (z.B. Intertechno …)&lt;br /&gt;
 1/4 Lambda = 17,27 Zentimeter &lt;br /&gt;
 1/2 Lambda = 34,54 Zentimeter &lt;br /&gt;
&lt;br /&gt;
Folgende Antennenlängen bieten sich praktisch an, diese sind immer etwas kürzer als die optimale Länge, dies wird z.T. durch Leiterlänge im CUL kompensiert.:&lt;br /&gt;
&lt;br /&gt;
 8,6 Zentimeter als 1/4 Lambda für 868,35 Mhz&lt;br /&gt;
 17,2 Zentimeter als 1/2 Lambda für 868,35 Mhz und zugleich 1/4 Lambda für 433,92 Mhz&lt;br /&gt;
 34,5 Zentimeter als Lambda für 868,35 Mhz und zugleich 1/2 Lambda für 433,92 Mhz&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Im Gegensatz zu den original FHZ Zentralen ist das CUL recht flankensteil, d.h. die Sende- und Empfangsfrequenz wird genauer eingehalten als z.&amp;amp;nbsp;B. bei einer FHZ1x00PC. Dies kann im Zusammenhang mit den eher ungenauen Sendern z.&amp;amp;nbsp;B. der FHT Raumregler zu Empfangsproblemen führen. Es kann daher mitunter sinnvoll sein, die Sende- und Empfangsbandbreite des CUL etwas zu erhöhen. Dies senkt jedoch gleichzeitig die Empfindlichkeit.&lt;br /&gt;
&lt;br /&gt;
Bei Empfangsproblemen von z.&amp;amp;nbsp;B. HEM-Sensoren oder dem S300TH kann man folgendes testen:&lt;br /&gt;
&lt;br /&gt;
* Man kann die Frequenz des CUL auf genau 868,35 MHz einstellen. Standardmäßig ist hier aus Kompatibilitätsgründen 868,30 MHz eingestellt. Diese Einstellung wird fest im NVRAM gespeichert und braucht nur einmal vorgenommen zu werden.&lt;br /&gt;
*: &amp;lt;code&amp;gt;set CUL freq 868.350&amp;lt;/code&amp;gt;&lt;br /&gt;
* Es ist möglich die &amp;quot;decision boundary&amp;quot; zu vergrößern, frei beschrieben: die &amp;quot;Entscheidungsgrenze&amp;quot; ob die empfangene Signalflanke digital &amp;quot;0&amp;quot; oder &amp;quot;1&amp;quot; darstellte ({{Link2Forum|Topic=8572|Message=44388|LinkText=siehe Diskussion hier}}). Möglich sind die Werte &amp;quot;4&amp;quot;, &amp;quot;8&amp;quot; und &amp;quot;16&amp;quot;. Default-Einstellung ist hier &amp;quot;4&amp;quot;. Zur Steigerung der Empfangsqualität soll es hilfreich sein, hier &amp;quot;8&amp;quot; einzustellen. Mitunter bringt jedoch erst die Einstellung auf &amp;quot;16&amp;quot; signifikante Verbesserungen beim Empfang von S300TH-Sensoren.&lt;br /&gt;
*: &amp;lt;code&amp;gt;set CUL sens 8&amp;lt;/code&amp;gt;&lt;br /&gt;
* Oft hilft auch, die Bandbreite auf z.&amp;amp;nbsp;B. 464 kHz aufzuweiten.&lt;br /&gt;
*: &amp;lt;code&amp;gt;set CUL bWidth 464&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Selbstbau-/Bastelprojekte ==&lt;br /&gt;
Innerhalb der FHEM-Community werden mittlerweile diverse Bastelprojekte zum Selbstbau eines CUL betrieben. Eine Auswahl dieser Projekte:&lt;br /&gt;
* [[Selbstbau CUL]]&lt;br /&gt;
* [[FHEMduino]]&lt;br /&gt;
* [[SIGNALduino]]&lt;br /&gt;
* [[MapleCUN]] mit STM32 Mikrocontroller&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Hersteller / Bezugsquelle für CUL: [http://www.busware.de/tiki-index.php?page=CUL busware.de]&lt;br /&gt;
* Google groups [https://groups.google.com/group/cul-fans/ CUL fans], mittlerweile durch das Board {{Link2Forum|Area=cul-fans}} im [http://forum.fhem.de/index.php FHEM Forum] ergänzt/ersetzt&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:CUL]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=20732</id>
		<title>Alexa-Fhem</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=20732"/>
		<updated>2017-03-14T21:10:51Z</updated>

		<summary type="html">&lt;p&gt;Moontear: &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 [https://forum.fhem.de/index.php/topic,60244.0.html 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;source 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;/source&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;source 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;/source&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  [https://forum.fhem.de/index.php/topic,60244.msg540117.html#msg540117 hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
====Erstinstallation====&lt;br /&gt;
Hier wird die Erstinstallation von Alexa-Fhem beschrieben&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).&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;mv package alexa-fhem&amp;lt;/source&amp;gt;&lt;br /&gt;
# Durch &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd alexa-fhem&amp;lt;/source&amp;gt; in das Verzeichnis wechseln&lt;br /&gt;
# Mit &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/source&amp;gt; alle Abhängigkeiten installieren (kein sudo!).&lt;br /&gt;
# SSL Zertifikat erzeugen durch Aufruf von &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./createKey.sh&amp;lt;/source&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;
&lt;br /&gt;
====Update====&lt;br /&gt;
Hier wir das Update auf eine neue Version von Alexa-Fhem beschrieben&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;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/source&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;
&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;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./bin/alexa&amp;lt;/source&amp;gt; den Dienst starten (kein sudo!)&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 [https://forum.fhem.de/index.php/topic,60244.msg517271.html#msg517271 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;source 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;/source&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;source 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;/source&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&amp;quot; unter &amp;lt;code&amp;gt;/etc/default&amp;lt;/code&amp;gt; anlegen&lt;br /&gt;
&lt;br /&gt;
 # Defaults / Konfigurations Optionen für alexa-fhem&lt;br /&gt;
 # Wo findet alexa-fhem die config.json Datei?&lt;br /&gt;
 ALEXA_OPTS=-U /opt/fhem/.alexa&lt;br /&gt;
&lt;br /&gt;
Den Pfad &amp;lt;code&amp;gt;/opt/fhem/.alexa&amp;lt;/code&amp;gt; an die Systemgegebenheiten anpassen. Letztendlich kann die config.json irgendwo liegen, hauptsache alexa-fhem weiß wo. Achtung: Natürlich muss der Benutzer auch Zugriff auf das Verzeichnis mit der config als auch das alexa-fhem Verzeichnis haben.&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 #oder ein anderer Benutzer wie fhem&lt;br /&gt;
 EnvironmentFile=/etc/default/alexa&lt;br /&gt;
 # oder wo auch immer eure alexa-fhem liegt&lt;br /&gt;
 ExecStart=/opt/fhem/alexa-fhem/bin/alexa $ALEXA_OPTS&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;
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;
&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;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;define MyAlexa alexa&amp;lt;/source&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.&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 =====&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;) &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;
==== 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 wird bzw. im großen Textfeld ist 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 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;). 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: 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;
  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;
 &#039;&#039;&#039;attr Alexa.Party setList on off&#039;&#039;&#039;&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;
== 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.&lt;br /&gt;
&lt;br /&gt;
Das Prinzip der Kommandokonfiguration ist {{Link2Forum|Topic=60244|Message=532513|LinkText=im Forum}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
TODO: Abfragen, Attribute (alexaMapping, alexaTypes, fhemIntents, articles, prepositions)&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;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;node -v&amp;lt;/source&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 Änderugen gemacht habt und den alexa-fhem Dienst noch nicht neu gestartet habt, wäre jetzt der richtige Zeitpunkt.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn sich der Alexa-Service nicht starten lässt?====&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;source 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;/source&amp;gt;&lt;br /&gt;
Sollte dies nicht der Fall sein bitte mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;chmod +x alexa&amp;lt;/source&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;
&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>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=20715</id>
		<title>Alexa-Fhem</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=20715"/>
		<updated>2017-03-14T14:37:37Z</updated>

		<summary type="html">&lt;p&gt;Moontear: alexa-fhem über systemd als Service registrieren und starten&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 [https://forum.fhem.de/index.php/topic,60244.0.html 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;source 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;/source&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;source 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;/source&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  [https://forum.fhem.de/index.php/topic,60244.msg540117.html#msg540117 hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
====Erstinstallation====&lt;br /&gt;
Hier wird die Erstinstallation von Alexa-Fhem beschrieben&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).&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;mv package alexa-fhem&amp;lt;/source&amp;gt;&lt;br /&gt;
# Durch &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd alexa-fhem&amp;lt;/source&amp;gt; in das Verzeichnis wechseln&lt;br /&gt;
# Mit &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/source&amp;gt; alle Abhängigkeiten installieren (kein sudo!).&lt;br /&gt;
# SSL Zertifikat erzeugen durch Aufruf von &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./createKey.sh&amp;lt;/source&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;
&lt;br /&gt;
====Update====&lt;br /&gt;
Hier wir das Update auf eine neue Version von Alexa-Fhem beschrieben&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;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/source&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;
&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;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./bin/alexa&amp;lt;/source&amp;gt; den Dienst starten (kein sudo!)&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 [https://forum.fhem.de/index.php/topic,60244.msg517271.html#msg517271 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;source 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;/source&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;source 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;/source&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 legen wir einen neuen Benutzer an unter dem alexa-fhem laufen soll, falls ihr 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 er keine Gruppen, aber ihr könnt dem 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&amp;quot; unter &amp;lt;code&amp;gt;/etc/default&amp;lt;/code&amp;gt; anlegen&lt;br /&gt;
&lt;br /&gt;
 # Defaults / Konfigurations Optionen für alexa-fhem&lt;br /&gt;
 # Wo findet alexa-fhem die config.json Datei?&lt;br /&gt;
 ALEXA_OPTS=-U /opt/fhem/.alexa&lt;br /&gt;
&lt;br /&gt;
Den Pfad &amp;lt;code&amp;gt;/opt/fhem/.alexa&amp;lt;/code&amp;gt; müsst ihr an eure Gegebenheiten anpassen. Letztendlich kann die config.json irgendwo liegen, hauptsache alexa-fhem weiß wo. Achtung: Natürlich muss der Benutzer auch Zugriff auf das Verzeichnis als auch das alexa-fhem Verzeichnis haben.&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 #oder ein anderer Benutzer wie fhem&lt;br /&gt;
 EnvironmentFile=/etc/default/alexa&lt;br /&gt;
 # oder wo auch immer eure alexa-fhem liegt&lt;br /&gt;
 ExecStart=/opt/fhem/alexa-fhem/bin/alexa $ALEXA_OPTS&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;
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;
&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;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;define MyAlexa alexa&amp;lt;/source&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.&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 =====&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;) &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;
==== 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 wird bzw. im großen Textfeld ist 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 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;). 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: 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;
  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;
 &#039;&#039;&#039;attr Alexa.Party setList on off&#039;&#039;&#039;&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;
== 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.&lt;br /&gt;
&lt;br /&gt;
Das Prinzip der Kommandokonfiguration ist {{Link2Forum|Topic=60244|Message=532513|LinkText=im Forum}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
TODO: Abfragen, Attribute (alexaMapping, alexaTypes, fhemIntents, articles, prepositions)&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;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;node -v&amp;lt;/source&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 Änderugen gemacht habt und den alexa-fhem Dienst noch nicht neu gestartet habt, wäre jetzt der richtige Zeitpunkt.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn sich der Alexa-Service nicht starten lässt?====&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;source 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;/source&amp;gt;&lt;br /&gt;
Sollte dies nicht der Fall sein bitte mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;chmod +x alexa&amp;lt;/source&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;
&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>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-LC-Sw2PBU-FM_Unterputz-Schaltaktor_2-fach&amp;diff=19433</id>
		<title>HM-LC-Sw2PBU-FM Unterputz-Schaltaktor 2-fach</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-LC-Sw2PBU-FM_Unterputz-Schaltaktor_2-fach&amp;diff=19433"/>
		<updated>2017-02-04T21:25:14Z</updated>

		<summary type="html">&lt;p&gt;Moontear: Initiale Version des Artikels&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware|Bild=HM-LC-Sw2PBU-FM_Front.jpg&lt;br /&gt;
|Bildbeschreibung=HM-LC-Sw2PBU-FM Unterputz-Schaltaktor 2-fach für Markenschalter&lt;br /&gt;
|HWProtocol=HomeMatic &lt;br /&gt;
|HWType=Aktor / Sender&lt;br /&gt;
|HWCategory=HomeMatic&lt;br /&gt;
|HWComm=868,3MHz&lt;br /&gt;
|HWChannels=2&lt;br /&gt;
|HWVoltage=230V&lt;br /&gt;
|HWPowerConsumption=0,5W (Standby)&lt;br /&gt;
|HWPoweredBy=Netz&lt;br /&gt;
|HWSize=71x71x37 mm &lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#CUL_HM CUL_HM]&lt;br /&gt;
|HWManufacturer=eQ-3}}&lt;br /&gt;
&lt;br /&gt;
[[HM-LC-Sw2PBU-FM Unterputz-Schaltaktor 2-fach]] ist ein zweikanaliger Funk-Schaltaktor &amp;quot;für Markenschalter&amp;quot;, der mittels entsprechender Installationsadapter mit Tasterwippen diverser renommierter Hersteller versehen werden kann und sich dadurch nahtlos in bestehende Elektroinstallationen einfügt.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Das besondere an diesem Schalter ist, dass er den vorhandenen Unterputzeinsatz vollständig ersetzt. Dabei kann die Wippe des vorhandenen Schalters - je nach Hersteller - mit einer entsprechenden Adapterplatte weiterverwendet werden. Anzumerken ist dass man nicht zwei getrennte Schaltwippen erhält sondern eine große Schaltwippe, wobei der obere Bereich der Schaltwippe im Standard Kanal 1 schaltet, der untere Bereich Kanal 2.&lt;br /&gt;
&lt;br /&gt;
Es handelt sich hierbei nur um einen Aktor. Es ist nicht möglich die Taster mit anderen Homematic Geräten zu peeren.&lt;br /&gt;
&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
&lt;br /&gt;
{|  &lt;br /&gt;
| Art&lt;br /&gt;
| Unterputz&lt;br /&gt;
|- &lt;br /&gt;
| Typ&lt;br /&gt;
| 2fach&lt;br /&gt;
|- &lt;br /&gt;
| Stand-by-Verbrauch&lt;br /&gt;
| 0,2 W (lt. Bedienungsanleitung, S. 38, Stand 02/2017)&lt;br /&gt;
|- &lt;br /&gt;
| Versorgungsspannung&lt;br /&gt;
| 230 V&lt;br /&gt;
|- &lt;br /&gt;
| Abmessungen (B x H x T)&lt;br /&gt;
| 71 x 71 x 37 mm&lt;br /&gt;
|- &lt;br /&gt;
| Farbe&lt;br /&gt;
| Grau&lt;br /&gt;
|- &lt;br /&gt;
| Max. Schaltleistung&lt;br /&gt;
| 690 W je Kanal, 1150 W Total&lt;br /&gt;
|- &lt;br /&gt;
| Laststrom&lt;br /&gt;
| 3 A je Kanal, 5 A total&lt;br /&gt;
|- &lt;br /&gt;
| Relaistyp&lt;br /&gt;
| Wechsler&lt;br /&gt;
|- &lt;br /&gt;
| Funkfrequenz&lt;br /&gt;
| 868,3 MHz&lt;br /&gt;
|- &lt;br /&gt;
| Empfängerklasse&lt;br /&gt;
| SRD Class 2&lt;br /&gt;
|- &lt;br /&gt;
| Max. Sendeleistung&lt;br /&gt;
| 10 mW&lt;br /&gt;
|- &lt;br /&gt;
| IP-Schutzgrad&lt;br /&gt;
| IP 20&lt;br /&gt;
|- &lt;br /&gt;
| Umgebungstemperaturbereich&lt;br /&gt;
| 5–35 °C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hinweise zur Hardware-Installation ==&lt;br /&gt;
Der vorhandene Schalter muss ersetzt werden. Dabei sind ein paar Dinge zu beachten:&lt;br /&gt;
&lt;br /&gt;
* Der (neue) Schalter benötigt neben dem L-Leiter auch einen N-Leiter für die Stromversorgung.&lt;br /&gt;
* Die Befestigung ist nicht wie bei dem System z.B. von Merten durch spreizen von Klammern möglich. Der Schalter muss in die Löcher in der Dose geschraubt werden (Schrauben im Lieferumfang enthalten).&lt;br /&gt;
* Die &amp;quot;Frontplatte&amp;quot; bzw. der Befestigungsrahmen ist etwas dicker, als der Rahmen eines normalen Schalters. Dadurch kann es sein, dass der vorhandene Rahmen des Schalters nicht mehr ganz an der Wand anliegt.&lt;br /&gt;
* Um die bereits vorhandene Schalter-Wippe weiter nutzen zu können, muss ein passender Adapter verwendet werden.&lt;br /&gt;
* Bestehende Schaltwippen 2-fach können ebenfalls verwendet werden, sind hinterher aber als eine große Schaltwippe zu bedienen. Falls man das nicht mag müsste man eine große Schaltwippe nachkaufen&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Das [[Pairing (HomeMatic)|Pairing]] sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM Config-Auszug ===&lt;br /&gt;
Ein exemplarischer Auszug aus der [[Konfiguration]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Licht_Bad CUL_HM xxxxxxx&lt;br /&gt;
attr &amp;lt;name&amp;gt; IODev CUL_0&lt;br /&gt;
attr &amp;lt;name&amp;gt; autoReadReg 4_reqStatus&lt;br /&gt;
attr &amp;lt;name&amp;gt; expert 1_allReg&lt;br /&gt;
attr &amp;lt;name&amp;gt; firmware 2.9&lt;br /&gt;
attr &amp;lt;name&amp;gt; group Lampen&lt;br /&gt;
attr &amp;lt;name&amp;gt; model HM-LC-Sw2PBU-FM&lt;br /&gt;
attr &amp;lt;name&amp;gt; serialNr NEQ16xxxxxx&lt;br /&gt;
attr &amp;lt;name&amp;gt; subType switch&lt;br /&gt;
attr &amp;lt;name&amp;gt; webCmd getConfig:clear msgEvents&lt;br /&gt;
define FileLog_&amp;lt;name&amp;gt; FileLog ./log/&amp;lt;name&amp;gt;-%Y.log &amp;lt;name&amp;gt;&lt;br /&gt;
attr FileLog_&amp;lt;name&amp;gt; logtype text&lt;br /&gt;
attr FileLog_&amp;lt;name&amp;gt; room CUL_HM&lt;br /&gt;
define &amp;lt;name&amp;gt;_Sw_01 CUL_HM xxxxxxx&lt;br /&gt;
attr &amp;lt;name&amp;gt;_Sw_01 model HM-LC-Sw2PBU-FM&lt;br /&gt;
attr &amp;lt;name&amp;gt;_Sw_01 peerIDs 00000000,&lt;br /&gt;
attr &amp;lt;name&amp;gt;_Sw_01 webCmd toggle,on:off&lt;br /&gt;
define &amp;lt;name&amp;gt;_Sw_02 CUL_HM xxxxxxx&lt;br /&gt;
attr &amp;lt;name&amp;gt;_Sw_02 model HM-LC-Sw2PBU-FM&lt;br /&gt;
attr &amp;lt;name&amp;gt;_Sw_02 peerIDs 00000000,&lt;br /&gt;
attr &amp;lt;name&amp;gt;_Sw_02 webCmd toggle,on:off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mögliche Schaltoperationen ===&lt;br /&gt;
Der Aktor versteht folgende Aktionen (anzuwenden auf den Channels):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set &amp;lt;name&amp;gt; on -&amp;gt; Schaltet den Aktor ein&lt;br /&gt;
set &amp;lt;name&amp;gt; off -&amp;gt; Schaltet den Aktor aus&lt;br /&gt;
set &amp;lt;name&amp;gt; toggle -&amp;gt; Ändert den Zustand des Aktors, d.h. ein eingeschalteter Aktor wird ausgeschaltet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Log-Auszug ===&lt;br /&gt;
In FHEM ist nach dem Schalten des HM-LC-Sw1PBU-FM folgendes Log zu sehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2017.02.04 17:40:06 3: CUL_HM set &amp;lt;name&amp;gt;_Sw_01 on&lt;br /&gt;
2017.02.04 17:40:09 3: CUL_HM set &amp;lt;name&amp;gt;_Sw_01 off&lt;br /&gt;
2017.02.04 17:41:03 3: CUL_HM set &amp;lt;name&amp;gt;_Sw_02 off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Einrichten des Schalters kommt folgender Auszug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2017.02.04 17:37:00 2: CUL_HM Unknown device HM_50xxx is now defined&lt;br /&gt;
2017.02.04 17:37:00 2: autocreate: define HM_50xxx CUL_HM xxxxxxx&lt;br /&gt;
2017.02.04 17:37:00 2: autocreate: define FileLog_HM_HM_50xxxFileLog ./log/HM_50xxx-%Y.log HM_50xxx&lt;br /&gt;
2017.02.04 17:37:00 3: CUL_HM get HM_50xxx_Sw_01 saveConfig ./temperatureLists/regSave.cfg strict&lt;br /&gt;
2017.02.04 17:37:00 3: CUL_HM get HM_50xxx_Sw_02 saveConfig ./temperatureLists/regSave.cfg strict&lt;br /&gt;
2017.02.04 17:37:00 3: CUL_HM pair: HM_50xxx switch, model HM-LC-Sw2PBU-FM serialNr&lt;br /&gt;
2017.02.04 17:37:05 3: CUL_HM set HM_50xxx getConfig&lt;br /&gt;
2017.02.04 17:37:07 3: CUL_HM set HM_50xxx_Sw_01 getConfig&lt;br /&gt;
2017.02.04 17:37:09 3: CUL_HM set HM_50xxx_Sw_02 getConfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Produktwebseite (Bausatz) bei [https://www.elv.de/homematic-funk-schaltaktor-2fach-unterputzmontage-1.html ELV]&lt;br /&gt;
* Sehr ähnlich ist der nicht mehr produzierte [[HM-LC-Sw2PB-FM_Schaltaktor_mit_Tasteraufsatz_2fach]]&lt;br /&gt;
* Gerne wird diese Komponente auch ersetzt durch normale Taster und dem [[HM-LC-SW2-FM_Schaltaktor_2-fach_UP]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:HM-LC-Sw2PBU-FM_Front.jpg&amp;diff=19432</id>
		<title>Datei:HM-LC-Sw2PBU-FM Front.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:HM-LC-Sw2PBU-FM_Front.jpg&amp;diff=19432"/>
		<updated>2017-02-04T21:00:42Z</updated>

		<summary type="html">&lt;p&gt;Moontear: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-LC-Sw1PBU-FM_Unterputz-Schaltaktor_1-fach&amp;diff=19431</id>
		<title>HM-LC-Sw1PBU-FM Unterputz-Schaltaktor 1-fach</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-LC-Sw1PBU-FM_Unterputz-Schaltaktor_1-fach&amp;diff=19431"/>
		<updated>2017-02-04T20:59:19Z</updated>

		<summary type="html">&lt;p&gt;Moontear: Frontalansicht des Schalters als Screenshot hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware|Bild=HM-LC-Sw1PBU-FM_Front.jpg&lt;br /&gt;
|Bildbeschreibung=HM-LC-Sw1PBU-FM Unterputz-Schaltaktor 1-fach für Markenschalter&lt;br /&gt;
|HWProtocol=HomeMatic &lt;br /&gt;
|HWType=Aktor / Sender&lt;br /&gt;
|HWCategory=HomeMatic&lt;br /&gt;
|HWComm=868,3MHz&lt;br /&gt;
|HWChannels=1&lt;br /&gt;
|HWVoltage=230V&lt;br /&gt;
|HWPowerConsumption=0,5W (Standby)&lt;br /&gt;
|HWPoweredBy=Netz&lt;br /&gt;
|HWSize=71x71x37 mm &lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#CUL_HM CUL_HM]&lt;br /&gt;
|HWManufacturer=eQ-3}}&lt;br /&gt;
&lt;br /&gt;
[[HM-LC-Sw1PBU-FM Unterputz-Schaltaktor 1-fach]] ist ein einkanaliger Funk-Schaltaktor &amp;quot;für Markenschalter&amp;quot;, der mittels entsprechender Installationsadapter mit Tasterwippen diverser renommierter Hersteller versehen werden kann und sich dadurch nahtlos in bestehende Elektroinstallationen einfügt.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Das besondere an diesem Schalter ist, dass er den vorhandenen Unterputzeinsatz vollständig ersetzt. Dabei kann die Wippe des vorhandenen Schalters - je nach Hersteller - mit einer entsprechenden Adapterplatte weiterverwendet werden.&lt;br /&gt;
&lt;br /&gt;
Es handelt sich hierbei nur um einen Aktor. Es ist nicht möglich die Taster mit anderen Homematic Geräten zu peeren. Man kann nur andere Taster mit dem Aktor peeren und diesen fernsteuern.&lt;br /&gt;
&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
&lt;br /&gt;
{|  &lt;br /&gt;
| Art&lt;br /&gt;
| Unterputz&lt;br /&gt;
|- &lt;br /&gt;
| Typ&lt;br /&gt;
| 1fach&lt;br /&gt;
|- &lt;br /&gt;
| Stand-by-Verbrauch&lt;br /&gt;
| 0,5 W (lt. Bedienungsanleitung, S. 31, Stand 02/2012, 1 W)&lt;br /&gt;
|- &lt;br /&gt;
| Versorgungsspannung&lt;br /&gt;
| 230 V&lt;br /&gt;
|- &lt;br /&gt;
| Abmessungen (B x H x T)&lt;br /&gt;
| 71 x 71 x 37 mm&lt;br /&gt;
|- &lt;br /&gt;
| Farbe&lt;br /&gt;
| Grau&lt;br /&gt;
|- &lt;br /&gt;
| Max. Schaltleistung&lt;br /&gt;
| 1000 W&lt;br /&gt;
|- &lt;br /&gt;
| Relaistyp&lt;br /&gt;
| Wechsler&lt;br /&gt;
|- &lt;br /&gt;
| Funkfrequenz&lt;br /&gt;
| 868,3 MHz&lt;br /&gt;
|- &lt;br /&gt;
| Empfängerklasse&lt;br /&gt;
| SRD Class 2&lt;br /&gt;
|- &lt;br /&gt;
| Sicherung (intern)&lt;br /&gt;
| Rundsicherung 5 A, träge&lt;br /&gt;
|- &lt;br /&gt;
| Max. Sendeleistung&lt;br /&gt;
| 10 mW&lt;br /&gt;
|- &lt;br /&gt;
| IP-Schutzgrad&lt;br /&gt;
| IP 20&lt;br /&gt;
|- &lt;br /&gt;
| Umgebungstemperaturbereich&lt;br /&gt;
| 5–35 °C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hinweise zur Hardware-Installation ==&lt;br /&gt;
Der vorhandene Schalter muss ersetzt werden. Dabei sind ein paar Dinge zu beachten:&lt;br /&gt;
&lt;br /&gt;
* Der (neue) Schalter benötigt neben dem L-Leiter auch einen N-Leiter für die Stromversorgung.&lt;br /&gt;
* Die Befestigung ist nicht wie bei dem System z.B. von Merten durch spreizen von Klammern möglich. Der Schalter muss in die Löcher in der Dose geschraubt werden (Schrauben im Lieferumfang enthalten).&lt;br /&gt;
* Die &amp;quot;Frontplatte&amp;quot; bzw. der Befestigungsrahmen ist etwas dicker, als der Rahmen eines normalen Schalters. Dadurch kann es sein, dass der vorhandene Rahmen des Schalters nicht mehr ganz an der Wand anliegt.&lt;br /&gt;
* Um die bereits vorhandene Schalter-Wippe weiter nutzen zu können, muss ein passender Adapter verwendet werden.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=&#039;&#039;&#039;Info zum Bausatz&#039;&#039;&#039;&lt;br /&gt;
Das Gerät ist als Bausatz verfügbar, es sind die folgenden bedrahteten Bauteile einzulöten:&lt;br /&gt;
* 6 Kondensatoren&lt;br /&gt;
* 3 Stiftleisten/Fassungen (insgesamt 16 Pole)&lt;br /&gt;
* 1 Spannungsregler, 1 Diode&lt;br /&gt;
* 1 Relais (8 Pole)&lt;br /&gt;
* 1 Induktivität&lt;br /&gt;
* 1 Widerstand, 1 Varistor&lt;br /&gt;
Die zu lötenden Bauteile sind relativ unproblematisch, die Lötstellen befinden sich jedoch in drei Fällen sehr nah an bzw. zwischen vorbestückten SMD-Bauteilen.}}&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Das [[Pairing (HomeMatic)|Pairing]] sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM Config-Auszug ===&lt;br /&gt;
Ein exemplarischer Auszug aus der [[Konfiguration]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LichtWohnzimmer CUL_HM 197764&lt;br /&gt;
attr LichtWohnzimmer devInfo 010100&lt;br /&gt;
attr LichtWohnzimmer firmware 2.1&lt;br /&gt;
attr LichtWohnzimmer hmClass receiver&lt;br /&gt;
attr LichtWohnzimmer model unknown&lt;br /&gt;
attr LichtWohnzimmer room Wohnzimmer&lt;br /&gt;
attr LichtWohnzimmer serialNr JEQ0xxxxxx&lt;br /&gt;
attr LichtWohnzimmer subType switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mögliche Schaltoperationen ===&lt;br /&gt;
Der Aktor versteht folgende Aktionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set &amp;lt;name&amp;gt; on -&amp;gt; Schaltet den Aktor ein&lt;br /&gt;
set &amp;lt;name&amp;gt; off -&amp;gt; Schaltet den Aktor aus&lt;br /&gt;
set &amp;lt;name&amp;gt; toggle -&amp;gt; Ändert den Zustand des Aktors, d.h. ein eingeschalteter Aktor wird ausgeschaltet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzliche Funktionen wie ein direkter Zugriff auf die integrierten Taster (self01 und self02) des Schalters können durch Programmieren der [[HomeMatic_Register_programmieren | HomeMatic Register]] realisiert werden.&lt;br /&gt;
&lt;br /&gt;
Dabei entspricht self01 dem Ausschalter des Wippschalters und self02 dem Einschalter des Wippschalters. Settings, die man also für den self01 Schalter einstellt, werden beim Ausschalten des Lichts (im Standard) angewandt und umgekehrt.&lt;br /&gt;
&lt;br /&gt;
=== Log-Auszug ===&lt;br /&gt;
In FHEM ist nach dem Schalten des HM-LC-Sw1PBU-FM folgendes Log zu sehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2012-06-05_00:09:22 LichtWohnzimmer deviceMsg: off&lt;br /&gt;
2012-06-05_00:09:22 LichtWohnzimmer off&lt;br /&gt;
2012-06-05_07:40:51 LichtWohnzimmer on&lt;br /&gt;
2012-06-05_07:40:51 LichtWohnzimmer deviceMsg: on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Einrichten des Schalters kommt folgender Auszug (Stand: 06.2012)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2012.06.04 23:12:27 2: CUL_HM pair: CUL_HM_switch_197764 is a switch, model unknown serialNr JEQ0xxxxxx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funktion als Treppenlichtschalter ===&lt;br /&gt;
Um dafür zu sorgen, dass z.B. ein durch den HM-LC-Sw1PBU-FM eingeschaltetes Licht automatisch von FHEM nach 10 Minuten ausgeschaltet wird, kann folgende Definition verwendet werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Beleuchtung_an notify Beleuchtung:on* define Beleuchtung_aus at +00:10:00 set Beleuchtung off &amp;lt;/code&amp;gt;&lt;br /&gt;
Das Licht kann auch direkt über den Schalter nach 10 Minuten ausgeschaltet werden. Dies hat den Vorteil, dass die Funktion auch ohne FHEM funktioniert und keinen Funkverkehr verursacht. Wert ist in Sekunden also 60*10 für 10 Minuten. Es gibt zwei Schaltoperationen long press (lg) und short press (sh), short press ist ein kurzes antippen, long press ist den Schalter für ca. 1 Sekunde oder mehr gedrückt halten.&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet shOnTime 600 self01&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet lgOnTime 600 self01&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet shOnTime 600 self02&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet lgOnTime 600 self02&lt;br /&gt;
&lt;br /&gt;
=== Workaround um den Taster in FHEM zu nutzen ===&lt;br /&gt;
Man kann den Taster in der Originalfirmware nicht mit anderen Geräten peeren. Allerdings kann man mit folgendem Workaround den Taster in FHEM nutzen. Das hat jedoch eine Verzögerung zwischen drei und acht Sekunden zur Folge. Dabei ist es trotzdem möglich, den Aktor per FHEM oder gepeertem Gerät weiter zu steuern. Der Taster beeinflusst den Aktor nicht mehr. Das ganze funktioniert, weil der HM-LC-Sw1PBU-FM bei jedem Tastendruck das reading für state aktualisiert, auch wenn sich der Wert nicht ändert.&lt;br /&gt;
&lt;br /&gt;
Zuerst setzt man ein event auf event-on-change-reading:&lt;br /&gt;
&lt;br /&gt;
 attr HM-LC-Sw1PBU-FM event-on-change-reading state&lt;br /&gt;
 attr HM-LC-Sw1PBU-FM event-on-update-reading state&lt;br /&gt;
&lt;br /&gt;
Weiterhin wird der Schalter deaktiviert (hier nur für kurzen Tastendruck; mit lgSwJtXXX wird dieser Effekt auch für den langen Tastendruck erzielt):&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet intKeyVisib visib&lt;br /&gt;
 set HM-LC-Sw1PBU-FM getConfig&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet prep shSwJtOff off self01&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet prep shSwJtOn on self01&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet prep shSwJtOff off self02&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet exec shSwJtOn on self02&lt;br /&gt;
&lt;br /&gt;
Nun setzt man einen Notify auf das Reading:&lt;br /&gt;
:&amp;lt;code&amp;gt;define HM-LC-Sw1PBU-FM-TasterPressed notify HM-LC-Sw1PBU-FM {set YourOtherDevice toggle}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware ===&lt;br /&gt;
Um die beiden Taster als Remote und den Aktor getrennt zu nutzen gibt es alternative Firmware, deren Funktion und Benutzung auf der Seite [[HM-LC-Sw1PBU-FM Alternative Firmware]] im Detail beschrieben ist.&lt;br /&gt;
&lt;br /&gt;
=== Schalter immer toggeln lassen ===&lt;br /&gt;
Im Werkszustand schaltet die Wippe bei Druck auf der einen Seite ein, auf der anderen Seite aus. Möchte man, dass bei jedem Tastendruck einfach der Zustand geändert wird, kann man das wie folgt erreichen (unten nur für den kurzen Tastendruck dargestellt):&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet intKeyVisib visib&lt;br /&gt;
 set HM-LC-Sw1PBU-FM getConfig&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet shActionType  jmpToTarget self01&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet shSwJtOn      dlyOff      self01&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet shSwJtOff     dlyOn       self01&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet shSwJtDlyOn   on          self01&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet shSwJtDlyOff  off         self01&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet shActionType  jmpToTarget self02&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet shSwJtOn      dlyOff      self02&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet shSwJtOff     dlyOn       self02&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet shSwJtDlyOn   on          self02&lt;br /&gt;
 set HM-LC-Sw1PBU-FM regSet shSwJtDlyOff  off         self02&lt;br /&gt;
&lt;br /&gt;
Um den Werkszustand bezüglich Schaltwippe wiederherzustellen (eine Seite schaltet aus, die andere wieder ein) entsprechen folgende Einstellungen dem Werkszustand:&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet shSwJtOn      dlyOff     self01&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet shSwJtOff     off        self01&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet shSwJtDlyOn   off        self01&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet shSwJtDlyOff  off        self01&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet shSwJtOn      on         self02&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet shSwJtOff     dlyOn      self02&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet shSwJtDlyOn   on         self02&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet shSwJtDlyOff  on         self02&lt;br /&gt;
&lt;br /&gt;
=== on-for-timer Ersatz ===&lt;br /&gt;
Der HM-LC-Sw1PBU-FM kennt kein &amp;lt;code&amp;gt;set on-for-timer&amp;lt;/code&amp;gt;. Um den HM-LC-Sw1PBU-FM trotzdem für einige Zeit anschalten zu können (z. B. wenn ein Fensteröffner dranhängt und das Fenster nur für eine gewisse Zeit geöffnet werden soll), muss ein Button der vccu mit dem HM-LC-Sw1PBU-FM gepeered werden:&lt;br /&gt;
 set vccu_Btn4 peerChan 0 HM-LC-Sw1PBU-FM dual set&lt;br /&gt;
&lt;br /&gt;
Danach wären (in diesem Fall mit vccu_Btn4) die virtuellen Buttons 4 und 5 mit dem HM-LC-Sw1PBU-FM gepeered. Das Fenster könnte dann über &amp;lt;code&amp;gt;set vccu_Btn4 press short&amp;lt;/code&amp;gt; für die vorher über &amp;lt;code&amp;gt;set HM-LC-Sw1PBU-FM regSet shOnTime [Dauer] vccu_Btn4&amp;lt;/code&amp;gt; die Öffnungszeit eingestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Anleitung (PDF {{DocLink|elv|/Assets/Produkte/10/1030/103029/Downloads/103029_FunkSchaltaktor_um.pdf}})&lt;br /&gt;
* Produktwebseite bei [http://www.elv.de/output/controller.aspx?cid=74&amp;amp;detail=10&amp;amp;detail2=37991 ELV]&lt;br /&gt;
* [[HM-LC-Sw1PBU-FM Alternative_Firmware|Alternative Firmware]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:HM-LC-Sw1PBU-FM_Front.jpg&amp;diff=19430</id>
		<title>Datei:HM-LC-Sw1PBU-FM Front.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:HM-LC-Sw1PBU-FM_Front.jpg&amp;diff=19430"/>
		<updated>2017-02-04T20:58:02Z</updated>

		<summary type="html">&lt;p&gt;Moontear: HM-LC-Sw1PBU-FM Unterputz-Schaltaktor 1-fach für Markenschalter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HM-LC-Sw1PBU-FM Unterputz-Schaltaktor 1-fach für Markenschalter&lt;/div&gt;</summary>
		<author><name>Moontear</name></author>
	</entry>
</feed>