<?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=Eppi</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=Eppi"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Eppi"/>
	<updated>2026-04-04T20:05:52Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ReadingsProxy&amp;diff=12199</id>
		<title>ReadingsProxy</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ReadingsProxy&amp;diff=12199"/>
		<updated>2015-09-20T06:49:40Z</updated>

		<summary type="html">&lt;p&gt;Eppi: /* setExtensions für Geräte implementieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:readingsProxy}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Aufsplitten von Mehrfachgeräten in einzelne FHEM-Devices&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=readingsProxy&lt;br /&gt;
|ModTechName=33_readingsProxy.pm&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModOwner=Andre ({{Link2FU|430|Forum}} / [[Benutzer Diskussion:justme|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Fhem-[[:Kategorie:Hilfsmodul|Hilfsmodul]] [[readingsProxy]] bietet die Möglichkeit, ein Reading oder einen Teil eines Readings eines Devices als eigenständiges Device (im Folgenden auch als &#039;&#039;Proxy Device&#039;&#039; bezeichnet) zu verwenden. Hiermit können z.B. Mehrfachsensoren und Aktoren (1-Wire 2- oder 8-fach Schalter, EnOcean Serienschalter, ...) in einzeln bedienbare Geräte aufgeteilt werden.&lt;br /&gt;
&lt;br /&gt;
Sobald das Proxy Device &#039;&#039;on&#039;&#039; und &#039;&#039;off&#039;&#039; bereitstellt, stehen über die [http://fhem.de/commandref.html#setExtensions setExtentions] auch &#039;&#039;on-for-timer&#039;&#039;, &#039;&#039;on-till&#039;&#039;, &#039;&#039;blink&#039;&#039;, usw. zur Verfügung. &lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Keine speziellen Voraussetzungen erforderlich.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Syntax für die Definition eines Proxy Device: siehe commandref.&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Attribute mit spezieller Bedeutung für Proxy Devices:&lt;br /&gt;
;readingFnAttributes&lt;br /&gt;
:...&lt;br /&gt;
;getFn&lt;br /&gt;
:...&lt;br /&gt;
;setFn&lt;br /&gt;
:...&lt;br /&gt;
;valueFn&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
Achtung: Die Beispiele enthalten keine Maskierungen oder Verdoppelungen für {{Taste|;}} und &#039;&#039;Zeilenende&#039;&#039;, sondern sind so angegeben, wie sie in [[FHEMWEB]] im Befehl-Eingabefeld oder nach Klick auf &#039;&#039;DEF&#039;&#039; eingegeben werden. Bei manuellem Einfügen in eine [[Konfiguration|Konfigurationsdatei]] sind diese Maskierungen oder Verdoppelungen natürlich vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
=== 1-Wire dual switch (DS2406) mit OWDevice als input (erster Kanal) ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:500px;&amp;quot;&amp;gt;&lt;br /&gt;
 define myProxy readingsProxy myDS2406:latch.A&lt;br /&gt;
 attr myProxy valueFn {($VALUE == 1)?&amp;quot;on&amp;quot;:&amp;quot;off&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 1-Wire 8-fach switch (DS2408) mit OWSWITCH als Output (erster Kanal)===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:500px;&amp;quot;&amp;gt;&lt;br /&gt;
  define SchalterA readingsProxy OWX:xxx&lt;br /&gt;
  attr SchalterA setFn {($CMD eq &amp;quot;on&amp;quot;)?&amp;quot;output A off&amp;quot;:&amp;quot;output A on&amp;quot;}&lt;br /&gt;
  attr SchalterA setList on off&lt;br /&gt;
  attr SchalterA valueFn {($VALUE == 0)?&amp;quot;off&amp;quot;:&amp;quot;on&amp;quot;}&lt;br /&gt;
  attr SchalterA webCmd on:off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== on/off vertauschen ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:500px;&amp;quot;&amp;gt;&lt;br /&gt;
 define proxy readingsProxy meineLampe:state&lt;br /&gt;
 attr proxy setFn {($CMD eq &amp;quot;on&amp;quot;)?&amp;quot;off&amp;quot;:&amp;quot;on&amp;quot;}&lt;br /&gt;
 attr proxy valueFn {($VALUE eq &amp;quot;on&amp;quot;)?&amp;quot;off&amp;quot;:&amp;quot;on&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== EnOcean Serienschalter ===&lt;br /&gt;
Siehe auch [[EnOcean Starter Guide#Aufteilung der Kanäle in unabhängige Devices|EnOcean Starter Guide]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:500px;&amp;quot;&amp;gt;&lt;br /&gt;
 #Kanal A zur Steuerung mit on und off&lt;br /&gt;
 define Schalter_channelA readingsProxy Schalter:state&lt;br /&gt;
 attr Schalter_channelA setFn {($CMD eq &amp;quot;on&amp;quot;)?&amp;quot;AI&amp;quot;:&amp;quot;A0&amp;quot;;;}&lt;br /&gt;
 attr Schalter_channelA setList on off&lt;br /&gt;
 attr Schalter_channelA valueFn {$LASTCMD}&lt;br /&gt;
 attr Schalter_channelA webCmd on:off&lt;br /&gt;
&lt;br /&gt;
 #Kanal B zur Steuerung mit on und off&lt;br /&gt;
 define Schalter_channelB readingsProxy Schalter:state&lt;br /&gt;
 attr Schalter_channelB setFn {($CMD eq &amp;quot;on&amp;quot;)?&amp;quot;BI&amp;quot;:&amp;quot;B0&amp;quot;;;}&lt;br /&gt;
 attr Schalter_channelB setList on off&lt;br /&gt;
 attr Schalter_channelB valueFn {$LASTCMD}&lt;br /&gt;
 attr Schalter_channelB webCmd on:off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setExtensions für Geräte implementieren ===&lt;br /&gt;
Wenn ein (Original-)Device von sich aus die [http://fhem.de/commandref.html#setExtensions setExtentions] nicht unterstützt, kann das durch Verwendung eines Proxy Device behoben/implementiert werden. Sobald ein Proxy Device &#039;&#039;on&#039;&#039; und &#039;&#039;off&#039;&#039; bereitstellt, stehen über die setExtensions auch &#039;&#039;on-for-timer&#039;&#039;, &#039;&#039;on-till&#039;&#039;, &#039;&#039;blink&#039;&#039;, usw. zur Verfügung. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:500px;&amp;quot;&amp;gt;&lt;br /&gt;
 define STECKD_TEST readingsProxy STECKD_BAUHS:state&lt;br /&gt;
 attr STECKD_TEST setFn {($CMD eq &amp;quot;on&amp;quot;)?&amp;quot;angle 3874&amp;quot;:&amp;quot;angle 3873&amp;quot;;}&lt;br /&gt;
 attr STECKD_TEST setList on off&lt;br /&gt;
 attr STECKD_TEST valueFn {$LASTCMD}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel aus diesem {{Link2Forum|Topic=22753|LinkText=Forenthread}} übernommen. (Anmerkung: Die im Forenthread noch verwendete Lösung über setFN mit &amp;quot;readingsSingleUpdate&amp;quot; sowie valueFn {} ist nach Einführung von $LASTCMD in readingsProxy nicht mehr notwendig. Dementsprechend wurde hier die neuere Variante mit $LASTCMD genutzt)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Forenthema zur {{Link2Forum|Topic=16827|LinkText=Vorstellung des Moduls}}&lt;br /&gt;
* Forenthema zur Fragestellung &amp;quot;{{Link2Forum|Topic=16374|LinkText=DS2408 Ports aufsplitten}}&amp;quot;&lt;br /&gt;
* Forenthema zur Fragestellung &amp;quot;{{Link2Forum|Topic=13841|LinkText=Zwei Icons für Channel A und B}}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Eppi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Trick_der_Woche&amp;diff=9724</id>
		<title>Trick der Woche</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Trick_der_Woche&amp;diff=9724"/>
		<updated>2015-02-01T09:20:05Z</updated>

		<summary type="html">&lt;p&gt;Eppi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite enthält Tipps und Tricks, die zu unbedeutend sind, einen eigenen Artikel zu rechtfertigen, alternative Schreibweisen/Lösungen für eine Problem darstellen, Ungenauigkeiten oder unklare Formulierungen in den offiziellen Dokumenten ergänzen und ähnliches. Jeder Eintrag ist typischerweise sehr kurz (wenige Zeilen lang) und beleuchtet vielleicht nur einen Aspekt von Fhem, er kann allgemeiner Natur sein, oder sich auf ein spezielles Gerät oder einen speziellen Anwendungsfall beziehen. Dieser Artikel wendet sich eher an den Anfänger.&lt;br /&gt;
== Februar 2015 ==&lt;br /&gt;
=== fhem.cfg und fhem.state bei jedem &amp;quot;save&amp;quot; speichern ===&lt;br /&gt;
Der nachfolgende CodeSnippsel erstellt bei jedem &amp;quot;save&amp;quot; eine Kopie der aktuellen fhem.cfg und fhem.state in ein Verzeichnis &amp;quot;backup_cfg-state&amp;quot; welches unter /opt/fhem/ zufinden ist. Somit kann bei einem Fehler jederzeit auf den letzten Stand zurück gegangen werden.&lt;br /&gt;
Zuerst ins FHEM Befehlsfeld nach folgenden Code eingeben:&lt;br /&gt;
 { `mkdir backup_cfg-state` } &lt;br /&gt;
&lt;br /&gt;
Danach folgenden nortify anlegen:&lt;br /&gt;
 define backupCfg notify global:SAVE {\&lt;br /&gt;
 my $now = TimeNow();; $now =~ s/ /_/g;; \&lt;br /&gt;
 `cp $attr{global}{configfile} ./backup_cfg-state/fhem.cfg.$now`;;\&lt;br /&gt;
 `cp $attr{global}{statefile} ./backup_cfg-state/fhem.state.$now`;;\&lt;br /&gt;
 } &lt;br /&gt;
Viel Spass!&lt;br /&gt;
Quelle: [http://forum.fhem.de/index.php/topic,30873.msg234412.html#msg234412 FHEM-Forum]&lt;br /&gt;
== Januar 2015 ==&lt;br /&gt;
=== CUL &amp;amp; CO über Serial ID-einbinden ===&lt;br /&gt;
Bei mehreren USB-Geräten kann es vorkommen, dass sie vertauscht werden z.B. &#039;&#039;/dev/ttyUSB0&#039;&#039; zu&#039;&#039; /dev/ttyUSB1&#039;&#039; oder &#039;&#039;/dev/ttyACM0&#039;&#039; zu &#039;&#039;/dev/ttyACM1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um dies zu umgehen, kann man sie über ihre Serial-ID in Fhem einbinden.&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl zeigt die Serial-ID:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;ls -l /dev/serial/by-id&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier die Beispielausgabe eines CUL868, JeeLink, RFXtrx und eines CUL433&lt;br /&gt;
&lt;br /&gt;
 user@xxxx:~# ls -l /dev/serial/by-id&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 23:34 usb-busware.de_CUL868-if00 -&amp;gt; ../../ttyACM0&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 13:26 usb-FTDI_FT232R_USB_UART_A901RQ9F-if00-port0-&amp;gt; ../../ttyUSB0&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 13:26 usb-RFXCOM_RFXtrx433_A1WZWL5Y-if00-port0-&amp;gt; ../../ttyUSB1&lt;br /&gt;
 lrwxrwxrwx 1 root root 13 Jan  9 21:29 usb-busware.de_CUL433-if00 -&amp;gt; ../../ttyACM1 &lt;br /&gt;
&lt;br /&gt;
Damit lässt sich folgende Definition erstellen:&lt;br /&gt;
&lt;br /&gt;
z.B. für einen CUL868&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define CUL868 CUL /dev/serial/by-id/usb-busware.de_CUL868-if00@9600 1134&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder einen JeeLink&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define Jeelink JeeLink /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A901RQ9F-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einschränkung:&#039;&#039;&#039; Bei CULs von Busware lassen sich nur CUL433 und CUL868 unterscheiden. Zwei CUL868 haben z.B. immer die gleiche Serial-ID.&lt;br /&gt;
&lt;br /&gt;
=== HM LAN Konfig-Adapter Antenne verbessern===&lt;br /&gt;
Die Antenne des [[HM-CFG-LAN LAN Konfigurations-Adapter]] kann man mit etwas Bastelgeschick verlängern um den Empfang zu verbessern. &lt;br /&gt;
&lt;br /&gt;
Sinnvoll ist die Verlängerung auf 1/2 Lambda  (868MHz = 17,27 cm) oder gar 1 Lambda.&lt;br /&gt;
1 Lambda Antennen haben starke Richtwirkung in Form eines gedachten Zylinders, dessen Mittelachse die Antenne ist.&lt;br /&gt;
D.h., Alles was sich in Richtung des Anfangs und des Endes vom Antennedraht befindet, hat schlechteren Empfang als mit einer kurzen Antenne. Daher muss man die Antenne ggf. genauer ausrichten.&lt;br /&gt;
&lt;br /&gt;
Anleitungen dazu werden an verschiedenen Stellen veröffentlicht, z.B. in &lt;br /&gt;
[http://www.ip-symcon.de/forum/threads/18411-Umbau-HM-LAN-Adapter-auf-Lambda-1-2-Dipol-Antenne diesem Beitrag] im IP-Symcon Forum (anders als der Namen der Anleitung vermuten lässt, liegt hier kein Dipol vor, sondern eine &amp;quot;normale&amp;quot; 1 Lambda Antenne.)&lt;br /&gt;
&lt;br /&gt;
Prinzipiell so dünnen Draht wie möglich verwenden.&lt;br /&gt;
&lt;br /&gt;
Wer noch mehr rausholen will, kann auch zusätzlichen Aufwand betreiben und die Antenne etwas von der Elektronik entfernen, die nämlich Störstrahlung in die Antenne einkoppelt. Oder eine Groundplane bauen.&lt;br /&gt;
Ein Anleitung für die CCU (analog auch für den HM LAN Konfig-Adapter einsetzbar) gibt es [http://www.techwriter.de/beispiel/funkeige.htm hier].&lt;br /&gt;
&lt;br /&gt;
== Dezember 2014 ==&lt;br /&gt;
=== FHT80TF als &amp;quot;Prüfsender&amp;quot; einsetzen  ===&lt;br /&gt;
Da der [[FHT80TF-2]] günstig ist und seinen Zustand ca. alle zwei Minuten sendet, kann er gut zum Ermitteln der Funklage von [[SlowRF]] Komponenten genutzt werden, auch wenn diese nicht senden. Den RSSI einer FS20 Schaltsteckdose kann man z.B. nicht wissen, da die Dose nur ein Empfänger ist. Wenn eine Dose nicht gut funktioniert und man den Verdacht hat, dass sie funktechnisch ungünstig liegt, kann man einen [[FHT80TF-2]] neben die Steckdose legen und man bekommt nach zwei Minuten einen Wert, der (trotz umgekehrter Funkrichtung) gut genug ist, um einem Hinweise zu geben.&lt;br /&gt;
&lt;br /&gt;
== Oktober 2014 ==&lt;br /&gt;
=== Aktor für Wanddosen ohne Nulleiter  ===&lt;br /&gt;
Zwar gibt es viele Aktoren, die man in Wanddosen hinter Schaltern einbauen kann, oft scheitert deren Nutzung aber daran, dass in vielen Elektroinstalltionen in der Wanddose eines (Licht)schalters kein Nulleiter verlegt ist, den die meisten Aktoren zur eigenen Stromversorgung brauchen. Hier kann der [[RSL 2-Draht Einbauschalter]] helfen, der auch ohne Nulleiter funktioniert und kompatibel zu InterTechno ist. Er lässt sich z.B. mit einem CUL(433) schalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== August 2014 ==&lt;br /&gt;
=== Perl-Skripte Online testen  ===&lt;br /&gt;
Im Internet existieren Webseiten auf denen man Perl-Code online testen kann. Beispielsweise auf [http://www.compileonline.com/execute_perl_online.php compileonline.com] kann man Code zum Testen eingeben und die Auswirkungen betrachten. Dies eignet sich zur schnellen Fehleranalyse oder um Perl zu lernen. Natürlich lassen sich keine Fhem-Besonderheiten nutzen.&lt;br /&gt;
&lt;br /&gt;
== Juli 2014 ==&lt;br /&gt;
=== Funklast reduzieren===&lt;br /&gt;
Bewegungsmelder erzeugen in der Regel eine recht hohe Funklast, wenn sie oft ausgelöst werden, also z.B. Licht in einem Zimmer schalten sollen.&lt;br /&gt;
&lt;br /&gt;
Konstruktionen der Art:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* set Licht_Flur on-for-timer 256&amp;lt;/code&amp;gt;&lt;br /&gt;
haben daher den Nachteil bei viel Bewegung im Flur und je nach Einstellung des Sendeabstandes des Bewegungsmelders mindestens alle 120 Sekunde oder öfter ein &lt;br /&gt;
:&amp;lt;code&amp;gt;on-for-timer 256&amp;lt;/code&amp;gt;&lt;br /&gt;
zu senden. Das erzeugt eine hohe Funklast, speziell wenn der Aktor ein SlowRF Gerät ist (z.B. FS20 Unterputzschalter).&lt;br /&gt;
In solchen Fällen kann es helfen, nur dann einen Befehl zu senden, wenn das Licht nicht schon an ist:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* { if (Value(&amp;quot;Licht_Flur&amp;quot;) eq &amp;quot;off&amp;quot;) { fhem (&amp;quot;set Licht_Flur1 on-for-timer 256&amp;quot;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
Nachteilig ist aber, dass eine Auslösung innerhalb 256 Sekunden die Einschaltzeit nicht verlängert. Dies kann man umgehen, indem man nicht on-for-timer verwendet, sondern den Aktor selber verzögert auschaltet und bei weiteren Auslösungen nur die Verzögerung erneut anlegt:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* { if (Value(&amp;quot;Licht_Flur1&amp;quot;) eq &amp;quot;off&amp;quot;) { fhem (&amp;quot;set Licht_Flur on ;; define FlurLicht_aus at +00:04:16 set Licht_Flur off&amp;quot;) } else { fhem (&amp;quot;delete FlurLicht_aus ;; define FlurLicht_aus at +00:04:16 set Licht_Flur off&amp;quot;) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Juni 2014 ==&lt;br /&gt;
=== Batteriestatus bei HomeMatic Devices aktivieren===&lt;br /&gt;
Zumindest einige (wenn nicht alle) batteriegespeisten HM-Geräte können Batteriemeldungen senden, tun dies in der normalen Konfiguration aber nicht.&lt;br /&gt;
Dazu muss das Register cyclicInfoMsg auf on gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
Wie man das macht steht z.B. hier&lt;br /&gt;
[[HM-SEC-SC_Tür-Fensterkontakt#Batteriestatus_aktivieren]]&lt;br /&gt;
und hier&lt;br /&gt;
[[HomeMatic_Type_ThreeState]]&lt;br /&gt;
&lt;br /&gt;
== Mai 2014 ==&lt;br /&gt;
=== Dummywert mit aktueller Uhrzeit versehen in anderen Dummy kopieren===&lt;br /&gt;
Der Inhalt von Dummy1 soll erweitert um  Uhrzeit und Datum in Dummy2 kopiert werden (z.B. um die Urzeit der letzten Auslösung einer Alarmanlage anzuzeigen)&lt;br /&gt;
:&amp;lt;code&amp;gt;{ fhem(&amp;quot;set dummy2 &amp;quot; . (Value(&amp;quot;Dummy1&amp;quot;).&amp;quot; &amp;quot;.TimeNow()) )  } &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zwei Dummywerte in einen anderen Dummy kopieren ===&lt;br /&gt;
Der String in Dummy1 soll um den String in Dummy2 erweitert und nach Dummy3 kopiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;{ fhem(&amp;quot;set Dummy3 &amp;quot;.(Value(&amp;quot;Dummy1&amp;quot;)+Value(&amp;quot;Dummy2&amp;quot;))) } &amp;lt;/code&amp;gt;&lt;br /&gt;
(Achtung: &amp;quot;+&amp;quot;  ist Zahlen addieren, &amp;quot;.&amp;quot; ist String konkatenieren) &lt;br /&gt;
&lt;br /&gt;
== April 2014==&lt;br /&gt;
=== Code sparen ===&lt;br /&gt;
Wer Definitionen wie die aus dem März zum [[Trick der Woche#Zuverlässigkeit von FS20 Schaltungen erhöhen|Abfangen von Fehlbedienungen]] verwendet, kann durch eine ELSE Erweiterung auch gleich das Auschalten erledigen.&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TV { if (&amp;quot;$EVENT&amp;quot; eq &amp;quot;on&amp;quot; || &amp;quot;$EVENT&amp;quot; eq &amp;quot;dimup&amp;quot;) { fhem(&amp;quot;set TV on&amp;quot;) } else { fhem(&amp;quot;set TV off&amp;quot;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierdurch schaltet ON oder versehentlich zu langes Drücken (also DIMUP) den Fernseher ein, jeder &#039;&#039;andere&#039;&#039; Tastendruck (also insbesondere die OFF Taste oder zu langes Drücken der OFF Taste -&amp;gt; DIMDOWN) den Fernseher aus.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist, dass die Fernbedienung standardkonfiguriert ist, siehe auch nächster Tip.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration eines FS20 Senders prüfen ===&lt;br /&gt;
Gelegentlich reagieren bestimmte notifys nicht, die von Sendern (Fernbedienungen, Sensoren oder Schaltern) ausgelöst werden sollen. Speziell bei FS20 aber auch bei HomeMatic kann das daran liegen, dass der Sender nicht sendet was man denkt. So gut wie alle FS20 Sender kennen nämlich nicht nur ON und OFF, sondern über ein Dutzend Schaltzustände. Dimmen ist einem noch hinreichend bewusst, es gibt aber auch exotische Dinge wie  Ein-für-Zeitdauer, Ein-auf-alte-Helligkeit, Aus-für-Zeitdauer (nur FS20), Ein-für-Zeitdauer-dannach-alter-Zustand und vieles mehr.&lt;br /&gt;
&lt;br /&gt;
Was also ein Infrarot-Bewegungsmelder bei Auslösung sendet und auch was eine Fernbedienungstaste sendet ist einstellbar. Wenn jetzt zum Beispiel an einer Fernbedienung auf Tastendruck nicht ON sondern Ein-für-Zeitdauer (ON-FOR-TIMER) gesendet wird, wird&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TV:on set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
seltsamerweise nicht auslösen, obwohl die richtige Taste (und diese auch nicht zu lang) gedrückt wurde.&lt;br /&gt;
&lt;br /&gt;
Auch wenn man sich sicher ist, das Richtige in die Fernbedienung/Sensoren einprogramiert zu haben, ist ein einfacher Test immer, dies mit&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV notify TV set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
zu prüfen. Dieses notify löst immer aus, wenn &amp;quot;TV&amp;quot;  &#039;&#039;irgendetwas&#039;&#039; sendet, egal was. (Beachte: Man kann dann den Fernseher aber nicht mehr ausschalten, da auch die Austaste das notify auslöst und zum TV-Aktor nur &amp;quot;on&amp;quot; sendet). Geht die Schaltung jetzt (kann man den Fernseher also jetzt EINschalten), liegt der Verdacht nahe, dass die Konfiguration des Senders / Sensors anders ist, als man denkt. Das Logfile gibt Aufschluss, welcher Befehl tatsächlich empfangen wurde.&lt;br /&gt;
&lt;br /&gt;
=== Alles in FHEM, nichts in der Fernbedienung ===&lt;br /&gt;
Versuche in deiner FHEM Umgebung nicht, das Verhalten von Aktoren durch entsprechende Befehle aus Sensoren oder Fernbedienungen zu steuern. An Besten senden die nur ON und OFF oder DIM, den Rest möglichst immer in FHEM erledigen. &lt;br /&gt;
&lt;br /&gt;
Wer eine Lampe immer für vier Minuten einschalten will, programmiert seinen Schalter (Fernbedienung) also so, das nur &amp;quot;on&amp;quot; gesendet wird und erledigt den Rest in FHEM:&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Schalter notify Schalter set Lampe-on-for-timer 240&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== März 2014==&lt;br /&gt;
=== Zuverlässigkeit von FS20 Schaltungen erhöhen ===&lt;br /&gt;
FS20 Fernbedienungen senden bei Tastendrücken von mehr als 0,4 Sekunden anstatt ON bzw. OFF DIMUP bzw DIMDOWN.&lt;br /&gt;
&lt;br /&gt;
Das führt gelegentlich zu allgemein schlechter Bedienbarkeit (und schlechtem WAF), da 0,4 Sekunden relativ kurz ist und gerne aus versehen länger gedrückt wird. Das ist vor allem problematisch, wenn etwas geschaltet werden soll, was keinen Dimmer hat oder Dimmen nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Eine Konfiguration wie &lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TV:on set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
hat also dann den Nachteil, dass bei versehentlich zu langem Tastendruck das TV nicht angeht. Da die meisten Nutzer unbewusst dazu neigen, bei Misserfolg die selbe Taste erneut aber länger zu drücken (was erneut keinen Erfolg zeigt) ist Frustration zu erwarten.&lt;br /&gt;
&lt;br /&gt;
Es kann daher speziell bei nicht dimmbaren Aktoren von Vorteil sein, auch dimmen abzufangen, z.B. durch eine zweite zusätzliche Definition:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_dimup notify TV:dimup set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist in der Regel einfacher, einige dieser zusätzlichen Definitionen einzufügen, als allen Bedienern des Systems zu erklären, dass man keinesfalls länger als 0,4 Sekunden drücken darf.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch beide Befehle in einer Definition durch Perlbefehle {} abfangen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TV { if (&amp;quot;$EVENT&amp;quot; eq &amp;quot;on&amp;quot; || &amp;quot;$EVENT&amp;quot; eq &amp;quot;dimup&amp;quot;) { fhem(&amp;quot;set TV on&amp;quot;) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Andere Möglichkeiten vergleiche: [[Trick der Woche#notify durch mehrere Ereignisse auslösen lassen|Notify durch mehrere Ereignisse auslösen lassen]]&lt;br /&gt;
&lt;br /&gt;
== Februar 2014==&lt;br /&gt;
=== Sequence nutzen ===&lt;br /&gt;
Man kann Aktionen statt mit einem Tastedruck auch mit einer Sequenz von Tastendücken auslösen. Das Format des Befehle ist:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; sequence &amp;lt;re1&amp;gt; &amp;lt;timeout1&amp;gt; &amp;lt;re2&amp;gt; [&amp;lt;timeout2&amp;gt; &amp;lt;re3&amp;gt; ...] &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei &amp;lt;re1&amp;gt; ...&amp;lt;re_n&amp;gt; die Aktionen sind und &amp;lt;timeout_n&amp;gt; der maximale Abstand der Tastendrücke in Sekunden.&lt;br /&gt;
&lt;br /&gt;
Angenommen, man wolle z.B. eine Lampe dann anschalten, wenn man zuerst Taste1 EIN, dann Taste2 AUS und dann wieder Taste1 EIN einer Fernbedienung drückt, könnte das konkret so aussehen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define MeineLampenSequenz1 sequence Btn1:on 0.5 Btn2:off 0.5 Btn1:on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zwischen jedem der Tastendrücke darf eine halbe Sekunde Abstand sein. Diese Definition selbst löst die Lampe nicht aus, sondern definiert nur wie die Sequenz aussehen soll. Um die Lampe bei erfolgreicher Betätigung der Sequenz auch einzuschalten, bedarf es zusätzlich etwas wie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define MeineLampe notify MeineLampenSequenz1:trigger set Lampe on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sequence kann man gut nutzen, um mit einer Fernbedienung mehr Funktionen zu schalten als Tasten zur Verfügung stehen. Ebenso könnte man damit simple Codeschlösser für Alarmanlagen bauen, z.B. um eine Anlage auszuschalten, wenn eine bestimmte Abfolge von Tasten gedrückt wird.&lt;br /&gt;
&lt;br /&gt;
Je nach Funksystem nimmt die Zuverlässigkeit aber rasch ab. Angenommen im Bereich FS20 (das System ist etwas unzuverlässiger ist als z.B. HomeMatic) seien 95% aller Funktsignale ungestört übertragbar, dann würden in der Praxis von 100 Tastendrücken an einer Fernbedienung 95x Erfolg zeigen und 5x fehlschlagen; das ist sicher tolerabel. &lt;br /&gt;
&lt;br /&gt;
Bei einer Sequenzlänge von nur 4 Tasten würde die kombinierte Erfolgsquote der Sequenz jedoch nur noch ca. 80% sein, zum Ausschalten einer Alarmanlage vermutlich bereits unpraktisch.&lt;br /&gt;
&lt;br /&gt;
== Januar 2014==&lt;br /&gt;
===isday===&lt;br /&gt;
Bekanntlich kann man  mit &amp;quot;isday&amp;quot; leicht testen ob es draussen hell ist oder nicht. isday ist eine Funktion des (automatisch geladenen) 99_SUNRISE_EL.pm Moduls das auch sunset und sunrise enthält.&lt;br /&gt;
&lt;br /&gt;
Problematisch bei isday ist die fehlende Möglichkeit, Sonnenaufgang und Untergang einzustellen (zumindest wenn man nicht 99_SUNRISE_EL.pm verändern will): isday ist wahr, wenn die Sonne im gegebenen Breitengrad sichtbar ist. Wenn örtliche Gegebenheiten eine Anpassung erfordern, kann man sich auch ein eigenes isday basteln, in dem man sunrise und sunset verwendet und dieses mit getrennten offsets versieht.&lt;br /&gt;
&lt;br /&gt;
Zuerst definiert man sich eine Variable (&amp;quot;dummy&amp;quot;) der anstelle isday eingesetzt werden soll, z.B.:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define Tageslicht dummy &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann wird diese mit sunset und sunrise befüllt:&lt;br /&gt;
&lt;br /&gt;
 define SetDummy1 at *{sunset(-3600)} set Tageslicht hell &lt;br /&gt;
 define SetDummy2 at *{sunrise(+1800)} set Tageslicht dunkel &lt;br /&gt;
&lt;br /&gt;
Jetzt kann für jeden Wechsel ein eigener Offset gewählt werden, im Beispiel 3600 Sekunden vor Sonnenuntergang und 1800 Sekunden nach Sonnenaufgang. Anstatt das Dummy &amp;quot;Tageslicht&amp;quot; mit den Werten &amp;quot;hell/dunkel&amp;quot; zu befüllen, kann natürlich auch 1/0 oder &amp;quot;Tag/Nacht&amp;quot; etc. verwendet werden, je nach dem was bei der Anwendung besser passt.&lt;br /&gt;
&lt;br /&gt;
Für höhere Ansprüche könnte hingegen das Twiglight-Modul verwendet werden, das Dämmerungsstufen kennt.&lt;br /&gt;
&lt;br /&gt;
===Struktur von &amp;quot;else if&amp;quot; Schleifen===&lt;br /&gt;
 define ... notify ... {\&lt;br /&gt;
  if ... {\&lt;br /&gt;
   fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  elsif {\&lt;br /&gt;
   if ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  elsif {\&lt;br /&gt;
   if ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  else {\&lt;br /&gt;
   if ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
 }}}}&lt;br /&gt;
&lt;br /&gt;
Achtung: es muss tatsächlich &amp;quot;elsif&amp;quot; heissen und nicht &amp;quot;elseif&amp;quot; oder &amp;quot;else if&amp;quot;&lt;br /&gt;
Gilt für Perl Aufrufe.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2013==&lt;br /&gt;
===notify durch mehrere Ereignisse auslösen lassen===&lt;br /&gt;
Bekanntermassen löst&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
aus, wenn irgendein Ereignis vom Sender &amp;quot;MeinSchalter&amp;quot; eintrifft.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wird das notify jedoch nur ausgelöst, wenn dieses Ereignis eine &amp;quot;on&amp;quot; ist.&lt;br /&gt;
Wenn man aber möchte, das z.B. &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; auslöst (um etwa Dim-Befehle auszuschliessen) kann dies wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:(on|off) …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klammern sind wichtig, vergleiche eine Lösung, bei der zwei Sender alternativ das notify auslösen können:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on|MeinAndererSchalter:on …&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Selbstverständlich geht z.B. auch folgendes:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on|MeinAndererSchalter …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird ausgelöst wenn &amp;quot;MeinSchalter&amp;quot; das Ereignis &amp;quot;on&amp;quot; liefert oder &amp;quot;MeinAndererSchalter&amp;quot; irgendein Ereignis&lt;br /&gt;
&lt;br /&gt;
=== Aktoren über mehrere Funkschnittstellen ansprechen ===&lt;br /&gt;
Falls man mehrere Funkschnittstellen zur Reichweitenverlängerung hat (CUL / CUNO etc), und ein Aktor von beiden Funkschnittstellen in etwa gleich (schlecht) erreichbar ist, mag der Wunsch aufkommen, einen Funkbefehl über beide Schnittstellen auszusenden. Dies ist bei Funkprotokollen möglich, die kein echtes Pairing der Aktoren an die Funkschnittstelle erfordern, also z.B. FS20 oder Intertechno, nicht jedoch bei HomeMatic.&lt;br /&gt;
&lt;br /&gt;
Problematisch ist aber, dass die Funkschnittstelle über IODev eindeutige je Aktor festgelegt werden muss, eine Zuordnung mehrerer IODevs ist nicht vorgesehen.&lt;br /&gt;
(wenn man IODev nicht setzt, wird per default die LETZTE definiert Schnittstelle verwendet)&lt;br /&gt;
&lt;br /&gt;
Diess Problem kann mit einem Trick aber umgangen werden. Und zwar legt man den Aktor 2x mit gleicher Adresse aber abweichenden Namen und IOdevs an, z.B. so:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 define brenner_CUL1 FS20 11114244 11&lt;br /&gt;
 attr brenner_CUL1 IODev CUL1&lt;br /&gt;
 attr brenner_CUL2 room Keller&lt;br /&gt;
&lt;br /&gt;
 define brenner_CUL2 FS20 11114244 11&lt;br /&gt;
 attr brenner_CUL2 IODev CUL2&lt;br /&gt;
 attr brenner_CUL2 room Keller&lt;br /&gt;
&lt;br /&gt;
Ein Befehl der Art:&lt;br /&gt;
&lt;br /&gt;
 set brenner_CUL1,brenner_CUL2 on&lt;br /&gt;
&lt;br /&gt;
sendet den ON Befehl für den FS20 Aktor 11114244 11  jetzt tatsächlich über beide CULs aus!&lt;br /&gt;
&lt;br /&gt;
Achtung: Wenn die Schnittstellen gleichschnell angebunden sind, sollte vermutlich der [[Sendpool]] verwendet werden, da die Aussendungen sonst tatsächlich gleichzeitig erfolgen könnten und sich dann gegenseitig stören würden.&lt;br /&gt;
&lt;br /&gt;
=== Retrycount bei FHTs ist überflüssig===&lt;br /&gt;
Das von der Funktion &#039;&#039;autocreate&#039;&#039; älterer FHEM Versionen beim Anlegen von FHT80 Heizungsreglern voreingetragene attribute &amp;quot;retrycount&amp;quot; hat in den allermeisten Fällen keine Wirkung, da es NUR greift, wenn man als Funkschnittstelle eine FHZ1X00PC verwendet und dann den Softbuffer einschaltet. Selbst wenn man diese Konfiguration nutzt, will gut überlegt werden, ob die Wirkung postiv ist: Bei ungenügender Empfangslage vergrössert es Kommunikationsprobleme eventuell sogar.&lt;br /&gt;
&lt;br /&gt;
Es kann also in der Regel entfernt oder auf den Wert &amp;quot;1&amp;quot; gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
 define Heizung_Bad FHT 060d&lt;br /&gt;
 attr Heizung_Bad retrycount 3       &amp;lt;=== Diese Zeile entfernen&lt;br /&gt;
&lt;br /&gt;
Siehe auch:[[Kommunikationsprobleme mit FHT]]&lt;br /&gt;
&lt;br /&gt;
== November 2013 ==&lt;br /&gt;
=== FS20 Funksteckdose sicherer schalten===&lt;br /&gt;
Seltsamerweise kommt es vor, das FS20 Aktoren - insbesondere die FS20 Funksteckdose - an der Grenze der Funkreichweite bestimmte Befehle eines Typs empfängt, andere aber nicht. Z.B. lässt sich die FS20 Steckdose zwar immer einschalten, aber oft nicht mehr aus (oder umgekehrt).&lt;br /&gt;
&lt;br /&gt;
Gelegentlich kann man die Zuverlässigkeit erhöhen, indem man statt dem nicht funktionierenden Befehl das Gegenteil mit &amp;quot;for-timer 1&amp;quot; verwendet.&lt;br /&gt;
&lt;br /&gt;
Im Fall, dass eine FS20 Steckdose sich also einwandfrei EINschalten lässt:&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
aber oft ein AUSschalten mittels&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA off&amp;lt;/code&amp;gt;&lt;br /&gt;
nicht funktioniert, kann man versuchen die Dose anstelle mit &amp;quot;off&amp;quot; mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA on-for-timer 1&amp;lt;/code&amp;gt;&lt;br /&gt;
auszuschalten.&lt;br /&gt;
&lt;br /&gt;
Analog kann man mit off-for-timer arbeiten, wenn sich Aktoren nicht einschalten lassen, ausschalten aber geht.&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Trick funtioniert ausdrücklich nur, wenn der &amp;quot;on/off-for-timer&amp;quot; Befehl im Aktor selber abgebildet wird. Daher ist der Trick vermutlich nicht auf andere Funksysteme übertragbar.&lt;br /&gt;
&lt;br /&gt;
=== Mehrere Geräte zugleich schalten===&lt;br /&gt;
Ein Ereignis soll mehrere Geräte schalten:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1 on;;set Lampe2 on;;set FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aus Übersichtlichkeitsgründen können vor und nach den Semikolons auch Leerzeichen eingefügt werden (obwohl in einigen Dokumentation behauptet wird, dies dürfe man nicht machen):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1 on ;; set Lampe2 on ;; set FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn der Schaltbefehl bei allen Geräten gleich ist, kann man wie folgt zusammenfassen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1,Lampe2,FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Komma wird nicht [[Escapen in Perlbefehlen|escaped]] (verdoppelt), hier darf tatsächlich KEIN Leerzeichen vor oder nach dem Komma eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== Logfileinträge unterdrücken===&lt;br /&gt;
Das Attribute &amp;quot;verbose 0&amp;quot; verhindert, dass das Gerät Logfileinträge erzeugt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 define Funksteckdose FS20 22224222 01&lt;br /&gt;
 attr Funksteckdose verbose 0&lt;br /&gt;
&lt;br /&gt;
===FHT Lazy Mode benutzen===&lt;br /&gt;
Es gibt wenig Gründe, den FHT &amp;quot;Lazy Mode&amp;quot; nicht zu verwenden&lt;br /&gt;
 define Heizung_Bad FHT 060d&lt;br /&gt;
 attr Heizung_Bad lazy&lt;br /&gt;
&lt;br /&gt;
Dieser sorgt dafür, dass Temperaturänderungen (genau genommen alle Änderungen, auch z.B. date) nur übertragen werden, wenn sie nicht sowieso schon am FHT eingestellt sind und veringern die Funklast dadurch deutlich. &lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[Kommunikationsprobleme mit FHT]]&lt;br /&gt;
&lt;br /&gt;
== Oktober 2013 ==&lt;br /&gt;
=== Zuverlässigkeit von Wiedereinschalten erhöhen ===&lt;br /&gt;
Speziell bei FS20 Aktoren ist wegen des fehlenden Rückkanals nicht leicht erkennbar, ob ein Einschaltbefehl Wirkung gezeigt hat. Das hat ganz schlechten WAF, wenn man z.B. mit einem FS20 Aktor eine Heizung ausschaltet und das Wiedereinschalten nach z.B. einer Stunde nicht klappt.&lt;br /&gt;
&lt;br /&gt;
Hier empfiehlt es sich, das Ausschalten mittels &lt;br /&gt;
:&amp;lt;code&amp;gt;set Heizungs_schalter off-for-timer 3584&amp;lt;/code&amp;gt;   (= fast eine Stunde)&lt;br /&gt;
zu erledigen. Da bei FS20 der off-for-timer Befehl im Aktor abgewickelt wird (und nicht durch FHEM), schaltet sich der Aktor auch dann garantiert wieder ein, wenn Fhem abstürzt, eine Funkstörung vorliegt oder ähnliches.  Bei Bedarf kann der Befehl off-for-timer zur  Verlängerung der Ausschaltzeit wiederholt werden. Dies kann z.B. nötig sein, wenn die Ausschaltung länger als 4,5 Stunden (15360 Sekunden, der Maximalwert des Timers) dauern soll.&lt;br /&gt;
&lt;br /&gt;
Achtung: dieser Trick funktioniert nur, wenn der Aktor &amp;quot;off-for-timer&amp;quot; selbst beherrscht. FS20 Geräte können das, HomeMatic können aber nur &amp;quot;on-for-timer&amp;quot;. Man kann off-for-timer mit HomeMatic trotzdem verwenden, aber in diesem Fall sendet Fhem den Einschaltbefehl nach der Timerzeit. InterTechno, RSL etc, können gar keinen Timer, hier sendet Fhem immer 2 Befehle im passenden Abstand.&lt;br /&gt;
&lt;br /&gt;
=== FS20 Timerzeiten ===&lt;br /&gt;
FS20 Timer werden in Sekunden angegeben. Es sind jedoch nicht alle Werte einstellbar. Da der Timer Wert in 7 Bit übertragen werden muss, sind nur 128 Werte möglich. Um mit diesen Werten im unteren Bereich möglichst fein aufzulösen, andererseits aber auch lange Zeiten zu ermöglichen, ist die Verteilung nicht linear. Einstellbar sind folgende Zeiten in Sekunden;&lt;br /&gt;
&lt;br /&gt;
0,25  0,5  0,75  1  1,25  1,5  1,75  2  2,25  2,5  2,75  3  3,25  3,5  3,75   &lt;br /&gt;
4  4,5  5  5,5  6  6,5  7  7,5  8  9  10  11  12  13  14  15  16  18  20  22   &lt;br /&gt;
24  26  28  30  32  36  40  44  48  52  56  60  64  72  80  88  96  104  112   &lt;br /&gt;
120  128  144  160  176  192  208  224  240  256  288  320  352  384  416   &lt;br /&gt;
448  480  512  576  640  704  768  832  896  960  1024  1152  1280  1408   &lt;br /&gt;
1536  1664  1792  1920  2048  2304  2560  2816  3072  3328  3584  3840  4096   &lt;br /&gt;
4608  5120  5632  6144  6656  7168  7680  8192  9216  10240  11264  12288   &lt;br /&gt;
13312  14336  15360 &lt;br /&gt;
(etwas übersichtlicher formatiert auch [[FS20 Allgemein#ON/OFF Befehle mit Time Parameter|hier]]).&lt;br /&gt;
 &lt;br /&gt;
Andere Zeiten werden von Fhem gerundet. Ein neues Setzen des Timer für FS20 löscht den alten Wert.&lt;br /&gt;
&lt;br /&gt;
===Butterflecken in Wollpullovern===&lt;br /&gt;
Butterflecken in Wollpullovern können leicht durch grossflächiges Aufstreichen von Teer beseitigt werden.&lt;/div&gt;</summary>
		<author><name>Eppi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Trick_der_Woche&amp;diff=9179</id>
		<title>Trick der Woche</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Trick_der_Woche&amp;diff=9179"/>
		<updated>2015-01-04T09:55:34Z</updated>

		<summary type="html">&lt;p&gt;Eppi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite enthält Tipps und Tricks, die zu unbedeutend sind, einen eigenen Artikel zu rechtfertigen, alternative Schreibweisen/Lösungen für eine Problem darstellen, Ungenauigkeiten oder unklare Formulierungen in den offiziellen Dokumenten ergänzen und ähnliches. Jeder Eintrag ist typischerweise sehr kurz (wenige Zeilen lang) und beleuchtet vielleicht nur einen Aspekt von Fhem, er kann allgemeiner Natur sein, oder sich auf ein spezielles Gerät oder einen speziellen Anwendungsfall beziehen. Dieser Artikel wendet sich eher an den Anfänger.&lt;br /&gt;
&lt;br /&gt;
== August 2014 ==&lt;br /&gt;
=== Perl-Skripte Online testen  ===&lt;br /&gt;
Im Internet existieren Webseiten auf denen man Perl-Code online testen kann. Beispielsweise auf [http://www.compileonline.com/execute_perl_online.php www.compileonline.com] kann man Code zum Testen eingeben und die Auswirkungen betrachten. Dies eignet sich zur schnellen Fehleranalyse oder um Perl zu lernen. Natürlich lassen sich keine Fhem-Besonderheiten nutzen.&lt;br /&gt;
&lt;br /&gt;
== Juli 2014 ==&lt;br /&gt;
=== Funklast reduzieren===&lt;br /&gt;
Bewegungsmelder erzeugen in der Regel eine recht hohe Funklast, wenn sie oft ausgelöst werden, also z.b. Licht in einem Zimmer schalten sollen.&lt;br /&gt;
&lt;br /&gt;
Konstruktionen der Art:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* set Licht_Flur on-for-timer 256&amp;lt;/code&amp;gt;&lt;br /&gt;
haben daher den Nachteil bei viel Bewegung im Flur und je nach Einstellung des Sendeabstandes des Bewegungsmelders mindestens alle 120 Sekunde oder öfter ein &lt;br /&gt;
:&amp;lt;code&amp;gt;on-for-timer 256&amp;lt;/code&amp;gt;&lt;br /&gt;
zu senden. Das erzeugt eine hohe Funklast, speziell wenn der Aktor ein SlowRF Gerät ist (z.b. FS20 Unterputzschalter).&lt;br /&gt;
In solchen Fällen kann es helfen, nur dann einen Befehl zu senden, wenn das Licht nicht schon an ist:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* { if (Value(&amp;quot;Licht_Flur&amp;quot;) eq &amp;quot;off&amp;quot;) { fhem (&amp;quot;set Licht_Flur1 on-for-timer 256&amp;quot;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
Nachteilig ist aber, dass eine Auslösung innerhalb 256 Sekunden die Einschaltzeit nicht verlängert. Dies kann man umgehen, indem man nicht on-for-timer verwendet, sondern den Aktor selber verzögert auschaltet und bei weiteren Auslösungen nur die Verzögerung erneut anlegt:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FlurLicht notify Bewegungsmelder_Flur:motion:.* { if (Value(&amp;quot;Licht_Flur1&amp;quot;) eq &amp;quot;off&amp;quot;) { fhem (&amp;quot;set Licht_Flur on ;; define FlurLicht_aus at +00:04:16 set Licht_Flur off&amp;quot;) } else { fhem (&amp;quot;delete FlurLicht_aus ;; define FlurLicht_aus at +00:04:16 set Licht_Flur off&amp;quot;) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Juni 2014 ==&lt;br /&gt;
=== Batteriestatus bei HomeMatic Devices aktivieren===&lt;br /&gt;
Zumindest einige (wenn nicht alle) batteriegespeisten HM-Geräte können Batteriemeldungen senden, tun dies in der normalen Konfiguration aber nicht.&lt;br /&gt;
Dazu muss das Register cyclicInfoMsg auf on gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
Wie man das macht steht z.b. hier&lt;br /&gt;
[[HM-SEC-SC_Tür-Fensterkontakt#Batteriestatus_aktivieren]]&lt;br /&gt;
und hier&lt;br /&gt;
[[HomeMatic_Type_ThreeState]]&lt;br /&gt;
&lt;br /&gt;
== Mai 2014 ==&lt;br /&gt;
=== Dummywert mit aktueller Uhrzeit versehen in anderen Dummy kopieren===&lt;br /&gt;
Der Inhalt von Dummy1 soll erweitert um  Uhrzeit und Datum in Dummy2 kopiert werden (z.b. um die Urzeit der letzten Auslösung einer Alarmanlage anzuzeigen)&lt;br /&gt;
:&amp;lt;code&amp;gt;{ fhem(&amp;quot;set dummy2 &amp;quot; . (Value(&amp;quot;Dummy1&amp;quot;).&amp;quot; &amp;quot;.TimeNow()) )  } &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zwei Dummywerte in einen anderen Dummy kopieren ===&lt;br /&gt;
Der String in Dummy1 soll um den String in Dummy2 erweitert und nach Dummy3 kopiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;{ fhem(&amp;quot;set Dummy3 &amp;quot;.(Value(&amp;quot;Dummy1&amp;quot;)+Value(&amp;quot;Dummy2&amp;quot;))) } &amp;lt;/code&amp;gt;&lt;br /&gt;
(Achtung: &amp;quot;+&amp;quot;  ist Zahlen addieren, &amp;quot;.&amp;quot; ist String konkatenieren) &lt;br /&gt;
&lt;br /&gt;
== April 2014==&lt;br /&gt;
=== Code sparen ===&lt;br /&gt;
Wer Definitionen wie die aus dem März zum [[Trick der Woche#Zuverlässigkeit von FS20 Schaltungen erhöhen|Abfangen von Fehlbedienungen]] verwendet, kann durch eine ELSE Erweiterung auch gleich das Auschalten erledigen.&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TV { if (&amp;quot;$EVENT&amp;quot; eq &amp;quot;on&amp;quot; || &amp;quot;$EVENT&amp;quot; eq &amp;quot;dimup&amp;quot;) { fhem(&amp;quot;set TV on&amp;quot;) } else { fhem(&amp;quot;set TV off&amp;quot;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierdurch schaltet ON oder versehentlich zu langes Drücken (also DIMUP) den Fernseher ein, jeder &#039;&#039;andere&#039;&#039; Tastendruck (also insbesondere die OFF Taste oder zu langes Drücken der OFF Taste -&amp;gt; DIMDOWN) den Fernseher aus.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist, dass die Fernbedienung standardkonfiguriert ist, siehe auch nächster Tip.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration eines FS20 Senders prüfen ===&lt;br /&gt;
Gelegentlich reagieren bestimmte notifys nicht, die von Sendern (Fernbedienungen, Sensoren oder Schaltern) ausgelöst werden sollen. Speziell bei FS20 aber auch bei HomeMatic kann das daran liegen, dass der Sender nicht sendet was man denkt. So gut wie alle FS20 Sender kennen nämlich nicht nur ON und OFF, sondern über ein Dutzend Schaltzustände. Dimmen ist einem noch hinreichend bewusst, es gibt aber auch exotische Dinge wie  Ein-für-Zeitdauer, Ein-auf-alte-Helligkeit, Aus-für-Zeitdauer (nur FS20), Ein-für-Zeitdauer-dannach-alter-Zustand und vieles mehr.&lt;br /&gt;
&lt;br /&gt;
Was also ein Infrarot-Bewegungsmelder bei Auslösung sendet und auch was eine Fernbedienungstaste sendet ist einstellbar. Wenn jetzt zum Beispiel an einer Fernbedienung auf Tastendruck nicht ON sondern Ein-für-Zeitdauer (ON-FOR-TIMER) gesendet wird, wird&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TV:on set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
seltsamerweise nicht auslösen, obwohl die richtige Taste (und diese auch nicht zu lang) gedrückt wurde.&lt;br /&gt;
&lt;br /&gt;
Auch wenn man sich sicher ist, das Richtige in die Fernbedienung/Sensoren einprogramiert zu haben, ist ein einfacher Test immer, dies mit&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV notify TV set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
zu prüfen. Dieses notify löst immer aus, wenn &amp;quot;TV&amp;quot;  &#039;&#039;irgendetwas&#039;&#039; sendet, egal was. (Beachte: Man kann dann den Fernseher aber nicht mehr ausschalten, da auch die Austaste das notify auslöst und zum TV-Aktor nur &amp;quot;on&amp;quot; sendet). Geht die Schaltung jetzt (kann man den Fernseher also jetzt EINschalten), liegt der Verdacht nahe, dass die Konfiguration des Senders / Sensors anders ist, als man denkt. Das Logfile gibt Aufschluss, welcher Befehl tatsächlich empfangen wurde.&lt;br /&gt;
&lt;br /&gt;
=== Alles in FHEM, nichts in der Fernbedienung ===&lt;br /&gt;
Versuche in deiner FHEM Umgebung nicht, das Verhalten von Aktoren durch entsprechende Befehle aus Sensoren oder Fernbedienungen zu steuern. An Besten senden die nur ON und OFF oder DIM, den Rest möglichst immer in FHEM erledigen. &lt;br /&gt;
&lt;br /&gt;
Wer eine Lampe immer für vier Minuten einschalten will, programmiert seinen Schalter (Fernbedienung) also so, das nur &amp;quot;on&amp;quot; gesendet wird und erledigt den Rest in FHEM:&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Schalter notify Schalter set Lampe-on-for-timer 240&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== März 2014==&lt;br /&gt;
=== Zuverlässigkeit von FS20 Schaltungen erhöhen ===&lt;br /&gt;
FS20 Fernbedienungen senden bei Tastendrücken von mehr als 0,4 Sekunden anstatt ON bzw. OFF DIMUP bzw DIMDOWN.&lt;br /&gt;
&lt;br /&gt;
Das führt gelegentlich zu allgemein schlechter Bedienbarkeit (und schlechtem WAF), da 0,4 Sekunden relativ kurz ist und gerne aus versehen länger gedrückt wird. Das ist vor allem problematisch, wenn etwas geschaltet werden soll, was keinen Dimmer hat oder Dimmen nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Eine Konfiguration wie &lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TV:on set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
hat also dann den Nachteil, dass bei versehentlich zu langem Tastendruck das TV nicht angeht. Da die meisten Nutzer unbewusst dazu neigen, bei Misserfolg die selbe Taste erneut aber länger zu drücken (was erneut keinen Erfolg zeigt) ist Frustration zu erwarten.&lt;br /&gt;
&lt;br /&gt;
Es kann daher speziell bei nicht dimmbaren Aktoren von Vorteil sein, auch dimmen abzufangen, z.b. durch eine zweite zusätzliche Definition:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_dimup notify TV:dimup set TV on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist in der Regel einfacher, einige dieser zusätzlichen Definitionen einzufügen, als allen Bedienern des Systems zu erklären, dass man keinesfalls länger als 0,4 Sekunden drücken darf.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch beide Befehle in einer Definition durch Perlbefehle {} abfangen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_TV_on notify TV { if (&amp;quot;$EVENT&amp;quot; eq &amp;quot;on&amp;quot; || &amp;quot;$EVENT&amp;quot; eq &amp;quot;dimup&amp;quot;) { fhem(&amp;quot;set TV on&amp;quot;) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Andere Möglichkeiten vergleiche: [[Trick der Woche#notify durch mehrere Ereignisse auslösen lassen|Notify durch mehrere Ereignisse auslösen lassen]]&lt;br /&gt;
&lt;br /&gt;
== Februar 2014==&lt;br /&gt;
=== Sequence nutzen ===&lt;br /&gt;
Man kann Aktionen statt mit einem Tastedruck auch mit einer Sequenz von Tastendücken auslösen. Das Format des Befehle ist:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; sequence &amp;lt;re1&amp;gt; &amp;lt;timeout1&amp;gt; &amp;lt;re2&amp;gt; [&amp;lt;timeout2&amp;gt; &amp;lt;re3&amp;gt; ...] &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei &amp;lt;re1&amp;gt; ...&amp;lt;re_n&amp;gt; die Aktionen sind und &amp;lt;timeout_n&amp;gt; der maximale Abstand der Tastendrücke in Sekunden.&lt;br /&gt;
&lt;br /&gt;
Angenommen, man wolle z.B. eine Lampe dann anschalten, wenn man zuerst Taste1 EIN, dann Taste2 AUS und dann wieder Taste1 EIN einer Fernbedienung drückt, könnte das konkret so aussehen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define MeineLampenSequenz1 sequence Btn1:on 0.5 Btn2:off 0.5 Btn1:on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zwischen jedem der Tastendrücke darf eine halbe Sekunde Abstand sein. Diese Definition selbst löst die Lampe nicht aus, sondern definiert nur wie die Sequenz aussehen soll. Um die Lampe bei erfolgreicher Betätigung der Sequenz auch einzuschalten, bedarf es zusätzlich etwas wie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define MeineLampe notify MeineLampenSequenz1:trigger set Lampe on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sequence kann man gut nutzen, um mit einer Fernbedienung mehr Funktionen zu schalten als Tasten zur Verfügung stehen. Ebenso könnte man damit simple Codeschlösser für Alarmanlagen bauen, z.b. um eine Anlage auszuschalten, wenn eine bestimmte Abfolge von Tasten gedrückt wird.&lt;br /&gt;
&lt;br /&gt;
Je nach Funksystem nimmt die Zuverlässigkeit aber rasch ab. Angenommen im Bereich FS20 (das System ist etwas unzuverlässiger ist als z.b. HomeMatic) seien 95% aller Funktsignale ungestört übertragbar, dann würden in der Praxis von 100 Tastendrücken an einer Fernbedienung 95x Erfolg zeigen und 5x fehlschlagen; das ist sicher tolerabel. &lt;br /&gt;
&lt;br /&gt;
Bei einer Sequenzlänge von nur 4 Tasten würde die kombinierte Erfolgsquote der Sequenz jedoch nur noch ca. 80% sein, zum Ausschalten einer Alarmanlage vermutlich bereits unpraktisch.&lt;br /&gt;
&lt;br /&gt;
== Januar 2014==&lt;br /&gt;
===isday===&lt;br /&gt;
Bekanntlich kann man  mit &amp;quot;isday&amp;quot; leicht testen ob es draussen hell ist oder nicht. isday ist eine Funktion des (automatisch geladenen) 99_SUNRISE_EL.pm Moduls das auch sunset und sunrise enthält.&lt;br /&gt;
&lt;br /&gt;
Problematisch bei isday ist die fehlende Möglichkeit, Sonnenaufgang und Untergang einzustellen (zumindest wenn man nicht 99_SUNRISE_EL.pm verändern will): isday ist wahr, wenn die Sonne im gegebenen Breitengrad sichtbar ist. Wenn örtliche Gegebenheiten eine Anpassung erfordern, kann man sich auch ein eigenes isday basteln, in dem man sunrise und sunset verwendet und dieses mit getrennten offsets versieht.&lt;br /&gt;
&lt;br /&gt;
Zuerst definiert man sich eine Variable (&amp;quot;dummy&amp;quot;) der anstelle isday eingesetzt werden soll, z.b.:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define Tageslicht dummy &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann wird diese mit sunset und sunrise befüllt:&lt;br /&gt;
&lt;br /&gt;
 define SetDummy1 at *{sunset(-3600)} set Tageslicht hell &lt;br /&gt;
 define SetDummy2 at *{sunrise(+1800)} set Tageslicht dunkel &lt;br /&gt;
&lt;br /&gt;
Jetzt kann für jeden Wechsel ein eigener Offset gewählt werden, im Beispiel 3600 Sekunden vor Sonnenuntergang und 1800 Sekunden nach Sonnenaufgang. Anstatt das Dummy &amp;quot;Tageslicht&amp;quot; mit den Werten &amp;quot;hell/dunkel&amp;quot; zu befüllen, kann natürlich auch 1/0 oder &amp;quot;Tag/Nacht&amp;quot; etc. verwendet werden, je nach dem was bei der Anwendung besser passt.&lt;br /&gt;
&lt;br /&gt;
Für höhere Ansprüche könnte hingegen das Twiglight-Modul verwendet werden, das Dämmerungsstufen kennt.&lt;br /&gt;
&lt;br /&gt;
===Struktur von &amp;quot;else if&amp;quot; Schleifen===&lt;br /&gt;
 define ... notify ... {\&lt;br /&gt;
  if ... {\&lt;br /&gt;
   fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  elsif {\&lt;br /&gt;
   if ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  elsif {\&lt;br /&gt;
   if ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
  else {\&lt;br /&gt;
   if ... {\&lt;br /&gt;
    fhem (&amp;quot;... ;; ...&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
 }}}}&lt;br /&gt;
&lt;br /&gt;
Achtung: es muss tatsächlich &amp;quot;elsif&amp;quot; heissen und nicht &amp;quot;elseif&amp;quot; oder &amp;quot;else if&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Dezember 2013==&lt;br /&gt;
===notify durch mehrere Ereignisse auslösen lassen===&lt;br /&gt;
Bekanntermassen löst&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
aus, wenn irgendein Ereignis vom Sender &amp;quot;MeinSchalter&amp;quot; eintrifft.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wird das notify jedoch nur ausgelöst, wenn dieses Ereignis eine &amp;quot;on&amp;quot; ist.&lt;br /&gt;
Wenn man aber möchte, das z.B. &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; auslöst (um etwa Dim-Befehle auszuschliessen) kann dies wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:(on|off) …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klammern sind wichtig, vergleiche eine Lösung, bei der zwei Sender alternativ das notify auslösen können:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on|MeinAndererSchalter:on …&amp;lt;code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Selbstverständlich geht z.B. auch folgendes:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define irgendwas notify MeinSchalter:on|MeinAndererSchalter …&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird ausgelöst wenn &amp;quot;MeinSchalter&amp;quot; das Ereignis &amp;quot;on&amp;quot; liefert oder &amp;quot;MeinAndererSchalter&amp;quot; irgendein Ereignis&lt;br /&gt;
&lt;br /&gt;
=== Aktoren über mehrere Funkschnittstellen ansprechen ===&lt;br /&gt;
Falls man mehrere Funkschnittstellen zur Reichweitenverlängerung hat (CUL / CUNO etc), und ein Aktor von beiden Funkschnittstellen in etwa gleich (schlecht) erreichbar ist, mag der Wunsch aufkommen, einen Funkbefehl über beide Schnittstellen auszusenden. Dies ist bei Funkprotokollen möglich, die kein echtes Pairing der Aktoren an die Funkschnittstelle erfordern, also z.b. FS20 oder Intertechno, nicht jedoch bei HomeMatic.&lt;br /&gt;
&lt;br /&gt;
Problematisch ist aber, dass die Funkschnittstelle über IODev eindeutige je Aktor festgelegt werden muss, eine Zuordnung mehrerer IODevs ist nicht vorgesehen.&lt;br /&gt;
(wenn man IODev nicht setzt, wird per default die LETZTE definiert Schnittstelle verwendet)&lt;br /&gt;
&lt;br /&gt;
Diess Problem kann mit einem Trick aber umgangen werden. Und zwar legt man den Aktor 2x mit gleicher Adresse aber abweichenden Namen und IOdevs an, z.b. so:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 define brenner_CUL1 FS20 11114244 11&lt;br /&gt;
 attr brenner_CUL1 IODev CUL1&lt;br /&gt;
 attr brenner_CUL2 room Keller&lt;br /&gt;
&lt;br /&gt;
 define brenner_CUL2 FS20 11114244 11&lt;br /&gt;
 attr brenner_CUL2 IODev CUL2&lt;br /&gt;
 attr brenner_CUL2 room Keller&lt;br /&gt;
&lt;br /&gt;
Ein Befehl der Art:&lt;br /&gt;
&lt;br /&gt;
 set brenner_CUL1,brenner_CUL2 on&lt;br /&gt;
&lt;br /&gt;
sendet den ON Befehl für den FS20 Aktor 11114244 11  jetzt tatsächlich über beide CULs aus!&lt;br /&gt;
&lt;br /&gt;
Achtung: Wenn die Schnittstellen gleichschnell angebunden sind, sollte vermutlich der [[Sendpool]] verwendet werden, da die Aussendungen sonst tatsächlich gleichzeitig erfolgen könnten und sich dann gegenseitig stören würden.&lt;br /&gt;
&lt;br /&gt;
=== Retrycount bei FHTs ist überflüssig===&lt;br /&gt;
Das von der Funktion &#039;&#039;autocreate&#039;&#039; älterer FHEM Versionen beim Anlegen von FHT80 Heizungsreglern voreingetragene attribute &amp;quot;retrycount&amp;quot; hat in den allermeisten Fällen keine Wirkung, da es NUR greift, wenn man als Funkschnittstelle eine FHZ1X00PC verwendet und dann den Softbuffer einschaltet. Selbst wenn man diese Konfiguration nutzt, will gut überlegt werden, ob die Wirkung postiv ist: Bei ungenügender Empfangslage vergrössert es Kommunikationsprobleme eventuell sogar.&lt;br /&gt;
&lt;br /&gt;
Es kann also in der Regel entfernt oder auf den Wert &amp;quot;1&amp;quot; gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
 define Heizung_Bad FHT 060d&lt;br /&gt;
 attr Heizung_Bad retrycount 3       &amp;lt;=== Diese Zeile entfernen&lt;br /&gt;
&lt;br /&gt;
Siehe auch:[[Kommunikationsprobleme mit FHT]]&lt;br /&gt;
&lt;br /&gt;
== November 2013 ==&lt;br /&gt;
=== FS20 Funksteckdose sicherer schalten===&lt;br /&gt;
Seltsamerweise kommt es vor, das FS20 Aktoren - insbesondere die FS20 Funksteckdose - an der Grenze der Funkreichweite bestimmte Befehle eines Typs empfängt, andere aber nicht. Z.B. lässt sich die FS20 Steckdose zwar immer einschalten, aber oft nicht mehr aus (oder umgekehrt).&lt;br /&gt;
&lt;br /&gt;
Gelegentlich kann man die Zuverlässigkeit erhöhen, indem man statt dem nicht funktionierenden Befehl das Gegenteil mit &amp;quot;for-timer 1&amp;quot; verwendet.&lt;br /&gt;
&lt;br /&gt;
Im Fall, dass eine FS20 Steckdose sich also einwandfrei EINschalten lässt:&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
aber oft ein AUSschalten mittels&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA off&amp;lt;/code&amp;gt;&lt;br /&gt;
nicht funktioniert, kann man versuchen die Dose anstelle mit &amp;quot;off&amp;quot; mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set SteckdoseA on-for-timer 1&amp;lt;/code&amp;gt;&lt;br /&gt;
auszuschalten.&lt;br /&gt;
&lt;br /&gt;
Analog kann man mit off-for-timer arbeiten, wenn sich Aktoren nicht einschalten lassen, ausschalten aber geht.&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Trick funtioniert ausdrücklich nur, wenn der &amp;quot;on/off-for-timer&amp;quot; Befehl im Aktor selber abgebildet wird. Daher ist der Trick vermutlich nicht auf andere Funksysteme übertragbar.&lt;br /&gt;
&lt;br /&gt;
=== Mehrere Geräte zugleich schalten===&lt;br /&gt;
Ein Ereignis soll mehrere Geräte schalten:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1 on;;set Lampe2 on;;set FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aus Übersichtlichkeitsgründen können vor und nach den Semikolons auch Leerzeichen eingefügt werden (obwohl in einigen Dokumentation behauptet wird, dies dürfe man nicht machen):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1 on ;; set Lampe2 on ;; set FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn der Schaltbefehl bei allen Geräten gleich ist, kann man wie folgt zusammenfassen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define act_on_Bewegungsmelder notify Bewegungsmelder set Lampe1,Lampe2,FunksteckdoseA on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Komma wird nicht [[Escapen in Perlbefehlen|escaped]] (verdoppelt), hier darf tatsächlich KEIN Leerzeichen vor oder nach dem Komma eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== Logfileinträge unterdrücken===&lt;br /&gt;
Das Attribute &amp;quot;verbose 0&amp;quot; verhindert, dass das Gerät Logfileinträge erzeugt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 define Funksteckdose FS20 22224222 01&lt;br /&gt;
 attr Funksteckdose verbose 0&lt;br /&gt;
&lt;br /&gt;
===FHT Lazy Mode benutzen===&lt;br /&gt;
Es gibt wenig Gründe, den FHT &amp;quot;Lazy Mode&amp;quot; nicht zu verwenden&lt;br /&gt;
 define Heizung_Bad FHT 060d&lt;br /&gt;
 attr Heizung_Bad lazy&lt;br /&gt;
&lt;br /&gt;
Dieser sorgt dafür, dass Temperaturänderungen (genau genommen alle Änderungen, auch z.B. date) nur übertragen werden, wenn sie nicht sowieso schon am FHT eingestellt sind und veringern die Funklast dadurch deutlich. &lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[Kommunikationsprobleme mit FHT]]&lt;br /&gt;
&lt;br /&gt;
== Oktober 2013 ==&lt;br /&gt;
=== Zuverlässigkeit von Wiedereinschalten erhöhen ===&lt;br /&gt;
Speziell bei FS20 Aktoren ist wegen des fehlenden Rückkanals nicht leicht erkennbar, ob ein Einschaltbefehl Wirkung gezeigt hat. Das hat ganz schlechten WAF, wenn man z.B. mit einem FS20 Aktor eine Heizung ausschaltet und das Wiedereinschalten nach z.B. einer Stunde nicht klappt.&lt;br /&gt;
&lt;br /&gt;
Hier empfiehlt es sich, das Ausschalten mittels &lt;br /&gt;
:&amp;lt;code&amp;gt;set Heizungs_schalter off-for-timer 3584&amp;lt;/code&amp;gt;   (= fast eine Stunde)&lt;br /&gt;
zu erledigen. Da bei FS20 der off-for-timer Befehl im Aktor abgewickelt wird (und nicht durch FHEM), schaltet sich der Aktor auch dann garantiert wieder ein, wenn Fhem abstürzt, eine Funkstörung vorliegt oder ähnliches.  Bei Bedarf kann der Befehl off-for-timer zur  Verlängerung der Ausschaltzeit wiederholt werden. Dies kann z.B. nötig sein, wenn die Ausschaltung länger als 4,5 Stunden (15360 Sekunden, der Maximalwert des Timers) dauern soll.&lt;br /&gt;
&lt;br /&gt;
Achtung: dieser Trick funktioniert nur, wenn der Aktor &amp;quot;off-for-timer&amp;quot; selbst beherrscht. FS20 Geräte können das, HomeMatic können aber nur &amp;quot;on-for-timer&amp;quot;. Man kann off-for-timer mit HomeMatic trotzdem verwenden, aber in diesem Fall sendet Fhem den Einschaltbefehl nach der Timerzeit. InterTechno, RSL etc, können gar keinen Timer, hier sendet Fhem immer 2 Befehle im passenden Abstand.&lt;br /&gt;
&lt;br /&gt;
=== FS20 Timerzeiten ===&lt;br /&gt;
FS20 Timer werden in Sekunden angegeben. Es sind jedoch nicht alle Werte einstellbar. Da der Timer Wert in 7 Bit übertragen werden muss, sind nur 128 Werte möglich. Um mit diesen Werten im unteren Bereich möglichst fein aufzulösen, andererseits aber auch lange Zeiten zu ermöglichen, ist die Verteilung nicht linear. Einstellbar sind folgende Zeiten in Sekunden;&lt;br /&gt;
&lt;br /&gt;
0,25  0,5  0,75  1  1,25  1,5  1,75  2  2,25  2,5  2,75  3  3,25  3,5  3,75   &lt;br /&gt;
4  4,5  5  5,5  6  6,5  7  7,5  8  9  10  11  12  13  14  15  16  18  20  22   &lt;br /&gt;
24  26  28  30  32  36  40  44  48  52  56  60  64  72  80  88  96  104  112   &lt;br /&gt;
120  128  144  160  176  192  208  224  240  256  288  320  352  384  416   &lt;br /&gt;
448  480  512  576  640  704  768  832  896  960  1024  1152  1280  1408   &lt;br /&gt;
1536  1664  1792  1920  2048  2304  2560  2816  3072  3328  3584  3840  4096   &lt;br /&gt;
4608  5120  5632  6144  6656  7168  7680  8192  9216  10240  11264  12288   &lt;br /&gt;
13312  14336  15360 &lt;br /&gt;
(etwas übersichtlicher formatiert auch [[FS20 Allgemein#ON/OFF Befehle mit Time Parameter|hier]]).&lt;br /&gt;
 &lt;br /&gt;
Andere Zeiten werden von Fhem gerundet. Ein neues Setzen des Timer für FS20 löscht den alten Wert.&lt;br /&gt;
&lt;br /&gt;
===Butterflecken in Wollpullovern===&lt;br /&gt;
Butterflecken in Wollpullovern können leicht durch grossflächiges Aufstreichen von Teer beseitigt werden.&lt;/div&gt;</summary>
		<author><name>Eppi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SONOS&amp;diff=5560</id>
		<title>SONOS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SONOS&amp;diff=5560"/>
		<updated>2014-03-26T17:33:18Z</updated>

		<summary type="html">&lt;p&gt;Eppi: /* Hinweis für Debian-Systeme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieses Anwendungsbeispiel soll den Einstieg in die Steuerung der heimischen Zoneplayer der Firma [http://www.sonos.com Sonos] erleichtern. Es werden die Verwendung und Einrichtung der dazugehörenden 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;
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; border: 1px solid #dfdfdf; padding: 0 1em 1em 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;
Diese Module sind &#039;&#039;&#039;nicht&#039;&#039;&#039; im offiziellen Release von FHEM enthalten. Sie müssen mittels des Thirdparty-Updatemechanismus nachinstalliert werden.&lt;br /&gt;
Dabei sind trotzdem die Vorbedingungen bzgl. der Perl-Installation einzuhalten, da diese Update-Installation nur im Rahmen von FHEM erfolgt.&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&lt;br /&gt;
*Steuern der ZonePlayer: Play, Pause, Nächster Titel, Vorheriger Titel, Lautstärke Lauter/Leiser (auch als Rampe), Stummschalten&lt;br /&gt;
*Alle Player auf einen Befehl hin stoppen oder pausieren lassen&lt;br /&gt;
*Einstellen und Abfragen der Abspielparameter Repeat, 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 und Speichern von Playlisten (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;
*Erzeugen und temporäres Abspielen von Sprachdurchsagen auf Basis von eingegebenen Texten&lt;br /&gt;
**Wird standardmäßig über die Google-Übersetzungsmaschine realisiert&lt;br /&gt;
**Kann auch über eine eigenständige, lokale Installation realisiert werden&lt;br /&gt;
*Auslesen der verfügbaren gespeicherten Playlisten und Radiofavoriten&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;
*Erzeugen von Events nach festgelegten Tastensequenzen (am Player)&lt;br /&gt;
*Umbenennen der Zonen und festlegen der Zonenicons&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 Player nach den Zonennamen und der jeweiligen Funktion des Players innerhalb der Paarungs-Zone.&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).&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;
&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 Sonos SONOS localhost:4711 30&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.&lt;br /&gt;
Natürlich kann man das nach dem Anlegen einfach umbenennen.&lt;br /&gt;
&lt;br /&gt;
&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:&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 InfoSummarize2&lt;br /&gt;
attr Sonos_Wohnzimmer webCmd Play:Pause:Previous:Next:VolumeD:VolumeU:MuteT&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;
Des Weiteren wird automatisch ein Weblink mit angelegt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define AlbumArt_Wohnzimmer weblink image fhem/icons/SONOSPLAYER/Sonos_Wohnzimmer_AlbumArt&lt;br /&gt;
attr AlbumArt_Wohnzimmer room Sonos&lt;br /&gt;
attr AlbumArt_Wohnzimmer htmlattr width=&amp;quot;200&amp;quot;&lt;br /&gt;
attr AlbumArt_Wohnzimmer group Wohnzimmer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird in der Raumansicht direkt über dem SonosPlayer-Device das Cover des aktuellen Titels angezeigt.&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;
== Hardwarevoraussetzungen ==&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&lt;br /&gt;
*Raspberry Pi, Default-Perl&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;
&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;
&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 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;&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.: &amp;lt;pre&amp;gt;sudo mkdir /mnt/SonosSpeak&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;
*Folgende Zeilen 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, kann vielleicht folgendes helfen:&lt;br /&gt;
**Sicherstellen, daß in der &#039;&#039;Global&#039;&#039;-Sektion der Parameter &#039;&#039;Security&#039;&#039; auf &#039;&#039;Share&#039;&#039; steht (oder gar nicht erst definiert wurde):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
  security = share&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Samba-Server neustarten: &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;
&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;
=== Installation mittels FHEM-Updatemechanismus ===&lt;br /&gt;
Um dieses Modul über den Update-Mechanismus von FHEM zu installieren, muss folgender Befehl im Eingabefeld (oder auf der Telnet-Konsole) eingegeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;update thirdparty http://fhem.lmsoft.de/sonos sonos&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für einen Vorabcheck, was installiert werden würde, kann man folgendes eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;update thirdparty http://fhem.lmsoft.de/sonos sonos check&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Perl-Installation korrekt erweitert wurde, bzw. bereits erweitert war, sollte das Modul nach einem Neustart zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Living on the bleeding edge ====&lt;br /&gt;
Da ich vor einem Releasetermin natürlich einiges entwickelt habe, und dies natürlich auch selber teste, habe ich dafür einen Development-Server eingerichtet.&lt;br /&gt;
Dieser kann u.U. sinnvollerweise auch von anderen als Installationsquelle verwendet werden, da er aktuelle Fehlerbereinigungen oder neue Features und Konzepte enthält, die man gerne vorab sehen möchte.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039;:&lt;br /&gt;
Diese Version muss nicht immer und zwangsläufig besser sein! ich gebe mir Mühe, bin aber auch nur ein Mensch :-)&lt;br /&gt;
&lt;br /&gt;
Folgendes muss für die Installation eingegeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;update thirdparty http://fhem.lmsoft.de/sonos_dev sonos&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Installation ===&lt;br /&gt;
Dieser Part ist nur solange interessant, wie das Modul (noch) nicht offiziell ist.&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb ist das Modul [http://perlupnp.sourceforge.net/ PerlUPnP] notwendig.&lt;br /&gt;
&lt;br /&gt;
Folgende Dateien sind nötig:&lt;br /&gt;
*00_SONOS.pm&lt;br /&gt;
*21_SONOSPLAYER.pm&lt;br /&gt;
*2 Dateien der PerlUPnP-Library&lt;br /&gt;
*Dateien für MP3-Tags bei der Sprachausgabe (Wenn nicht vorhanden, fehlt nur die Funktionalität, das Modul sollte aber dennoch lauffähig sein)&lt;br /&gt;
*Die unter &#039;&#039;Softwarevoraussetzungen&#039;&#039; genannten Perlmodule&lt;br /&gt;
&lt;br /&gt;
Die beiden SONOS-Perlmodule müssen einfach in das Verzeichnis &amp;lt;code&amp;gt;FHEM&amp;lt;/code&amp;gt; kopiert werden (wie alle anderen FHEM-Module auch).&lt;br /&gt;
&lt;br /&gt;
Die PerlUPnP-Library muss komplett in das Verzeichnis &amp;lt;code&amp;gt;FHEM/lib/&amp;lt;/code&amp;gt; abgelegt werden. Dabei muss das Verzeichnis &amp;lt;code&amp;gt;UPnP&amp;lt;/code&amp;gt; genannt werden. &lt;br /&gt;
Es werden für den Betrieb nicht alle Dateien des Standard-Pakets benötigt, sondern nur zwei .pm Dateien. &amp;lt;br /&amp;gt;&lt;br /&gt;
Die resultierende Ordnerstruktur (inkl. Dateien von PerlUPnP) lautet dann wie folgt:&lt;br /&gt;
*FHEM/lib&lt;br /&gt;
*FHEM/lib/UPnP&lt;br /&gt;
*FHEM/lib/UPnP/Common.pm&lt;br /&gt;
*FHEM/lib/UPnP/ControlPoint.pm&lt;br /&gt;
&lt;br /&gt;
Die Dateien für die MP3-Tags müssen ebenfalls in das Verzeichnis &amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt; kopiert werden. Diese wird nur bei manchen Dateien für die Zwischendurchsage benötigt, da Sonos nicht immer eine Laufzeit mitliefert, bzw. für die generierten Sprachdurchsagen, da dort die Informationen für die Anzeige im ZonePlayer gesetzt werden.&amp;lt;br /&amp;gt;Die Laufzeit z.B. wird für die Pausenberechnung aber gebraucht, und muss dementsprechend auf anderem Wege ermittelt werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die resultierende Ordnerstruktur lautet dann wie folgt:&lt;br /&gt;
*FHEM/lib/&lt;br /&gt;
*FHEM/lib/MP3&lt;br /&gt;
*FHEM/lib/MP3/Tag.pm&lt;br /&gt;
*FHEM/lib/MP3/Info.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag&lt;br /&gt;
*FHEM/lib/MP3/Tag/File.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/LastResort.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/ImageExifTool.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/CDDB_File.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/ID3v2_Data.pod&lt;br /&gt;
*FHEM/lib/MP3/Tag/ImageSize.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/ID3v1.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/ParseData.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/Cue.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/ID3v2.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/Inf.pm&lt;br /&gt;
*FHEM/lib/Normalize&lt;br /&gt;
*FHEM/lib/Normalize/Text&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields.pm&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/Music_Fields-rus.lst&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/G_Gershwin.comp&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/A_Dvor_k.comp&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/J_Brahms.comp&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/L_van_Beethoven.comp&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/A_Schnittke.comp&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/D_Shostakovich.comp&lt;br /&gt;
*FHEM/lib/Encode&lt;br /&gt;
*FHEM/lib/Encode/transliterate_win1251.pm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von FHEM kann das Modul wie beschrieben verwendet werden.&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;
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;
*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;
*Wenn man das Problem hat, daß 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 empfehlenswert, daß 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;
&lt;br /&gt;
===  Changelog ===&lt;br /&gt;
*2.5 (07.03.2014):&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 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;
*2.4 (31.12.2013):&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;
*2.3 (2.12.2013):&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;
*2.2 (12.10.2013):&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;
*2.1:&lt;br /&gt;
**Neuen Befehl &#039;CurrentPlaylist&#039; eingeführt&lt;br /&gt;
*2.0:&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;
*1.13:&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;
*1.12:&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;
*1.11:&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;
*1.10:&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;
*1.9:&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;
*1.8:&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;
*1.7:&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;
*1.6:&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;
*1.5:&lt;br /&gt;
**PlayURI, PlayURITemp und AddURIToQueue hinzugefügt (siehe Doku im Wiki)&lt;br /&gt;
*1.4:&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;
*1.3:&lt;br /&gt;
**StopHandling prüft nun auch, ob die Referenz noch existiert&lt;br /&gt;
*1.2:&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;
*1.1:&lt;br /&gt;
**Ping-Methode einstellbar über Attribut &#039;pingType&#039;&lt;br /&gt;
*1.0:&lt;br /&gt;
**Initial Release&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;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;
*&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;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;
&lt;br /&gt;
&lt;br /&gt;
=== Attribute von SONOS ===&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;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 [http://www.fhemwiki.de/wiki/Sonos_Anwendungsbeispiel#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;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;
*&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.&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;
&lt;br /&gt;
&lt;br /&gt;
=== Get-Befehle an SONOS ===&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;
*&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.&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;PauseAll&amp;lt;/code&amp;gt;: Pausiert die Wiedergabe in allen Zonen.&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;
*Grundlegendes&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;roomName&amp;lt;/code&amp;gt;: Originalname des ZonePlayers. 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;playerType&amp;lt;/code&amp;gt;: Typbezeichnung des ZonePlayer. z.B. &amp;quot;ZP90&amp;quot;&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-Komfigurationen aber auch RR (für Right-Rear) oder LR (für Left-Rear).&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;softwareRevision&amp;lt;/code&amp;gt;: Version der installierten Software. z.B. &amp;quot;3.8.4&amp;quot;&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;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;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;
**&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;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;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;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;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;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;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;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;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;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;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;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;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;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;ZonePlayerUUIDsInGroup&amp;lt;/code&amp;gt;: Eine Liste der in der aktuellen Gruppe befindlichen Zoneplayer.&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;
*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;currentOriginalTrackNumber&amp;lt;/code&amp;gt;: Nummer des aktuellen Titels bezogen auf das Album&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;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;currentSender&amp;lt;/code&amp;gt;: Senderbezeichnung, wenn es ein Radiostram 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;: Zusatzinforationen 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;
*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;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;
*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;
*Infos zum Gesamtstatus&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&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;
&lt;br /&gt;
&lt;br /&gt;
=== Attribute von SONOSPLAYER ===&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;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;
*&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;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;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;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;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,CrossfadeMode,&amp;lt;br /&amp;gt;&lt;br /&gt;
	Balance,HeadphoneConnected,SleepTimer,Presence,RoomName,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;
*&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;
*&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;
*&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;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;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;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, daß 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;
&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;
*&amp;lt;code&amp;gt;CurrentTrackPosition&amp;lt;/code&amp;gt;: Liefert die aktuelle Zeitposition im Lied&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;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;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;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;
&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;
*&amp;lt;code&amp;gt;Play&amp;lt;/code&amp;gt;: Startet die Wiedergabe&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;Stop&amp;lt;/code&amp;gt;: Stoppt die Wiedergabe&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;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;LoadPlaylist &amp;lt;Playlistname&amp;gt; [ListeVorherLeeren]&amp;lt;/code&amp;gt;: Lädt die benannte Playliste in die aktuelle Abspielliste. Der Parameter kann/muss URL-Encoded 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;: 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;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 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;
*&amp;lt;code&amp;gt;EmptyPlaylist&amp;lt;/code&amp;gt;: Löscht die aktuelle Abspielliste&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;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 werden um auch Spezialzeichen zu ermöglichen.&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.&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;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;
*&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;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;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;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;SleepTimer&amp;lt;/code&amp;gt;: Legt den aktuellen SleepTimer fest. Der Wert muss ein kompletter Zeitstempel sein (HH:MM:SS). Zum Deaktivieren darf der Zeitstempel nur Nullen enthalten oder das Wort &#039;off&#039;.&lt;br /&gt;
*&amp;lt;code&amp;gt;DailyIndexRefreshTime&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;VolumeD&amp;lt;/code&amp;gt;: Verringert die Lautstärke um 10 Einheiten.&lt;br /&gt;
*&amp;lt;code&amp;gt;VolumeU&amp;lt;/code&amp;gt;: Erhöht die Lautstärke um 10 Einheiten.&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;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;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;VolumeRestore&amp;lt;/code&amp;gt;: Stellt die mittels VolumeSave gespeicherte Lautstärke wieder her.&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&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;
*&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 AV-Eingang des gewählten Zoneplayer-Device als Wiedergabestrom gewählt.&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;: Zum Ermitteln der Liedlänge wird u.U. eine zusätzliche Library verwendet (Wenn die Info nicht vom SonosPlayer bereitgestellt wird): &amp;lt;code&amp;gt;MP3::Info&amp;lt;/code&amp;gt;. Diese Library muss zusätzlich in das FHEM-Lib-Verzeichnis kopiert werden.&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;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;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;: In dem generierten MP3 wird ein ID3-Tag eingetragen, in dem die Umlaute wohl leider nicht sauber ankommen. Deswegen ist im Sonos-Controller die Anzeige dieser Umlaute bei den Sprachdurchsagen auch nicht korrekt.&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 [http://www.fhemwiki.de/wiki/Sonos_Anwendungsbeispiel#Attribute_von_SONOS Attribute von SONOS]).&lt;br /&gt;
**Mögliche Sprachparameter 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, erhält man eine Fehlermeldung im Log: &amp;quot;&#039;&#039;404 Not found&#039;&#039;&amp;quot;. Leider erhielt ich in meinen Tests unterschiedliche Ergebnisse bzgl. der verwendbaren Länge (ca. 100 Zeichen). Einfach probieren.&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;Alarm &amp;lt;Create|Update|Delete&amp;gt; &amp;lt;ID&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 den Alarm mit der übergebenen ID und den angegebenen Hash-Daten.&lt;br /&gt;
**&#039;&#039;&#039;Delete&#039;&#039;&#039;: Löscht den Alarm-Eintrag mit der übergebenen ID.&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;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;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;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 def 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, für den man den Aufruf durchführt.&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, 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;
*&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;Reboot&amp;lt;/code&amp;gt;: Führt für den Zoneplayer einen Neustart durch.&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;
&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|&lt;br /&gt;
	CrossfadeMode|Balance|HeadphoneConnected|SleepTimer|Presence|RoomName|SaveRoomName|&lt;br /&gt;
	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;
&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;
&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 wegen FHEM-Notify auf &amp;quot;&amp;lt;code&amp;gt;%%20&amp;lt;/code&amp;gt;&amp;quot; kodiert werden muss). 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;
=== 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;
&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;
&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.&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, daß 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, daß es etwas länger dauert (bei mir 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;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Code Snippets]]&lt;br /&gt;
[[Category:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Eppi</name></author>
	</entry>
</feed>