SONOS: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
(Allgemein neu hochgeladen, wegen Crash. Neue Funktionen eingebaut.) |
||
Zeile 3: | Zeile 3: | ||
<center>'''! Achtung | <div style="margin: 0; margin-top:10px; border: 1px solid #dfdfdf; padding: 0 1em 1em 1em; background-color:#fff0e0;"> | ||
<center>'''! Achtung !'''</center> | |||
Diese Module sind noch '''keine''' offiziellen FHEM-Module und sind noch nicht direkt verfügbar. Sie müssen momentan noch von Hand installiert werden. | Diese Module sind noch '''keine''' offiziellen FHEM-Module und sind noch nicht direkt verfügbar. Sie müssen momentan noch von Hand installiert werden. | ||
</div> | |||
== Kurzüberblick == | == Kurzüberblick == | ||
Hier soll nur ein kurzer Überblick über die mittlerweile doch recht umfangreichen Möglichkeiten geboten werden: | Hier soll nur ein kurzer Überblick über die mittlerweile doch recht umfangreichen Möglichkeiten geboten werden: | ||
*Automatisches Erkennen aller ZonePlayer im lokalen Netzwerk | |||
*Automatische Aktualisierung aller aktuellen Titelinformationen innerhalb von FHEM | |||
**Dabei wird für jede veränderte Information ein Event erzeugt, man kann also dediziert darauf reagieren | |||
**Es können auch verschiedene Zusammenfassungen der bestehenden Informationen zusammengestellt werden | |||
*Anzeige des aktuellen Covers als Weblink | |||
*Steuern der ZonePlayer: Play, Pause, Nächster Titel, Vorheriger Titel, Lautstärke Lauter/Leiser, Stummschalten | |||
*Einstellen und Abfragen der Abspielparameter Repeat, Shuffle und CrossfadeMode | |||
*Festlegen einer minimalen und maximalen Lautstärke für jeden ZonePlayer (getrennt zwischen Normalbetrieb und Kopfhörernutzung) | |||
*Laden und Speichern von Playlisten | |||
*Abspielen beliebiger Titel (auch von Freigaben, die nicht von Sonos indiziert wurden) | |||
*Abspielen beliebiger Radiostationen über deren HTTP-Link | |||
*Hinzufügen beliebiger Titel und Radiostationen zur aktuellen Abspielliste | |||
*Temporäres Abspielen von Dateien, mit nachfolgender Wiederherstellung des vorherigen Titels inkl. genauer Position im Titel und der Lautstärke | |||
*Erzeugen und temporäres Abspielen von Sprachdurchsagen auf Basis von eingegebenen Texten (wird über die Google-Übersetzungsmaschine realisiert) | |||
*Auslesen der verfügbaren gespeicherten Playlisten und Radiofavoriten | |||
*Erzeugung und Bearbeitung von Alarmen, sowie Event bei Veränderung der Alarme duch andere Controller | |||
*Setzen des Sleeptimer inkl. Fhem-Event bei Veränderung durch andere Controller und Ablauf des Timers | |||
== Einbindung von Sonos in FHEM == | |||
Die Einbindung erfolgt über die beiden Module '''SONOS''' und '''SONOSPLAYER'''. Dabei ist Hauptsächlich das Modul '''SONOS''' einzurichten. Alle Zoneplayer werden automatisch erkannt, und dann entsprechend angelegt: | |||
<pre>define Sonos SONOS</pre> | |||
Der Name dieses Devices ist automatisch das Namensprefix beim Anlegen der SonosPlayer. In diesem Fall werden alle erkannten Zoneplayer mit dem Prefix "<code>Sonos_</code>" anfangen. | Der Name dieses Devices ist automatisch das Namensprefix beim Anlegen der SonosPlayer. In diesem Fall werden alle erkannten Zoneplayer mit dem Prefix "<code>Sonos_</code>" anfangen. | ||
Natürlich kann man das nach dem Anlegen einfach umbenennen. | Natürlich kann man das nach dem Anlegen einfach umbenennen. | ||
'''Achtung!''' Dieses Modul benötigt für die Signalisierung von Readings-Änderungen an den Haupt FHEM-Teil einen definierten TelnetPort. Die entsprechende Anweisung dazu muss also ''vor''dieser Sonos-Definition bereits erfolgt sein. | '''Achtung!''' Dieses Modul benötigt für die Signalisierung von Readings-Änderungen an den Haupt FHEM-Teil einen definierten TelnetPort. Die entsprechende Anweisung dazu muss also ''vor'' dieser Sonos-Definition bereits erfolgt sein. | ||
Erkannte Zoneplayer werden als '''SONOSPLAYER'''-Device angelegt: | Erkannte Zoneplayer werden als '''SONOSPLAYER'''-Device angelegt: | ||
< | <pre>define Sonos_Wohnzimmer SONOSPLAYER RINCON_000E5828D0F401400_MR</pre> | ||
Der Name des Device wird aus dem Namen des SONOS-Device und dem Namen der Zone gebildet. Dabei werden Leer- und Sonderzeichen in "<code>_</code>" umgewandelt. | Der Name des Device wird aus dem Namen des SONOS-Device und dem Namen der Zone gebildet. Dabei werden Leer- und Sonderzeichen in "<code>_</code>" umgewandelt. | ||
Beim Anlegen werden automatisch einige Attribute mit angelegt: | Beim Anlegen werden automatisch einige Attribute mit angelegt: | ||
<pre> | |||
attr Sonos_Wohnzimmer generateInfoSummarize1 <NormalAudio><Artist prefix="(" suffix=")"/> | |||
<Title prefix=" '" suffix="'" ifempty="[Keine Musikdatei]"/> | |||
<Album prefix=" vom Album '" suffix="'"/></NormalAudio> | |||
<StreamAudio><Sender suffix=":"/><SenderCurrent prefix=" '" suffix="' -"/> | |||
<SenderInfo prefix=" "/></StreamAudio> | |||
attr Sonos_Wohnzimmer generateInfoSummarize2 | attr Sonos_Wohnzimmer generateInfoSummarize2 <TransportState/><InfoSummarize1 prefix=" => "/> | ||
attr Sonos_Wohnzimmer generateInfoSummarize3 | attr Sonos_Wohnzimmer generateInfoSummarize3 <Volume prefix="Lautstärke: "/> | ||
<Mute instead=" ~ Kein Ton" ifempty=" ~ Ton An" emptyval="0"/> | |||
~ Balance: | ~ Balance: <Balance ifempty="Mitte" emptyval="0"/> | ||
<HeadphoneConnected instead=" ~ Kopfhörer aktiv" | |||
ifempty= | ifempty=" ~ Kein Kopfhörer" emptyval="0"/> | ||
attr Sonos_Wohnzimmer icon icoSONOSPLAYER_icon-ZP90.png | attr Sonos_Wohnzimmer icon icoSONOSPLAYER_icon-ZP90.png | ||
attr Sonos_Wohnzimmer room Sonos | attr Sonos_Wohnzimmer room Sonos | ||
attr Sonos_Wohnzimmer stateVariable InfoSummarize2 | attr Sonos_Wohnzimmer stateVariable InfoSummarize2 | ||
attr Sonos_Wohnzimmer webCmd Play:Pause:Previous:Next:VolumeD:VolumeU:MuteT | attr Sonos_Wohnzimmer webCmd Play:Pause:Previous:Next:VolumeD:VolumeU:MuteT | ||
attr Sonos_Wohnzimmer group Wohnzimmer</ | attr Sonos_Wohnzimmer group Wohnzimmer | ||
</pre> | |||
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. | 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. | ||
Das Attribut "<code>room</code>" wird wieder aus dem Namen des SONOS-Device gebildet. | Das Attribut "<code>room</code>" wird wieder aus dem Namen des SONOS-Device gebildet. | ||
Zeile 66: | Zeile 73: | ||
Desweiten wird automatisch ein Weblink mit angelegt: | Desweiten wird automatisch ein Weblink mit angelegt: | ||
<pre> | |||
define AlbumArt_Wohnzimmer weblink image fhem/icons/SONOSPLAYER/Sonos_Wohnzimmer_AlbumArt | |||
attr AlbumArt_Wohnzimmer room Sonos | |||
attr AlbumArt_Wohnzimmer htmlattr width="200" height="200" | |||
attr AlbumArt_Wohnzimmer group Wohnzimmer | |||
</pre> | |||
Damit wird in der Raumansicht direkt über dem SonosPlayer-Device das Cover des aktuellen Titels angezeigt. | Damit wird in der Raumansicht direkt über dem SonosPlayer-Device das Cover des aktuellen Titels angezeigt. | ||
Zeile 79: | Zeile 87: | ||
Funktionierende Kombinationen: | Funktionierende Kombinationen: | ||
*Windows, ActivePerl | |||
* Windows, ActivePerl | *Raspberry Pi, Default-Perl | ||
* Raspberry Pi, Default-Perl | |||
Problematische Kombinationen: | Problematische Kombinationen: | ||
*FritzBox: Anscheinend ist Perl dort ohne Thread-Möglichkeit kompiliert. Diese sind aber essentiell notwendig für dieses Modul. | |||
== Softwarevoraussetzungen == | == Softwarevoraussetzungen == | ||
Für die Verwendung sind Perlmodule notwendig, die unter Umständen noch nachinstalliert werden müssen: | Für die Verwendung sind Perlmodule notwendig, die unter Umständen noch nachinstalliert werden müssen: | ||
*'''LWP::Simple''' | |||
* '''LWP::Simple''' | *'''LWP::UserAgent''' | ||
* '''LWP::UserAgent''' | *'''SOAP::Lite''' | ||
* '''SOAP::Lite''' | *'''HTTP::Request''' | ||
* '''HTTP::Request''' | |||
Die Installation dieser Module geht in der Regel per CPAN. Das bedeutet das zum Beispiel mit | Die Installation dieser Module geht in der Regel per CPAN. Das bedeutet das zum Beispiel mit | ||
<pre> | |||
sudo cpan LWP::Simple | |||
das Modul "<code>LWP::Simple</code>" installiert wird. Wenn man bereits als Benutzer '''root'''arbeitet, dann ist das <code>sudo</code> natürlich nicht nötig. | </pre> | ||
das Modul "<code>LWP::Simple</code>" installiert wird. Wenn man bereits als Benutzer '''root''' arbeitet, dann ist das <code>sudo</code> natürlich nicht nötig. | |||
Sollte es bei der Installation mittels CPAN zu Problemen kommen, dann folgt hier eine Beschreibung der manuellen Installation. | Sollte es bei der Installation mittels CPAN zu Problemen kommen, dann folgt hier eine Beschreibung der manuellen Installation. | ||
=== Hinweis für Debian-Systeme === | === Hinweis für Debian-Systeme === | ||
Bei Debian-basierten Systemen (also auch Raspbian für den Raspberry Pi usw.) kann auch mittels | Bei Debian-basierten Systemen (also auch Raspbian für den Raspberry Pi usw.) kann auch mittels | ||
<pre> | |||
sudo apt-get install <paketname> | |||
</pre> | |||
installiert werden. Manchmal ist es etwas schwieriger, die Paketnamen zu ermitteln, aber Google ist da sehr hilfreich. | installiert werden. Manchmal ist es etwas schwieriger, die Paketnamen zu ermitteln, aber Google ist da sehr hilfreich. | ||
Hier mal die Liste für die oben genannten Pakete: | Hier mal die Liste für die oben genannten Pakete: | ||
*'''LWP::Simple'''-Paketname (inkl. '''LWP::UserAgent''' und '''HTTP::Request'''): <code>libwww-perl</code> | |||
* '''LWP::Simple'''-Paketname (inkl. '''LWP::UserAgent''' und '''HTTP::Request'''): <code>libwww-perl</code> | *'''SOAP::Lite'''-Paketname: <code>libsoap-lite-perl</code> | ||
* '''SOAP::Lite'''-Paketname: <code>libsoap-lite-perl</code> | |||
Zeile 124: | Zeile 129: | ||
Man kann das aber auch Manuell installieren: | Man kann das aber auch Manuell installieren: | ||
*Am Einfachsten ist ein Wechsel in den Kontext des Benutzers '''root''': "<code>sudo su -</code>" | |||
* Am Einfachsten ist ein Wechsel in den Kontext des Benutzers '''root''': "<code>sudo su -</code>" | *Erstellen eines Ordners, z.B. "<code>mkdir lwpsimple</code>" | ||
* Erstellen eines Ordners, z.B. "<code>mkdir lwpsimple</code>" | *Wechsel in diesen Ordner "<code>cd lwpsimple</code>" | ||
* Wechsel in diesen Ordner "<code>cd lwpsimple</code>" | *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. "<code>wget http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/libwww-perl-6.04.tar.gz</code>" | ||
* Herunterladen der Datei von | *Entpacken der Datei: "<code>tar -xzvf libwww-perl-6.04.tar.gz</code>" | ||
* Entpacken der Datei: "<code>tar -xzvf libwww-perl-6.04.tar.gz</code>" | *Wechsel in das neu entstandene Verzeichnis: "<code>cd libwww-perl-6.04</code>" | ||
* Wechsel in das neu entstandene Verzeichnis: "<code>cd libwww-perl-6.04</code>" | *Nun kann es nach dem Standardvorgehen weitergehen: | ||
* Nun kann es nach dem Standardvorgehen weitergehen: | **"<code>perl Makefile.PL</code>" | ||
** "<code>perl Makefile.PL</code>" | **"<code>make</code>" | ||
** "<code>make</code>" | **"<code>make install</code>" | ||
** "<code>make install</code>" | |||
Zeile 143: | Zeile 146: | ||
Man kann das aber auch Manuell installieren: | Man kann das aber auch Manuell installieren: | ||
*Am Einfachsten ist ein Wechsel in den Kontext des Benutzers '''root''': "<code>sudo su -</code>" | |||
* Am Einfachsten ist ein Wechsel in den Kontext des Benutzers '''root''': "<code>sudo su -</code>" | *Erstellen eines Ordners, z.B. "<code>mkdir soaplite</code>" | ||
* Erstellen eines Ordners, z.B. "<code>mkdir soaplite</code>" | *Wechsel in diesen Ordner "<code>cd soaplite</code>" | ||
* Wechsel in diesen Ordner "<code>cd soaplite</code>" | *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. "<code>wget http://mirror.informatik.uni-mannheim.de/pub/mirrors/CPAN/authors/id/M/MK/MKUTTER/SOAP-Lite-0.715.tar.gz</code>" | ||
* Herunterladen der Datei von | *Entpacken der Datei: "<code>tar -xzvf SOAP-Lite-0.715.tar.gz</code>" | ||
* Entpacken der Datei: "<code>tar -xzvf SOAP-Lite-0.715.tar.gz</code>" | *Wechsel in das neu entstandene Verzeichnis: "<code>cd SOAP-Lite-0.715</code>" | ||
* Wechsel in das neu entstandene Verzeichnis: "<code>cd SOAP-Lite-0.715</code>" | *Nun kann es nach der [http://www.soaplite.com/2003/06/installation_in.html Anleitung] weitergehen: | ||
* Nun kann es nach der | **"<code>perl Makefile.PL</code>" | ||
** "<code>perl Makefile.PL</code>" | **Dann kommt eine Nachfrage, was zusammengebaut werden soll. An dieser Stelle ist es jetzt wie eine normale CPAN Installation. Einfach mit <Enter> weitermachen lassen. | ||
** Dann kommt eine Nachfrage, was zusammengebaut werden soll. An dieser Stelle ist es jetzt wie eine normale CPAN Installation. Einfach mit | **"<code>make</code>" | ||
** "<code>make</code>" | **"<code>make install</code>" | ||
** "<code>make install</code>" | |||
Zeile 162: | Zeile 163: | ||
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: | 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: | ||
*Lokales Verzeichnis für die Ablage der Tondateien erzeugen. z.B.: <pre>sudo mkdir /mnt/SonosSpeak</pre> | |||
*Installation der notwendigen Pakete für Samba: <pre>sudo apt-get install samba samba-common-bin</pre> | |||
*Starten des Editors zum Anpassen der Konfigurationsdatei: <pre>sudo nano /etc/samba/smb.conf</pre> | |||
*Folgende Zeilen hinzufügen (Pfade müssen natürlich u.U. angepasst werden): | |||
<pre> | |||
[SonosSpeak] | |||
comment = Audio-Files for SonosPlayer to Speak | |||
read only = false | |||
path = /mnt/SonosSpeak | |||
guest ok = yes | |||
</pre> | |||
*Samba-Server neustarten: <pre>sudo /etc/init.d/samba restart</pre> | |||
Damit wird eine Freigabe mit dem Namen '''SonosSpeak''' erzeugt, die von allen ohne Anmeldung gelesen werden kann. | |||
Damit wird eine Freigabe mit dem Namen '''SonosSpeak'''erzeugt, die von allen ohne Anmeldung gelesen werden kann. | |||
== Interner Aufbau == | == Interner Aufbau == | ||
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. | 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.<br />Das läßt sich aus technologischen Gründen auch nicht umgehen. | ||
Das läßt sich aus technologischen Gründen auch nicht umgehen. | |||
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] "nach oben" zum Hauptthread übertragen, und dann mittels eines Telnetaufrufs die Verarbeitung im Hauptthread angestossen. | 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] "nach oben" zum Hauptthread übertragen, und dann mittels eines Telnetaufrufs die Verarbeitung im Hauptthread angestossen.<br /> Dadurch wird gewährleistet, dass die Daten immer im Hauptthread (also dem "eigentlichen" FHEM-Thread) verfügbar sind. | ||
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. | 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. | ||
Zeile 192: | Zeile 191: | ||
Der Rest sind nur viele Zeilen, die XML-Strukturen (mittels regulärer Ausdrücke) parsen oder erzeugen, und die entsprechenden Informationen setzen oder abfragen. | Der Rest sind nur viele Zeilen, die XML-Strukturen (mittels regulärer Ausdrücke) parsen oder erzeugen, und die entsprechenden Informationen setzen oder abfragen. | ||
Zeile 201: | Zeile 199: | ||
Folgende Dateien sind nötig: | Folgende Dateien sind nötig: | ||
*00_SONOS.pm | |||
* 00_SONOS.pm | *21_SONOSPLAYER.pm | ||
* 21_SONOSPLAYER.pm | *2 Dateien der PerlUPnP-Library | ||
* 2 Dateien der PerlUPnP-Library | *Dateien für MP3-Tags bei der Sprachausgabe (Wenn nicht vorhanden, fehlt nur die Funktionalität, das Modul sollte aber dennoch lauffähig sein) | ||
* Dateien für MP3-Tags bei der Sprachausgabe (Wenn nicht vorhanden, fehlt nur die Funktionalität, das Modul sollte aber dennoch lauffähig sein) | *Die unter ''Softwarevoraussetzungen'' genannten Perlmodule | ||
* Die unter ''Softwarevoraussetzungen'' genannten Perlmodule | |||
Die beiden SONOS-Perlmodule müssen einfach in das Verzeichnis <code>FHEM</code> kopiert werden (wie alle anderen FHEM-Module auch). | Die beiden SONOS-Perlmodule müssen einfach in das Verzeichnis <code>FHEM</code> kopiert werden (wie alle anderen FHEM-Module auch). | ||
Die PerlUPnP-Library muss komplett in das Verzeichnis <code>FHEM/lib/</code> abgelegt werden. Dabei muss das Verzeichnis <code>UPnP</code> genannt werden. | Die PerlUPnP-Library muss komplett in das Verzeichnis <code>FHEM/lib/</code> abgelegt werden. Dabei muss das Verzeichnis <code>UPnP</code> genannt werden. | ||
Es werden für den Betrieb nicht alle Dateien des Standard-Pakets benötigt, sondern nur zwei .pm Dateien. | Es werden für den Betrieb nicht alle Dateien des Standard-Pakets benötigt, sondern nur zwei .pm Dateien. <br /> | ||
Die resultierende Ordnerstruktur (inkl. Dateien von PerlUPnP) lautet dann wie folgt: | Die resultierende Ordnerstruktur (inkl. Dateien von PerlUPnP) lautet dann wie folgt: | ||
*FHEM/lib | |||
*FHEM/lib/UPnP | |||
*FHEM/lib/UPnP/Common.pm | |||
*FHEM/lib/UPnP/ControlPoint.pm | |||
Die Dateien für die MP3-Tags müssen ebenfalls in das Verzeichnis <code>lib</code> 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.<br />Die Laufzeit z.B. wird für die Pausenberechnung aber gebraucht, und muss dementsprechend auf anderem Wege ermittelt werden.<br /> | |||
Die Dateien für die MP3-Tags müssen ebenfalls in das Verzeichnis <code>lib</code> 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. | |||
Die Laufzeit z.B. wird für die Pausenberechnung aber gebraucht, und muss dementsprechend auf anderem Wege ermittelt werden. | |||
Die resultierende Ordnerstruktur lautet dann wie folgt: | Die resultierende Ordnerstruktur lautet dann wie folgt: | ||
*FHEM/lib/ | |||
* FHEM/lib/ | *FHEM/lib/MP3 | ||
* FHEM/lib/MP3 | *FHEM/lib/MP3/Tag.pm | ||
* FHEM/lib/MP3/Tag.pm | *FHEM/lib/MP3/Info.pm | ||
* FHEM/lib/MP3/Info.pm | *FHEM/lib/MP3/Tag | ||
* FHEM/lib/MP3/Tag | *FHEM/lib/MP3/Tag/File.pm | ||
* FHEM/lib/MP3/Tag/File.pm | *FHEM/lib/MP3/Tag/LastResort.pm | ||
* FHEM/lib/MP3/Tag/LastResort.pm | *FHEM/lib/MP3/Tag/ImageExifTool.pm | ||
* FHEM/lib/MP3/Tag/ImageExifTool.pm | *FHEM/lib/MP3/Tag/CDDB_File.pm | ||
* FHEM/lib/MP3/Tag/CDDB_File.pm | *FHEM/lib/MP3/Tag/ID3v2_Data.pod | ||
* FHEM/lib/MP3/Tag/ID3v2_Data.pod | *FHEM/lib/MP3/Tag/ImageSize.pm | ||
* FHEM/lib/MP3/Tag/ImageSize.pm | *FHEM/lib/MP3/Tag/ID3v1.pm | ||
* FHEM/lib/MP3/Tag/ID3v1.pm | *FHEM/lib/MP3/Tag/ParseData.pm | ||
* FHEM/lib/MP3/Tag/ParseData.pm | *FHEM/lib/MP3/Tag/Cue.pm | ||
* FHEM/lib/MP3/Tag/Cue.pm | *FHEM/lib/MP3/Tag/ID3v2.pm | ||
* FHEM/lib/MP3/Tag/ID3v2.pm | *FHEM/lib/MP3/Tag/Inf.pm | ||
* FHEM/lib/MP3/Tag/Inf.pm | *FHEM/lib/Normalize | ||
* FHEM/lib/Normalize | *FHEM/lib/Normalize/Text | ||
* FHEM/lib/Normalize/Text | *FHEM/lib/Normalize/Text/Music_Fields.pm | ||
* FHEM/lib/Normalize/Text/Music_Fields.pm | *FHEM/lib/Normalize/Text/Music_Fields | ||
* FHEM/lib/Normalize/Text/Music_Fields | *FHEM/lib/Normalize/Text/Music_Fields/Music_Fields-rus.lst | ||
* FHEM/lib/Normalize/Text/Music_Fields/Music_Fields-rus.lst | *FHEM/lib/Normalize/Text/Music_Fields/G_Gershwin.comp | ||
* FHEM/lib/Normalize/Text/Music_Fields/G_Gershwin.comp | *FHEM/lib/Normalize/Text/Music_Fields/A_Dvor_k.comp | ||
* FHEM/lib/Normalize/Text/Music_Fields/A_Dvor_k.comp | *FHEM/lib/Normalize/Text/Music_Fields/J_Brahms.comp | ||
* FHEM/lib/Normalize/Text/Music_Fields/J_Brahms.comp | *FHEM/lib/Normalize/Text/Music_Fields/L_van_Beethoven.comp | ||
* FHEM/lib/Normalize/Text/Music_Fields/L_van_Beethoven.comp | *FHEM/lib/Normalize/Text/Music_Fields/A_Schnittke.comp | ||
* FHEM/lib/Normalize/Text/Music_Fields/A_Schnittke.comp | *FHEM/lib/Normalize/Text/Music_Fields/D_Shostakovich.comp | ||
* FHEM/lib/Normalize/Text/Music_Fields/D_Shostakovich.comp | *FHEM/lib/Encode | ||
* FHEM/lib/Encode | *FHEM/lib/Encode/transliterate_win1251.pm | ||
* FHEM/lib/Encode/transliterate_win1251.pm | |||
Nach einem Neustart von FHEM kann das Modul wie beschrieben verwendet werden. | Nach einem Neustart von FHEM kann das Modul wie beschrieben verwendet werden. | ||
Zeile 267: | Zeile 260: | ||
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. | 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. | ||
Wenn das Feature mit <code>minVolume</code> oder <code>maxVolume</code> 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. | Wenn das Feature mit <code>minVolume</code> oder <code>maxVolume</code> 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.<br >Als Nebeneffekt wird für jede Lautstärkenänderung auch ein Event in FHEM erzeugt (als Folge einer Aktualisierung des Readings <code>Volume</code>). | ||
Als Nebeneffekt wird für jede Lautstärkenänderung auch ein Event in FHEM erzeugt (als Folge einer Aktualisierung des Readings <code>Volume</code>). | |||
=== Attribute von SONOS === | === Attribute von SONOS === | ||
* <code>pingType(tcp,udp,icmp,syn)</code>: Definiert die Art, wie der Alive-Check eines Zoneplayers erfolgen soll. Die Verfahren funktionieren unterschiedlich gut. Am Ressourcensparsamsten ist ''icmp'', benötigt aber "<code>root</code>"-Rechte. An zweiter Stelle ist ''syn'' zu empfehlen. Die anderen Verfahren melden manchmal fehlerhafte not alives. Einfach probieren. | *<code>pingType(tcp,udp,icmp,syn)</code>: Definiert die Art, wie der Alive-Check eines Zoneplayers erfolgen soll. Die Verfahren funktionieren unterschiedlich gut. Am Ressourcensparsamsten ist ''icmp'', benötigt aber "<code>root</code>"-Rechte. An zweiter Stelle ist ''syn'' zu empfehlen. Die anderen Verfahren melden manchmal fehlerhafte not alives. Einfach probieren. | ||
* <code>targetSpeakDir</code>: Das Verzeichnis, in dem dieses Modul die Sprachdateien von <code>Speak</code> (siehe | *<code>targetSpeakDir</code>: Das Verzeichnis, in dem dieses Modul die Sprachdateien von <code>Speak</code> (siehe [http://www.fhemwiki.de/wiki/Sonos_Anwendungsbeispiel#Set-Befehle_an_den_SONOSPLAYER Set-Befehle an den SONOSPLAYER]) ablegen soll. Es wird empfohlen, dass dieses Verzeichnis '''nicht''' von Sonos indiziert ist.<br />z.B. Pfade unter *Nix: <code>/home/www/Sonos</code> oder unter Windows: <code>C:\InetPub\Sonos</code> | ||
z.B. Pfade unter *Nix: <code>/home/www/Sonos</code> oder unter Windows: <code>C:\InetPub\Sonos</code> | *<code>targetSpeakURL</code>: Die URL, unter der ''von außen'' auf die abgelegte Sprachdatei zugegriffen werden kann.<br />z.B. <code>\\192.168.178.45\Sonos</code> | ||
* <code>targetSpeakURL</code>: Die URL, unter der ''von außen'' auf die abgelegte Sprachdatei zugegriffen werden kann. | *<code>targetSpeakFileTimestamp(0,1)</code>: Definiert, ob in der Sprachausgabedatei ein Zeitstempel enthalten sein soll. Das sorgt dafür, dass alle Dateien beibehalten werden (da nicht mit demselben Namen überschrieben wird).<br />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.<br />Anderseits muss man sich dabei Gedanken über eine Aufräumstrategie machen, da die alten Dateien immer vorhanden bleiben. | ||
z.B. <code>\\192.168.178.45\Sonos</code> | |||
* <code>targetSpeakFileTimestamp(0,1)</code>: Definiert, ob in der Sprachausgabedatei ein Zeitstempel enthalten sein soll. Das sorgt dafür, dass alle Dateien beibehalten werden (da nicht mit demselben Namen überschrieben wird). | |||
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. | |||
Anderseits muss man sich dabei Gedanken über eine Aufräumstrategie machen, da die alten Dateien immer vorhanden bleiben. | |||
Zeile 288: | Zeile 274: | ||
Hier werden die Informationen, die vom '''SONOS'''-Modul erkannt werden, abgelegt, und die Aktualisierungs-Events erzeugt. | Hier werden die Informationen, die vom '''SONOS'''-Modul erkannt werden, abgelegt, und die Aktualisierungs-Events erzeugt. | ||
=== Readings von SONOSPLAYER === | === Readings von SONOSPLAYER === | ||
Folgende Informationen werden im SONOSPLAYER als Reading abgelegt: | Folgende Informationen werden im SONOSPLAYER als Reading abgelegt: | ||
*Grundlegendes | |||
* Grundlegendes | **<code>presence</code>: Erreichbarkeit des Players. Kann "appeared" oder "disappeared" sein | ||
** <code>presence</code>: Erreichbarkeit des Players. Kann "appeared" oder "disappeared" sein | **<code>roomName</code>: Originalname des ZonePlayers. Kann Leer- oder Sonderzeichen enthalten | ||
** <code>roomName</code>: Originalname des ZonePlayers. Kann Leer- oder Sonderzeichen enthalten | **<code>saveRoomName</code>: Sicherer Name des Zoneplayer. Sonderzeichen wurden in Unterstriche umgewandelt. Das Device wird beim Anlegen mit diesem Namen angelegt | ||
** <code>saveRoomName</code>: Sicherer Name des Zoneplayer. Sonderzeichen wurden in Unterstriche umgewandelt. Das Device wird beim Anlegen mit diesem Namen angelegt | **<code>playerType</code>: Typbezeichnung des ZonePlayer. z.B. "ZP90" | ||
** <code>playerType</code>: Typbezeichnung des ZonePlayer. z.B. "ZP90" | **<code>location</code>: URL zum Informationsdokument des ZonePlayers | ||
** <code>location</code>: URL zum Informationsdokument des ZonePlayers | **<code>softwareRevision</code>: Version der installierten Software. z.B. "3.8.4" | ||
** <code>softwareRevision</code>: Version der installierten Software. z.B. "3.8.4" | **<code>serialNum</code>: Seriennummer des ZonePlayers. Entspricht weitestgehend der MAC-Adresse. z.B. "00-0E-58-28-D0-F4:2" | ||
** <code>serialNum</code>: Seriennummer des ZonePlayers. Entspricht weitestgehend der MAC-Adresse. z.B. "00-0E-58-28-D0-F4:2" | **<code>LastGetActionName</code>: Enthält den Namen der letzten Get-Anweisung | ||
** <code>LastGetActionName</code>: Enthält den Namen der letzten Get-Anweisung | **<code>LastGetActionResult</code>: Enthält das Ergebnis der letzten Get-Anweisung | ||
** <code>LastGetActionResult</code>: Enthält das Ergebnis der letzten Get-Anweisung | **<code>LastSetActionName</code>: Enthält den Namen der letzten Set-Anweisung | ||
** <code>LastSetActionName</code>: Enthält den Namen der letzten Set-Anweisung | **<code>LastSetActionResult</code>: Enthält das Ergebnis der letzten Set-Anweisung | ||
** <code>LastSetActionResult</code>: Enthält das Ergebnis der letzten Set-Anweisung | **<code>Volume</code>: Enthält im Normalfall die am Player eingestellte Laustärke zum Zeitpunkt der Erkennung. Wenn eines der beiden Attribute <code>minVolume</code> oder <code>maxVolume</code> gesetzt wurde, wird diese Lautstärke bei jeder Änderung am Player mit aktualisiert. <br />Wenn zusätzlich noch das Attribut <code>generateVolumeEvent</code> 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. | ||
** <code>Volume</code>: Enthält im Normalfall die am Player eingestellte Laustärke zum Zeitpunkt der Erkennung. Wenn eines der beiden Attribute <code>minVolume</code> oder <code>maxVolume</code> gesetzt wurde, wird diese Lautstärke bei jeder Änderung am Player mit aktualisiert. | **<code>Mute</code>: Enthält, wenn eines der beiden Attribute <code>minVolume</code> oder <code>maxVolume</code> gesetzt wurde, den aktuellen Zustand des Mute. <br />Wenn zusätzlich noch das Attribut <code>generateVolumeEvent</code> 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. | ||
Wenn zusätzlich noch das Attribut <code>generateVolumeEvent</code> 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. | **<code>Shuffle</code>: Enthält den aktuellen Zustand von Shuffle. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation). | ||
** <code>Mute</code>: Enthält, wenn eines der beiden Attribute <code>minVolume</code> oder <code>maxVolume</code> gesetzt wurde, den aktuellen Zustand des Mute. | **<code>Repeat</code>: Enthält den aktuellen Zustand von Repeat. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation). | ||
Wenn zusätzlich noch das Attribut <code>generateVolumeEvent</code> 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. | **<code>CrossfadeMode</code>: Enthält den aktuellen Zustand von CrossfadeMode. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation). | ||
** <code>Shuffle</code>: Enthält den aktuellen Zustand von Shuffle. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation). | **<code>Balance</code>: Enthält im Normalfall die am Player eingestellte Balance zum Zeitpunkt der Erkennung. Wenn eines der beiden Attribute <code>minVolume</code> oder <code>maxVolume</code> gesetzt wurde, wird diese Balance bei jeder Änderung am Player mit aktualisiert. <br />Wenn zusätzlich noch das Attribut <code>generateVolumeEvent</code> 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. | ||
** <code>Repeat</code>: Enthält den aktuellen Zustand von Repeat. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation). | **<code>HeadphoneConnected</code>: Enthält, wenn eines der beiden Attribute <code>minVolume</code> oder <code>maxVolume</code> (oder auch <code>minVolumeHeadphone</code> und <code>maxVolumeHeadphone</code>) gesetzt wurde, den Zustand, ob ein Kopfhörer verwendet wird, oder nicht. <br />Wenn zusätzlich noch das Attribut <code>generateVolumeEvent</code> 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. | ||
** <code>CrossfadeMode</code>: Enthält den aktuellen Zustand von CrossfadeMode. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation). | **<code>SleepTimer</code>: Enthält die Restzeit des Sleeptimers. Diese Information wird vom Player beim setzen und ablaufen gemeldet, und erzeugtnsomit ein Event zu Beginn und Ende des Timers. Während der Timer läuft, wird hier nix aktualisier. Man muss also, falls benötigt, selber die verbleibende Restzeit mittels des Readings-Timestamps und diesem Wert ermitteln.<br />Diese Information wird automatisch aktualisiert, wenn sie bei einem Player verändert wird. | ||
** <code>Balance</code>: Enthält im Normalfall die am Player eingestellte Balance zum Zeitpunkt der Erkennung. Wenn eines der beiden Attribute <code>minVolume</code> oder <code>maxVolume</code> gesetzt wurde, wird diese Balance bei jeder Änderung am Player mit aktualisiert. | **<code>SleepTimerVersion</code>: Dieses Reading enthält die Information über die aktuelle Version der gespeicherten ''SleepTimer''-Informationen. Diese Information wird Hauptsächlich intern benötigt, um beurteilen zu können, ob das Reading ''SleepTimer'' neu geladen werden muss. | ||
Wenn zusätzlich noch das Attribut <code>generateVolumeEvent</code> 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. | **<code>DailyIndexRefreshTime</code>: Enthält die aktuell gültige ''DailyIndexRefreshTime'', zu der der Medienindex neu aufgebaut werden soll. <br />Diese Information wird automatisch aktualisiert, wenn sie bei einem Player verändert wird, wenn das Attribut '''getAlarms''' des Player auf ''1'' gesetzt wurde. | ||
** <code>HeadphoneConnected</code>: Enthält, wenn eines der beiden Attribute <code>minVolume</code> oder <code>maxVolume</code> (oder auch <code>minVolumeHeadphone</code> und <code>maxVolumeHeadphone</code>) gesetzt wurde, den Zustand, ob ein Kopfhörer verwendet wird, oder nicht. | **<code>AlarmList</code>: Enthält den Hash mit den aktuell für diesen Player gültigen Alarminformationen. Diese Information wird automatisch aktualisiert, wenn das Attribut '''getAlarms''' auf ''1'' gesetzt wurde, ansonsten steht sie nicht zur Verfügung. Das Format des Hashs entspricht dem, das zum Setzen oder Anpassen eines Alarms notwendig ist.<br />Folgene Schlüssel sind dort zulässig/notwendig: | ||
Wenn zusätzlich noch das Attribut <code>generateVolumeEvent</code> 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. | ***'''Enabled(0,1)''': Gibt an, ob der Alarm aktiviert ist. | ||
***'''Volume(0..100)''': Die Lautstärke, mit der der Alarm wiedergegeben werden soll. | |||
* <code> | ***'''StartTime(Timstamp)''': Die Uhrzeit, zu der Alarm starten soll. | ||
***'''Duration(Timstamp)''': Die Dauer, die der Alarm laufen soll. | |||
* <code> | ***'''Repeat(0,1)''': Gibt an, ob die Wiedergabe wiederholt werden soll. | ||
* <code> | ***'''Shuffle(0,1)''': Gibt an, ob die Wiedergabe zufällig erfolgen soll. | ||
* <code> | ***'''RoomUUID''': Die ID der Zone, in der der Alarm wiedergegeben werden soll. | ||
***'''ProgramURI''': Die abzuspielende URI. | |||
* | ***'''ProgramMetaData''': Die Metadaten zu der abzuspielenden URI. | ||
* | ***'''Recurrence_Once(0,1)''': Gibt an, dass der Alarm nur einmal laufen soll. Wenn hier eine ''1'' angegeben wurde, dann werden die anderen ''Recurrence''-Angaben ignoriert. | ||
* | ***'''Recurrence_Monday(0,1)''': Gibt an, dass der Alarm jeden Montag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden. | ||
* | ***'''Recurrence_Tuesday(0,1)''': Gibt an, dass der Alarm jeden Dienstag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden. | ||
* | ***'''Recurrence_Wednesday(0,1)''': Gibt an, dass der Alarm jeden Mittwoch laufen soll. Kann mit den anderen Tagesangaben kombiniert werden. | ||
* | ***'''Recurrence_Thursday(0,1)''': Gibt an, dass der Alarm jeden Donnerstag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden. | ||
* | ***'''Recurrence_Friday(0,1)''': Gibt an, dass der Alarm jeden Freitag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden. | ||
* | ***'''Recurrence_Saturday(0,1)''': Gibt an, dass der Alarm jeden Samstag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden. | ||
* | ***'''Recurrence_Sunday(0,1)''': Gibt an, dass der Alarm jeden Sonntag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden. | ||
* | ***'''IncludeLinkedZones(0,1)''': Gibt an, ob die aktuell verlinkten Zonen diesen Alarm ebenfall abspielen sollen. | ||
* | ***'''Beispiel-Hash''': { Enabled => 1, Volume => 12, StartTime => '16:00:00', Duration => '00:15:00', Repeat => 0, Shuffle => 0, RoomUUID => 'RINCON_000E5828D0F401400', ProgramURI => 'x-rincon-buzzer:0', ProgramMetaData => ' ', Recurrence_Once => 0, Recurrence_Monday => 1, Recurrence_Tuesday => 1, Recurrence_Wednesday => 1, Recurrence_Thursday => 1, Recurrence_Friday => 1, Recurrence_Saturday => 0, Recurrence_Sunday => 0, IncludeLinkedZones => 0 } | ||
* | **<code>AlarmListIDs</code>: Enthält die Hash-Schlüssel der Alarme als komma-separierte Liste. Dieses Reading gibt es Hauptsächlich zur Vereinfachung des Zugriffs auf das Reading '''AlarmList'''. Damit hat man direkt die Anzahl und Primärschlüssel im Zugriff. | ||
**<code>AlarmListVersion</code>: 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. | |||
* | *Infos zum aktuellen Titel | ||
* | **<code>currentTitle</code>: Titelbezeichnung des aktuellen Titels | ||
* <code>CurrentTempPlaying</code>: Boolean. 1 wenn gerade eine Temporäre Ausgabe (<code>PlayURITemp</code> oder <code>Speak</code>) auf dem ZonePlayer läuft, 0, wenn der Player ''frei'' ist. | **<code>currentArtist</code>: Interpret des aktuellen Titels | ||
**<code>currentAlbum</code>: Albumname zum aktuellen Titel | |||
**<code>currentAlbumArtist</code>: Interpret des Albums. Kann z.B. auch "(compilations)" sein, wenn mit iTunes verwaltet | |||
**<code>currentOriginalTrackNumber</code>: Nummer des aktuellen Titels bezogen auf das Album | |||
**<code>currentTrack</code>: Nummer des aktuellen Titels in der Abspielliste | |||
**<code>currentTrackURI</code>: Dateipfad des aktuellen Titels in der Abspielliste. Gültige Formate siehe PlayURI. | |||
**<code>currentTrackDuration</code>: Länge des aktuellen Titels im Format H:MM:SS | |||
**<code>currentSender</code>: Senderbezeichnung, wenn es ein Radiostram ist | |||
**<code>currentSenderCurrent</code>: Zusatzinformationen zur Radiosendung, meist der Programmtitel wie 'Pop&Weck' | |||
**<code>currentSenderInfo</code>: Zusatzinforationen zur Radiosendung, meist der Titel des aktuellen Liedes | |||
**<code>currentAlbumArtURI</code>: Relativer Verzeichnis-Pfad im lokalen FHEM (physisch). Beginnt momentan mit "www" | |||
**<code>infoSummarize1</code>: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize] | |||
**<code>infoSummarize2</code>: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize] | |||
**<code>infoSummarize3</code>: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize] | |||
**<code>infoSummarize4</code>: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize] | |||
**<code>currentStreamAudio</code>: Boolean. 1 wenn gerade ein Radiostream läuft, sonst 0. Momentan faktisch Negation zu <normalAudio> | |||
**<code>currentNormalAudio</code>: Boolean. 1 wenn gerade ein normaler Titel läuft, sonst 0. Momentan faktisch Negation zu <streamAudio> | |||
*Infos zum Gesamtstatus | |||
**<code>transportState</code>: Aktueller Abspielstatus. Kann "ERROR", "STOPPED", "PLAYING" oder "PAUSED_PLAYBACK" sein. Wobei ERROR heißt, dass es keine Verbindung zum Player gibt | |||
**<code>numberOfTracks</code>: Anzahl der momentan in der Abspielliste befindlichen Titel | |||
**<code>CurrentTempPlaying</code>: Boolean. 1 wenn gerade eine Temporäre Ausgabe (<code>PlayURITemp</code> oder <code>Speak</code>) auf dem ZonePlayer läuft, 0, wenn der Player ''frei'' ist. | |||
=== Attribute von SONOSPLAYER === | === Attribute von SONOSPLAYER === | ||
* <code>disable(0,1)</code>: Deaktiviert die Verarbeitung von Events dieses Devices | *<code>disable(0,1)</code>: Deaktiviert die Verarbeitung von Events dieses Devices | ||
* <code>generateVolumeSlider(0,1)</code>: Aktiviert einen Slider für die Lautstärkeneinstellung auf der Detailansicht. Standardmäßig ist dieser aktiviert (=1). | *<code>generateVolumeSlider(0,1)</code>: Aktiviert einen Slider für die Lautstärkeneinstellung auf der Detailansicht. Standardmäßig ist dieser aktiviert (=1). | ||
* <code>generateVolumeEvent(0,1)</code>: Aktiviert die Generierung eines Events bei Lautstärkeänderungen, wenn mindestens eines der Attribute <code>minVolume</code>, <code>maxVolume</code>, <code>minVolumeHeadphone</code> oder <code>maxVolumeHeadphone</code> definiert ist. Standardmäßig ist dies deaktiviert (=0), um die Zeitverzögerung so gering wie möglich zu halten. | *<code>generateVolumeEvent(0,1)</code>: Aktiviert die Generierung eines Events bei Lautstärkeänderungen, wenn mindestens eines der Attribute <code>minVolume</code>, <code>maxVolume</code>, <code>minVolumeHeadphone</code> oder <code>maxVolumeHeadphone</code> definiert ist. Standardmäßig ist dies deaktiviert (=0), um die Zeitverzögerung so gering wie möglich zu halten. | ||
* <code>generateInfoAnswerOnSet(0,1)</code>: Wenn auf 1 gesetzt (Standard), dann wird auf Set-Andorderungen mit Texten und neuen Einstellungswerten geantwortet, wenn 0, dann gibt Set immer "<code>undef</code>" zurück. Damit wird erreicht, dass in der Übersichtsanzeige nach dem Drücken eines WebCmd diesselbe Seite wieder angezeigt wird, und man direkt weitersteuern kann. Der Wert von <code>LastSetActionResult</code> bzw. <code>LastGetActionResult</code> wird natürlich trotzdem gesetzt. | *<code>generateInfoAnswerOnSet(0,1)</code>: Wenn auf 1 gesetzt (Standard), dann wird auf Set-Andorderungen mit Texten und neuen Einstellungswerten geantwortet, wenn 0, dann gibt Set immer "<code>undef</code>" zurück. Damit wird erreicht, dass in der Übersichtsanzeige nach dem Drücken eines WebCmd diesselbe Seite wieder angezeigt wird, und man direkt weitersteuern kann. Der Wert von <code>LastSetActionResult</code> bzw. <code>LastGetActionResult</code> wird natürlich trotzdem gesetzt. | ||
* <code>generateSomethingChangedEvent(0,1)</code>: Bestimmt, ob ein Event mit dem Namen 'SomethingChanged' generiert werden soll, wenn überhaupt ein Event generiert wurde. Das ist nützlich, wenn man auf eine beliebige Änderung des Player reagieren möchte. | *<code>generateSomethingChangedEvent(0,1)</code>: Bestimmt, ob ein Event mit dem Namen 'SomethingChanged' generiert werden soll, wenn überhaupt ein Event generiert wurde. Das ist nützlich, wenn man auf eine beliebige Änderung des Player reagieren möchte. | ||
* <code>generateInfoSummarize1</code>: Generiert das Reading 'InfoSummarize1' mit dem angegebenen Format. | *<code>generateInfoSummarize1</code>: Generiert das Reading 'InfoSummarize1' mit dem angegebenen Format. | ||
* <code>generateInfoSummarize2</code>: Generiert das Reading 'InfoSummarize2' mit dem angegebenen Format. | *<code>generateInfoSummarize2</code>: Generiert das Reading 'InfoSummarize2' mit dem angegebenen Format. | ||
* <code>generateInfoSummarize3</code>: Generiert das Reading 'InfoSummarize3' mit dem angegebenen Format. | *<code>generateInfoSummarize3</code>: Generiert das Reading 'InfoSummarize3' mit dem angegebenen Format. | ||
* <code>generateInfoSummarize4</code>: Generiert das Reading 'InfoSummarize4' mit dem angegebenen Format. | *<code>generateInfoSummarize4</code>: Generiert das Reading 'InfoSummarize4' mit dem angegebenen Format. | ||
* <code>stateVariable(TransportState,NumberOfTracks,Track,TrackDuration,Title,Artist,Album, | *<code>stateVariable(TransportState,NumberOfTracks,Track,TrackDuration,Title,Artist,Album,<br /> | ||
</ | OriginalTrackNumber,AlbumArtist,Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,<br /> | ||
AlbumArtURI,Volume,Mute,Shuffle,Repeat,CrossfadeMode,Balance,HeadphoneConnected,SleepTimer,<br /> | |||
OriginalTrackNumber,AlbumArtist,Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio, | Presence,RoomName,SaveRoomName,PlayerType,Location,SoftwareRevision,SerialNum,InfoSummarize1,<br /> | ||
AlbumArtURI,Volume,Mute,Shuffle,Repeat,CrossfadeMode,Balance,HeadphoneConnected,Presence,RoomName, | InfoSummarize2,InfoSummarize3,InfoSummarize4)</code>: Legt fest, welcher Variablenwert in den State geschrieben werden soll. | ||
*<code>minVolume(0..100)</code>: 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. | |||
**Wenn eine untere oder obere Grenze festgelegt wurde, so wird das Reading '''Volume''' am entsprechenden SonosPlayer bei jeder Änderung am Player aktualisiert.<br />Möchte man also immer die aktuelle Lautstärke kennen, aber keine Enschränkung machen, dann sollte der Wert von <code>minVolume</code> auf <code>0</code> oder <code>maxVolume</code> auf <code>100</code> gesetzt werden. Desweiteren werden gleichzeitig auch Änderungen an der Balance aktualisiert, da diese mit übertragen werden. | |||
**'''Achtung!''': 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. | |||
* <code>minVolume(0..100)</code>: 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. | *<code>maxVolume(0..100)</code>: 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. | ||
** Wenn eine untere oder obere Grenze festgelegt wurde, so wird das Reading '''Volume''' am entsprechenden SonosPlayer bei jeder Änderung am Player aktualisiert. | **Wenn eine untere oder obere Grenze festgelegt wurde, so wird das Reading '''Volume''' am entsprechenden SonosPlayer bei jeder Änderung am Player aktualisiert.<br />Möchte man also immer die aktuelle Lautstärke kennen, aber keine Enschränkung machen, dann sollte der Wert von <code>minVolume</code> auf <code>0</code> oder <code>maxVolume</code> auf <code>100</code> gesetzt werden. Desweiteren werden gleichzeitig auch Änderungen an der Balance aktualisiert, da diese mit übertragen werden. | ||
Möchte man also immer die aktuelle Lautstärke kennen, aber keine Enschränkung machen, dann sollte der Wert von <code>minVolume</code> auf <code>0</code> oder <code>maxVolume</code> auf <code>100</code> gesetzt werden. Desweiteren werden gleichzeitig auch Änderungen an der Balance aktualisiert, da diese mit übertragen werden. | **'''Achtung!''': 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. | ||
** '''Achtung!''': 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. | *<code>minVolumeHeadphone(0..100)</code>: Legt die untere Grenze für die einstellbare Lautstärke dieses ZonePlayers im Kopfhörerbetrieb fest. | ||
**'''Hinweis!''': Es gelten die gleichen Bedingungen und Hinweise wie bei <code>minVolume</code>. | |||
* Wenn eine untere oder obere Grenze festgelegt wurde, so wird das Reading '''Volume''' am entsprechenden SonosPlayer bei jeder Änderung am Player aktualisiert. | *<code>maxVolumeHeadphone(0..100)</code>: Legt die obere Grenze für die einstellbare Lautstärke dieses ZonePlayers im Kopfhörerbetrieb fest. | ||
Möchte man also immer die aktuelle Lautstärke kennen, aber keine Enschränkung machen, dann sollte der Wert von <code>minVolume</code> auf <code>0</code> oder <code>maxVolume</code> auf <code>100</code> gesetzt werden. Desweiteren werden gleichzeitig auch Änderungen an der Balance aktualisiert, da diese mit übertragen werden. | **'''Hinweis!''': Es gelten die gleichen Bedingungen und Hinweise wie bei <code>maxVolume</code>. | ||
* '''Achtung!''': 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. | *<code>getAlarms(0,1)</code>: 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 '''DailyIndexRefreshTime''' mit aktualisiert. | ||
* '''Hinweis!''': Es gelten die gleichen Bedingungen und Hinweise wie bei <code>minVolume</code>. | |||
* '''Hinweis!''': Es gelten die gleichen Bedingungen und Hinweise wie bei <code>maxVolume</code>. | |||
< | |||
=== Get-Befehle an den SONOSPLAYER === | === Get-Befehle an den SONOSPLAYER === | ||
* <code>CurrentTrackPosition</code>: Liefert die aktuelle Zeitposition im Lied | *<code>CurrentTrackPosition</code>: Liefert die aktuelle Zeitposition im Lied | ||
* <code>Volume</code>: Liefert die aktuelle Lautstärke des Players | *<code>Volume</code>: Liefert die aktuelle Lautstärke des Players | ||
* <code>Balance</code>: Liefert den aktuellen Balancewert des Players | *<code>Balance</code>: Liefert den aktuellen Balancewert des Players | ||
* <code>Mute</code>: Liefert den aktuellen Mute-Zustand (on/off) | *<code>Mute</code>: Liefert den aktuellen Mute-Zustand (on/off) | ||
* <code>Shuffle</code>: Liefert den aktuellen Shuffle-Zustand (on/off) | *<code>Shuffle</code>: Liefert den aktuellen Shuffle-Zustand (on/off) | ||
* <code>Repeat</code>: Liefert den aktuellen Repeat-Zustand (on/off) | *<code>Repeat</code>: Liefert den aktuellen Repeat-Zustand (on/off) | ||
* <code>CrossfadeMode</code>: Liefert den aktuellen Crossfade-Mode (on/off) | *<code>CrossfadeMode</code>: Liefert den aktuellen Crossfade-Mode (on/off) | ||
* <code>Playlists</code>: 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. "Liste 1","Liste 2","Test" | *<code>Playlists</code>: 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. "Liste 1","Liste 2","Test" | ||
* <code>Radios</code>: 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. "Sender 1","Sender 2","Test" | *<code>Radios</code>: 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. "Sender 1","Sender 2","Test" | ||
=== Set-Befehle an den SONOSPLAYER === | === Set-Befehle an den SONOSPLAYER === | ||
* <code>Play</code>: Startet die Wiedergabe | *<code>Play</code>: Startet die Wiedergabe | ||
* <code>Pause</code>: Pausiert die Wiedergabe | *<code>Pause</code>: Pausiert die Wiedergabe | ||
* <code>Stop</code>: Stoppt die Wiedergabe | *<code>Stop</code>: Stoppt die Wiedergabe | ||
* <code>Next</code>: Springt zum Anfang des nächsten Liedes | *<code>Next</code>: Springt zum Anfang des nächsten Liedes | ||
* <code>Previous</code>: 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. | *<code>Previous</code>: 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. | ||
* <code>LoadPlaylist | *<code>LoadPlaylist <Playlistname></code>: Lädt die benannte Playliste in die aktuelle Abspielliste. Dabei wird die bestehende Abspielliste überschrieben. Der Parameter kann/muss URL-Encoded sein, um auch Leer- und Sonderzeichen angeben zu können. | ||
* <code>SavePlaylist | *<code>SavePlaylist <Playlistname></code>: 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. | ||
* <code>EmptyPlaylist</code>: Löscht die aktuelle Abspielliste | *<code>EmptyPlaylist</code>: Löscht die aktuelle Abspielliste | ||
* <code>LoadRadio | *<code>LoadRadio <Radiostationname></code>: 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. | ||
* <code>Mute | *<code>Mute <State></code>: Setzt den Mute-Zustand auf den angegebenen Wert. Der Wert kann on oder off sein. Liefert als Ergebnis den neuen Zustand. | ||
* <code>MuteT</code>: Schaltet den Mute-Zustand um. Liefert als Ergebnis den neuen Zustand. | *<code>MuteT</code>: Schaltet den Mute-Zustand um. Liefert als Ergebnis den neuen Zustand. | ||
* <code>Shuffle</code>: Legt den Zustand des Shuffle-Zustands fest. Liefert den aktuell gültigen Shuffle-Zustand. | *<code>Shuffle</code>: Legt den Zustand des Shuffle-Zustands fest. Liefert den aktuell gültigen Shuffle-Zustand. | ||
* <code>Repeat</code>: Legt den Zustand des Repeat-Zustands fest. Liefert den aktuell gültigen Repeat-Zustand. | *<code>Repeat</code>: Legt den Zustand des Repeat-Zustands fest. Liefert den aktuell gültigen Repeat-Zustand. | ||
* <code>CrossfadeMode</code>: Legt den Zustand des Crossfade-Mode fest. Liefert den aktuell gültigen Crossfade-Mode. | *<code>CrossfadeMode</code>: Legt den Zustand des Crossfade-Mode fest. Liefert den aktuell gültigen Crossfade-Mode. | ||
* <code> | *<code>SleepTimer</code>: 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 'off'. | ||
*<code>DailyIndexRefreshTime</code>: Legt die aktuell gültige ''DailyIndexRefreshTime'' fest, zu der der Medienindex neu aufgebaut werden soll. Der Wert muss ein kompletter Zeitstempel sein (HH:MM:SS). | |||
* <code> | *<code>VolumeD</code>: Verringert die Lautstärke um 10 Einheiten. | ||
* <code> | *<code>VolumeU</code>: Erhöht die Lautstärke um 10 Einheiten. | ||
* <code> | *<code>Volume <VolumeLevel></code>: 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. | ||
* <code> | *<code>Balance</code>: 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. | ||
*<code>VolumeSave <VolumeLevel></code>: 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. | |||
*<code>VolumeRestore</code>: Stellt die mittels VolumeSave gespeicherte Lautstärke wieder her. | |||
* <code> | *<code>CurrentTrackPosition <TimePosition></code>: Setzt die aktuelle Zeitposition im Lied | ||
*<code>Track <TrackNumber></code>: Stellt das Lied an der Position TrackNumber in der Abspielliste als aktuelles Lied ein | |||
* | *<code>PlayURI <SongURI> [Volume]</code>: 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.<br />Folgende Formate werden momentan akzeptiert: | ||
** ''' | **'''UNC-Pfade''': z.B. <code>\\Server\Freigabe\Dateiname.mp3</code>. Erkennungsmerkmal ist der Doppelte Backslash am Anfang. Darstellung aller üblichen Informationen inkl. Cover u.ä. | ||
** '''Sonstige URI-Typen''': z.B. <code>x-sonos-spotify:spotify:track:0jkLC0noG4A4i9lob2gSc3?sid=9& | **'''Web-Streams''': z.B. <code>http://www.energyradio.de/hot</code>. Erkennungsmerkmal ist die Angabe von <code>http://</code> am Anfang. Es werden keine Cover aber Streaminformationen dargestellt. | ||
'''Hinweis''': Das Format der URI, das hier angegeben werden kann, ist stets identisch zum Reading '''currentTrackURI''', das bedeutet, dass die URI, die man dort sieht, hier direkt wieder angegeben werden kann. | **'''Sonstige URI-Typen''': z.B. <code>x-sonos-spotify:spotify:track:0jkLC0noG4A4i9lob2gSc3?sid=9&flags=0</code>. Darstellung aller üblichen Informationen. Die verfügbaren Formate können durch Sonos erweitert/verändert werden.<br />'''Hinweis''': Das Format der URI, das hier angegeben werden kann, ist stets identisch zum Reading '''currentTrackURI''', das bedeutet, dass die URI, die man dort sieht, hier direkt wieder angegeben werden kann.<br />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). | ||
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). | *<code>PlayURITemp <SongURI> [Volume]</code>: 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. | ||
**Für Streams (genauer: Für Dateien, deren Abspiellänge nicht ermittelt werden kann) ist dieser Aufruf identisch zu <code>PlayURI</code>, es wird im Anschluß nichts wiederhergestellt. | |||
* Für Streams (genauer: Für Dateien, deren Abspiellänge nicht ermittelt werden kann) ist dieser Aufruf identisch zu <code>PlayURI</code>, es wird im Anschluß nichts wiederhergestellt. | **Zulässige Formate stehen unter <code>PlayURI</code>. | ||
* Zulässige Formate stehen unter <code>PlayURI</code>. | **'''Achtung!''': Zum Ermitteln der Liedlänge wird u.U. eine zusätzliche Library verwendet (Wenn die Info nicht vom SonosPlayer bereitgestellt wird): <code>MP3::Info</code>. Diese Library muss zusätzlich in das FHEM-Lib-Verzeichnis kopiert werden. | ||
* '''Achtung!''': Zum Ermitteln der Liedlänge wird u.U. eine zusätzliche Library verwendet (Wenn die Info nicht vom SonosPlayer bereitgestellt wird): <code>MP3::Info</code>. Diese Library muss zusätzlich in das FHEM-Lib-Verzeichnis kopiert werden. | **'''Achtung!''': Wenn bereits eine temporäre Ausgabe erfolgt, so wird die Aufforderung mit einer entsprechenden Meldung verworfen. Es kann nur eine geben :-) | ||
* '''Achtung!''': Wenn bereits eine temporäre Ausgabe erfolgt, so wird die Aufforderung mit einer entsprechenden Meldung verworfen. Es kann nur eine | *<code>AddURIToQueue <SongURI></code>: Fügt die angegebene Datei in die aktuelle Abspielliste an die Stelle hinter dem aktuellen Titel hinzu. Ändert nichts am aktuell abgespielten Titel.<br />Zulässige Formate stehen unter <code>PlayURI</code>. | ||
< | **'''Achtung!''': 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 <code>PlayURI</code> direkt (ohne Verwendung der Queue) abgespielt wird. | ||
Zulässige Formate stehen unter <code>PlayURI</code>. | *<code>Speak <Volume> <Language> <Text></code>: Wandelt den angegebenen Text mittels Google in gesprochenen Text um und spielt diesen mittels <code>PlayURITemp</code> 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. | ||
* '''Achtung!''': 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 <code>PlayURI</code> direkt (ohne Verwendung der Queue) abgespielt wird. | **'''Hinweis''': 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. | ||
< | **'''Achtung!''': Für die korrekte Funktionsweise müssen die Attribute <code>targetSpeakDir</code> und <code>targetSpeakURL</code> am Sonos-Device konfiguriert sein (siehe [http://www.fhemwiki.de/wiki/Sonos_Anwendungsbeispiel#Attribute_von_SONOS Attribute von SONOS]). | ||
* '''Hinweis''': 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. | **Mögliche Sprachparameter können bei Google herausgefunden werden. Diese sind z.B. '''de''', '''en''', '''es''', '''fr''', '''it'''... | ||
* '''Achtung!''': Für die korrekte Funktionsweise müssen die Attribute <code>targetSpeakDir</code> und <code>targetSpeakURL</code> am Sonos-Device konfiguriert sein (siehe | **'''Achtung!''': Die Textlänge ist durch Google begrenzt. Wenn die Größe überschritten wird, erhält man eine Fehlermeldung im Log: "''404 Not found''". Leider erhielt ich in meinen Tests unterschiedliche Ergebnisse bzgl. der verwendbaren Länge. Einfach probieren. | ||
* Mögliche Sprachparameter können bei Google herausgefunden werden. Diese sind z.B. '''de''', '''en''', '''es''', '''fr''', '''it'''... | **'''Achtung!''': Wenn bereits eine temporäre Ausgabe erfolgt, so wird die Aufforderung mit einer entsprechenden Meldung verworfen. Es kann nur eine geben :-) | ||
* '''Achtung!''': Die Textlänge ist durch Google begrenzt. Wenn die Größe überschritten wird, erhält man eine Fehlermeldung im Log: "''404 Not | *<code>Alarm <Create|Update|Delete> <ID> <Datenhash></code>: Diese Anweisung wird für die Bearbeitung der Alarme verwendet: | ||
**'''Create''': Erzeugt einen neuen Alarm-Eintrag mit den übergebenen Hash-Daten. | |||
**'''Update''': Aktualisiert den Alarm mit der übergebenen ID und den angegebenen Hash-Daten. | |||
**'''Delete''': Löscht den Alarm-Eintrag mit der übergebenen ID. | |||
**'''Datenhash''': Das Format ist ein Perl-Hash und wird mittels der eval-Funktion interpretiert. Eine Beschreibung befindet sich bei der Dokumentation des Readings '''AlarmList'''<br />e.g.: { Repeat => 1 } | |||
**'''Beispiele''': | |||
***<code>set Sonos_Wohnzimmer Alarm Create 0 { Enabled => 1, Volume => 35, StartTime => '00:00:00', Duration => '00:15:00', Repeat => 0, Shuffle => 0, RoomUUID => 'RINCON_000E5828D0F401400', ProgramURI => 'x-rincon-buzzer:0', ProgramMetaData => ' ', Recurrence_Once => 0, Recurrence_Monday => 1, Recurrence_Tuesday => 1, Recurrence_Wednesday => 1, Recurrence_Thursday => 1, Recurrence_Friday => 1, Recurrence_Saturday => 0, Recurrence_Sunday => 0, IncludeLinkedZones => 0 }</code>: Erzeugt einen neuen Alarm mit den angegebenen Informationen. Die neue ID wird als Ergebnis zurückgegeben. | |||
***<code>set Sonos_Wohnzimmer Alarm Update 17 { Shuffle => 1 }</code>: Aktualisiert den Alarm mit der ID ''17'', und passt dort Shuffle an. | |||
***<code>set Sonos_Wohnzimmer Alarm Delete 17</code>: Löscht den Alarm mit der ID ''17''. | |||
== Definition der InfoSummarize == | == Definition der InfoSummarize == | ||
<pre> | |||
infoSummarizeX := <NormalAudio>:sumElem:</NormalAudio> <StreamAudio>:sumElem:</StreamAudio>| | |||
:sumElem: | :sumElem: | ||
sumElem | sumElem := <:variable:[ prefix=":text:"][ suffix=":text:"][ instead=":text:"] | ||
[ ifempty= | [ ifempty=":text:"][ emptyval=":text:"]/> | ||
variable | variable := TransportState|NumberOfTracks|Track|TrackDuration|Title|Artist|Album| | ||
OriginalTrackNumber|AlbumArtist|Sender|SenderCurrent|SenderInfo|StreamAudio|NormalAudio| | OriginalTrackNumber|AlbumArtist|Sender|SenderCurrent|SenderInfo|StreamAudio|NormalAudio| | ||
AlbumArtURI|Volume|Mute|Shuffle|Repeat|CrossfadeMode|Balance|HeadphoneConnected| | AlbumArtURI|Volume|Mute|Shuffle|Repeat|CrossfadeMode|Balance|HeadphoneConnected|SleepTimer| | ||
RoomName|SaveRoomName|PlayerType|Location|SoftwareRevision|SerialNum|InfoSummarize1| | Presence|RoomName|SaveRoomName|PlayerType|Location|SoftwareRevision|SerialNum| | ||
InfoSummarize1|InfoSummarize2|InfoSummarize3|InfoSummarize4 | |||
text | text := [Beliebiger Text ohne doppelte Anführungszeichen] | ||
Die Unterscheidung zwischen <code> | </pre> | ||
Die Unterscheidung zwischen <code><NormalAudio></code> und <code><StreamAudio></code> liegt bei der anliegenden Musikquelle. Gestreamte Audioquellen habe nur einen kleineren Set an Informationen vorliegen, während bei einer "normalen" Musikquelle z.B. eine Unterscheidung zwischen Artist und Title gemacht wird, und im Gegenzug z.B. kein Sendername existiert.<br /> | |||
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). | 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). | ||
Die Tag-Erweiterungen <code>prefix</code> und <code>suffix</code> werden jeweils vor bzw. hinter den Feldwert in die Ausgabe gesetzt, wenn es einen Feldwert zum Ausgeben gibt. | Die Tag-Erweiterungen <code>prefix</code> und <code>suffix</code> werden jeweils vor bzw. hinter den Feldwert in die Ausgabe gesetzt, wenn es einen Feldwert zum Ausgeben gibt. <br /> | ||
Die Erweiterung <code>instead</code> wird anstatt des Feldwerts ausgegeben, wenn normalerweise der Feldwert ausgegeben werden würde (abhängig davon, ob der Feldwert als ''empty''angesehen wird, oder nicht). | Die Erweiterung <code>instead</code> wird anstatt des Feldwerts ausgegeben, wenn normalerweise der Feldwert ausgegeben werden würde (abhängig davon, ob der Feldwert als ''empty'' angesehen wird, oder nicht).<br /> | ||
Die Erweiterung <code>ifempty</code> wird eingesetzt, wenn es gerade ''keinen''Feldinhalt gibt. In diesem Fall werden natürlich auch keine Pre- und Suffixe sowie Instead-Angaben ausgegeben. | Die Erweiterung <code>ifempty</code> wird eingesetzt, wenn es gerade ''keinen'' Feldinhalt gibt. In diesem Fall werden natürlich auch keine Pre- und Suffixe sowie Instead-Angaben ausgegeben.<br /> | ||
Die Erweiterung <code>emptyval</code> legt fest, was neben einem undefinierten Feldwert noch als ''leer''gelten soll. Dies ist interessant, wenn man z.B. den Zahlwert ''0''als ''leer''festlegen möchte. | Die Erweiterung <code>emptyval</code> legt fest, was neben einem undefinierten Feldwert noch als ''leer'' gelten soll. Dies ist interessant, wenn man z.B. den Zahlwert ''0'' als ''leer'' festlegen möchte.<br /> | ||
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 | 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 :-) | ||
Desweiteren können Verweise auf andere <code>InfoSummarize</code>-Felder nur in aufsteigender Reihenfolge erfolgen. Es sind also keine Vorwärtsreferenzen oder Rekursionen möglich. | Desweiteren können Verweise auf andere <code>InfoSummarize</code>-Felder nur in aufsteigender Reihenfolge erfolgen. Es sind also keine Vorwärtsreferenzen oder Rekursionen möglich. | ||
== Fehlende Kommandos == | == Fehlende Kommandos == | ||
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 | 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 :-) | ||
=== Ideenpipeline === | === Ideenpipeline === | ||
Folgende Ideen sind bereits in der gedanklichen Pipeline. Aber alles Schritt für Schritt und der Reihe nach: | Folgende Ideen sind bereits in der gedanklichen Pipeline. Aber alles Schritt für Schritt und der Reihe nach: | ||
*'''Zonentopologie verwenden/anpassen''': 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 "Szenen" 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). | |||
* '''Zonentopologie verwenden/anpassen''': 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 "Szenen" 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). | |||
Erledigte Ideen: | Erledigte Ideen: | ||
*'''Zwischendurchsage''': Eine Datei abspielen, und danach wieder an der alten Stelle mit der alten Lautstärke weiterspielen (In Version 1.5 hinzugekommen) | |||
* '''Zwischendurchsage''': Eine Datei abspielen, und danach wieder an der alten Stelle mit der alten Lautstärke weiterspielen (In Version 1.5 hinzugekommen) | *'''Beliebige MP3s in die Queue legen oder abspielen''': 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) | ||
* '''Beliebige MP3s in die Queue legen oder abspielen''': 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) | *'''Beliebige Radiostationen abspielen''': 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) | ||
* '''Beliebige Radiostationen abspielen''': 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) | *'''Lautstärkegrenzen festlegen''': 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 ''keine'' 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) | ||
* '''Lautstärkegrenzen festlegen''': 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 ''keine'' 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) | |||
== Beispiele == | == Beispiele == | ||
Hier können mit der Zeit ein paar Beispiele eingestellt werden, um die Möglichkeiten zu verdeutlichen. | Hier können mit der Zeit ein paar Beispiele eingestellt werden, um die Möglichkeiten zu verdeutlichen. | ||
=== Beispiel zum automatischen Abspielen einer Liste nach dem Einschalten eines Players === | === Beispiel zum automatischen Abspielen einer Liste nach dem Einschalten eines Players === | ||
<pre>define Sonos_Wohnzimmer_Appeared_Notify notify Sonos_Wohnzimmer:presence:.appeared { \ | |||
fhem | fhem "set Sonos_Wohnzimmer LoadPlaylist R.%%20Spielliste" ;; \ | ||
fhem | fhem "set Sonos_Wohnzimmer Volume 15" ;; \ | ||
fhem | fhem "set Sonos_Wohnzimmer Track ".(273 + int(rand(60)-30)) ;; \ | ||
fhem | fhem "set Sonos_Wohnzimmer Play" \ | ||
}</ | }</pre> | ||
Hier wird auf das Event '''presence: appeared''' reagiert und eine Playlist geladen (hier mit Leerzeichen im Namen, darum mittels "<code>%20</code"> HTML-kodiert, was wiederum wegen FHEM auf "<code>%%20</code>" kodiert werden muss). Anschließend wird die Lautstärke gesetzt, ein Titel ausgewählt (mit Zufallszahl, im Bereich +-30, damit nicht immer der gleiche Titel kommt) und das Abspielen gestartet. | |||
=== Beispiel für eine Verstärkerschaltung auf Basis des Player-Zustands === | === Beispiel für eine Verstärkerschaltung auf Basis des Player-Zustands === | ||
<pre>define Sonos_Wohnzimmer_GoPlaying_Notify notify Sonos_Wohnzimmer:transportState.*PLAYING { \ | |||
fhem | fhem "delete wohnzimmer_Sonos_Ton_Off_Timer" ;; \ | ||
if (Value('wohnzimmer_Sonos_Ton') ne 'on') { \ | if (Value('wohnzimmer_Sonos_Ton') ne 'on') { \ | ||
fhem | fhem "set wohnzimmer_Sonos_Ton on") \ | ||
} \ | } \ | ||
} | } | ||
define Sonos_Wohnzimmer_GoNotPlaying_Notify notify \ | define Sonos_Wohnzimmer_GoNotPlaying_Notify notify \ | ||
Sonos_Wohnzimmer:transportState.*(STOPPED|PAUSED_PLAYBACK) { \ | Sonos_Wohnzimmer:transportState.*(STOPPED|PAUSED_PLAYBACK) { \ | ||
fhem | fhem "delete wohnzimmer_Sonos_Ton_Off_Timer";; \ | ||
fhem | fhem "define wohnzimmer_Sonos_Ton_Off_Timer at +00:05:00 \ | ||
set wohnzimmer_Sonos_Ton off | set wohnzimmer_Sonos_Ton off" \ | ||
}</ | }</pre> | ||
Hier wird beim Wechsel des <code>transportState</code> auf "<code>PLAYING</code>" der Verstärker angeschaltet, und beim Wechsel auf "<code>STOPPED</code>" oder "<code>PAUSED_PLAYBACK</code>" ein Timer zum Ausschalten des Verstärkers in 5 Minuten definiert.<br />Der Timer ist notwendig, da beim Wechsel zwischen einem "normalen" Titel und einem Radiostream ein kurzer Zwischenwechsel auf "<code>STOPPED</code>" erfolgt, und ich nicht den Verstärker innerhalb von ein paar Sekunden aus- und wieder einschalten will. | |||
=== Beispiel für das Loggen des gerade abgespielten Titels === | === Beispiel für das Loggen des gerade abgespielten Titels === | ||
<pre>define FileLog_Sonos_Wohnzimmer FileLog /etc/fhem/log/Sonos_Wohnzimmer-%Y-%m.log \ | |||
Sonos_Wohnzimmer:infoSummarize2:.{2,} | Sonos_Wohnzimmer:infoSummarize2:.{2,} | ||
attr FileLog_Sonos_Wohnzimmer room Sonos</ | attr FileLog_Sonos_Wohnzimmer room Sonos</pre> | ||
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 :-) | |||
=== Beispiel für eine Stummschaltung bei einem Anruf === | === Beispiel für eine Stummschaltung bei einem Anruf === | ||
<pre> | |||
define fritzBox_anrufstartring_notify notify fritzBox:.*ring set Sonos_Wohnzimmer VolumeSave 15 | |||
define fritzBox_anrufstartcall_notify notify fritzBox:.*call set Sonos_Wohnzimmer VolumeSave +0 | define fritzBox_anrufstartcall_notify notify fritzBox:.*call set Sonos_Wohnzimmer VolumeSave +0 | ||
define fritzBox_anrufende_notify notify fritzBox:.*disconnect set Sonos_Wohnzimmer VolumeRestore</ | define fritzBox_anrufende_notify notify fritzBox:.*disconnect set Sonos_Wohnzimmer VolumeRestore | ||
</pre> | |||
Der Trigger auf 'call' existiert nur, damit ausgehende Telefonate beim Beenden nicht die Lautstärke verändern. Das passiert, weil das Disconnected-Event auch nach ausgehenden Anrufen kommt.<br />Das Beispiel kann man natürlich noch beliebig erweitern, vielleicht etwas mit Anrufererkennung usw. | |||
=== Beispiel für eine Anrufsignalisierung per MP3 bei einem Anruf === | === Beispiel für eine Anrufsignalisierung per MP3 bei einem Anruf === | ||
<pre> | |||
PlayURITemp \\Server\Audio\RingRingRing.mp3 30</ | define fritzBox_anrufstartringsong_notify notify fritzBox:.*ring set Sonos_Wohnzimmer \ | ||
PlayURITemp \\Server\Audio\RingRingRing.mp3 30 | |||
</pre> | |||
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. | 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. | ||
=== Beispiel für beide Varianten beim Telefonanruf gleichzeitig === | === Beispiel für beide Varianten beim Telefonanruf gleichzeitig === | ||
<pre> | |||
define fritzBox_anrufstartring_notify notify fritzBox:.*ring set Sonos_Wohnzimmer VolumeSave 15 \ | |||
;; set Sonos_Wohnzimmer PlayURITemp \\Server\Audio\RingRingRing.mp3 30 | ;; set Sonos_Wohnzimmer PlayURITemp \\Server\Audio\RingRingRing.mp3 30 | ||
define fritzBox_anrufstartcall_notify notify fritzBox:.*call set Sonos_Wohnzimmer VolumeSave +0 | define fritzBox_anrufstartcall_notify notify fritzBox:.*call set Sonos_Wohnzimmer VolumeSave +0 | ||
define fritzBox_anrufende_notify notify fritzBox:.*disconnect set Sonos_Wohnzimmer VolumeRestore</ | define fritzBox_anrufende_notify notify fritzBox:.*disconnect set Sonos_Wohnzimmer VolumeRestore | ||
</pre> | |||
Dieses Beispiel soll nur die Kombinationsmöglichkeiten verdeutlichen, und hat mehr spielerischen Character. | Dieses Beispiel soll nur die Kombinationsmöglichkeiten verdeutlichen, und hat mehr spielerischen Character. | ||
=== Beispiel für eine Sprachdurchsage auf Basis eines Notify === | === Beispiel für eine Sprachdurchsage auf Basis eines Notify === | ||
<pre> | |||
define wohnzimmer_Tastenfeld_1_Notify notify wohnzimmer_Tastenfeld_1 set Sonos_Wohnzimmer Speak \ | |||
45 de Hier dann die Textnachricht, wie sie auf dem Player ausgegeben werden soll. | 45 de Hier dann die Textnachricht, wie sie auf dem Player ausgegeben werden soll. | ||
define wohnzimmer_Tastenfeld_2_Notify notify wohnzimmer_Tastenfeld_2 set Sonos_Wohnzimmer Speak \ | define wohnzimmer_Tastenfeld_2_Notify notify wohnzimmer_Tastenfeld_2 set Sonos_Wohnzimmer Speak \ | ||
+10 de Hier dann die Textnachricht, wie sie auf dem Player ausgegeben werden soll. | +10 de Hier dann die Textnachricht, wie sie auf dem Player ausgegeben werden soll. | ||
define wohnzimmer_Tastenfeld_3_Notify notify wohnzimmer_Tastenfeld_3 set Sonos_Wohnzimmer Speak \ | define wohnzimmer_Tastenfeld_3_Notify notify wohnzimmer_Tastenfeld_3 set Sonos_Wohnzimmer Speak \ | ||
+0 en Hello, this is a short Message.</ | +0 en Hello, this is a short Message. | ||
1: Hier wird auf Basis eines Notify (hier ein FS20-Taster) eine Textnachricht auf Deutsch mit der Lautstärke 45 auf dem SonosPlayer ausgegeben. | </pre> | ||
2: Hier wird eine deutsche Textnachricht mit 10 Einheiten lauter als aktuell eingestellt ausgegeben. | |||
1: Hier wird auf Basis eines Notify (hier ein FS20-Taster) eine Textnachricht auf Deutsch mit der Lautstärke 45 auf dem SonosPlayer ausgegeben.<br /> | |||
2: Hier wird eine deutsche Textnachricht mit 10 Einheiten lauter als aktuell eingestellt ausgegeben.<br /> | |||
3: Hier wird eine englische Textnachricht mit der gleichen Lautstärke wie aktuell eingestellt ausgegeben. | 3: Hier wird eine englische Textnachricht mit der gleichen Lautstärke wie aktuell eingestellt ausgegeben. | ||
=== Beispiel zu InfoSummarize === | === Beispiel zu InfoSummarize === | ||
Standard, wie er angelegt wird: | Standard, wie er angelegt wird: | ||
<pre> | |||
InfoSummarize1 = <NormalAudio><Artist prefix="(" suffix=")"/>\ | |||
<Title prefix=" '" suffix="'" ifempty="[Keine Musikdatei]"/>\ | |||
<Album prefix=" vom Album '" suffix="'"/></NormalAudio> \ | |||
<StreamAudio><Sender suffix=":"/>\ | |||
<SenderCurrent prefix=" '" suffix="' -"/>\ | |||
<SenderInfo prefix=" "/></StreamAudio> | |||
InfoSummarize2 = <TransportState/><InfoSummarize1 prefix=" => "/> | |||
InfoSummarize3 = <Volume prefix="Lautstärke: "/>\ | |||
<Mute instead=" ~ Kein Ton" ifempty=" ~ Ton An" emptyval="0"/>\ | |||
~ Balance: <Balance ifempty="Mitte" emptyval="0"/>\ | |||
<HeadphoneConnected instead=" ~ Kopfhörer aktiv" ifempty=" ~ Kein Kopfhörer" \ | |||
emptyval="0"/> | |||
</pre> | |||
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. | 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. | ||
[[ | |||
[[ | [[Category:Examples]] | ||
[[Category:HOWTOS]] | |||
[[Category:Code Snippets]] |
Version vom 15. Mai 2013, 14:41 Uhr
Dieses Anwendungsbeispiel soll den Einstieg in die Steuerung der heimischen Zoneplayer der Firma Sonos erleichtern. Es werden die Verwendung und Einrichtung der dazugehörenden Module SONOS und SONOSPLAYER beschrieben, und einige Beispiele für eine mehr oder weniger sinnvolle Nutzung von Events und Steuerungsmöglichkeiten gegeben. Sollte etwas fehlen oder unklar sein, dann einfach eine kurze Nachricht an den Autor.
Diese Module sind noch keine offiziellen FHEM-Module und sind noch nicht direkt verfügbar. Sie müssen momentan noch von Hand installiert werden.
Kurzüberblick
Hier soll nur ein kurzer Überblick über die mittlerweile doch recht umfangreichen Möglichkeiten geboten werden:
- Automatisches Erkennen aller ZonePlayer im lokalen Netzwerk
- Automatische Aktualisierung aller aktuellen Titelinformationen innerhalb von FHEM
- Dabei wird für jede veränderte Information ein Event erzeugt, man kann also dediziert darauf reagieren
- Es können auch verschiedene Zusammenfassungen der bestehenden Informationen zusammengestellt werden
- Anzeige des aktuellen Covers als Weblink
- Steuern der ZonePlayer: Play, Pause, Nächster Titel, Vorheriger Titel, Lautstärke Lauter/Leiser, Stummschalten
- Einstellen und Abfragen der Abspielparameter Repeat, Shuffle und CrossfadeMode
- Festlegen einer minimalen und maximalen Lautstärke für jeden ZonePlayer (getrennt zwischen Normalbetrieb und Kopfhörernutzung)
- Laden und Speichern von Playlisten
- Abspielen beliebiger Titel (auch von Freigaben, die nicht von Sonos indiziert wurden)
- Abspielen beliebiger Radiostationen über deren HTTP-Link
- Hinzufügen beliebiger Titel und Radiostationen zur aktuellen Abspielliste
- Temporäres Abspielen von Dateien, mit nachfolgender Wiederherstellung des vorherigen Titels inkl. genauer Position im Titel und der Lautstärke
- Erzeugen und temporäres Abspielen von Sprachdurchsagen auf Basis von eingegebenen Texten (wird über die Google-Übersetzungsmaschine realisiert)
- Auslesen der verfügbaren gespeicherten Playlisten und Radiofavoriten
- Erzeugung und Bearbeitung von Alarmen, sowie Event bei Veränderung der Alarme duch andere Controller
- Setzen des Sleeptimer inkl. Fhem-Event bei Veränderung durch andere Controller und Ablauf des Timers
Einbindung von Sonos in FHEM
Die Einbindung erfolgt über die beiden Module SONOS und SONOSPLAYER. Dabei ist Hauptsächlich das Modul SONOS einzurichten. Alle Zoneplayer werden automatisch erkannt, und dann entsprechend angelegt:
define Sonos SONOS
Der Name dieses Devices ist automatisch das Namensprefix beim Anlegen der SonosPlayer. In diesem Fall werden alle erkannten Zoneplayer mit dem Prefix "Sonos_
" anfangen.
Natürlich kann man das nach dem Anlegen einfach umbenennen.
Achtung! Dieses Modul benötigt für die Signalisierung von Readings-Änderungen an den Haupt FHEM-Teil einen definierten TelnetPort. Die entsprechende Anweisung dazu muss also vor dieser Sonos-Definition bereits erfolgt sein.
Erkannte Zoneplayer werden als SONOSPLAYER-Device angelegt:
define Sonos_Wohnzimmer SONOSPLAYER RINCON_000E5828D0F401400_MR
Der Name des Device wird aus dem Namen des SONOS-Device und dem Namen der Zone gebildet. Dabei werden Leer- und Sonderzeichen in "_
" umgewandelt.
Beim Anlegen werden automatisch einige Attribute mit angelegt:
attr Sonos_Wohnzimmer generateInfoSummarize1 <NormalAudio><Artist prefix="(" suffix=")"/> <Title prefix=" '" suffix="'" ifempty="[Keine Musikdatei]"/> <Album prefix=" vom Album '" suffix="'"/></NormalAudio> <StreamAudio><Sender suffix=":"/><SenderCurrent prefix=" '" suffix="' -"/> <SenderInfo prefix=" "/></StreamAudio> attr Sonos_Wohnzimmer generateInfoSummarize2 <TransportState/><InfoSummarize1 prefix=" => "/> attr Sonos_Wohnzimmer generateInfoSummarize3 <Volume prefix="Lautstärke: "/> <Mute instead=" ~ Kein Ton" ifempty=" ~ Ton An" emptyval="0"/> ~ Balance: <Balance ifempty="Mitte" emptyval="0"/> <HeadphoneConnected instead=" ~ Kopfhörer aktiv" ifempty=" ~ Kein Kopfhörer" emptyval="0"/> attr Sonos_Wohnzimmer icon icoSONOSPLAYER_icon-ZP90.png attr Sonos_Wohnzimmer room Sonos attr Sonos_Wohnzimmer stateVariable InfoSummarize2 attr Sonos_Wohnzimmer webCmd Play:Pause:Previous:Next:VolumeD:VolumeU:MuteT attr Sonos_Wohnzimmer group Wohnzimmer
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.
Das Attribut "room
" wird wieder aus dem Namen des SONOS-Device gebildet.
Das Attribut "group
" wird aus dem Namen der Zone gebildet
Desweiten wird automatisch ein Weblink mit angelegt:
define AlbumArt_Wohnzimmer weblink image fhem/icons/SONOSPLAYER/Sonos_Wohnzimmer_AlbumArt attr AlbumArt_Wohnzimmer room Sonos attr AlbumArt_Wohnzimmer htmlattr width="200" height="200" attr AlbumArt_Wohnzimmer group Wohnzimmer
Damit wird in der Raumansicht direkt über dem SonosPlayer-Device das Cover des aktuellen Titels angezeigt.
Hardwarevoraussetzungen
Diese Liste sollte im Laufe der Zeit fortgeführt werden. Es soll die Hardware-/Softwarevoraussetzungen festhalten, um Probleme im Vorfeld erkennen zu können.
Funktionierende Kombinationen:
- Windows, ActivePerl
- Raspberry Pi, Default-Perl
Problematische Kombinationen:
- FritzBox: Anscheinend ist Perl dort ohne Thread-Möglichkeit kompiliert. Diese sind aber essentiell notwendig für dieses Modul.
Softwarevoraussetzungen
Für die Verwendung sind Perlmodule notwendig, die unter Umständen noch nachinstalliert werden müssen:
- LWP::Simple
- LWP::UserAgent
- SOAP::Lite
- HTTP::Request
Die Installation dieser Module geht in der Regel per CPAN. Das bedeutet das zum Beispiel mit
sudo cpan LWP::Simple
das Modul "LWP::Simple
" installiert wird. Wenn man bereits als Benutzer root arbeitet, dann ist das sudo
natürlich nicht nötig.
Sollte es bei der Installation mittels CPAN zu Problemen kommen, dann folgt hier eine Beschreibung der manuellen Installation.
Hinweis für Debian-Systeme
Bei Debian-basierten Systemen (also auch Raspbian für den Raspberry Pi usw.) kann auch mittels
sudo apt-get install <paketname>
installiert werden. Manchmal ist es etwas schwieriger, die Paketnamen zu ermitteln, aber Google ist da sehr hilfreich.
Hier mal die Liste für die oben genannten Pakete:
- LWP::Simple-Paketname (inkl. LWP::UserAgent und HTTP::Request):
libwww-perl
- SOAP::Lite-Paketname:
libsoap-lite-perl
Manuelle Installation LWP::Simple
Wenn sich dieses Paket nicht einfach per CPAN-Anweisung installieren läßt, dann hilft folgende Anleitung weiter. Beim Abbruch der Installation mittels CPAN erscheint mittendrin ein Fehler, das die Datei nicht entpackt werden könne (couldn't untar). Da scheint es einen Fehler im Installationsskript zu geben.
Man kann das aber auch Manuell installieren:
- Am Einfachsten ist ein Wechsel in den Kontext des Benutzers root: "
sudo su -
" - Erstellen eines Ordners, z.B. "
mkdir lwpsimple
" - Wechsel in diesen Ordner "
cd lwpsimple
" - Herunterladen der Datei von libwww-perl-6.04 oder direkter Link: libwww-perl-6.04.tar.gz: z.B. "
wget http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/libwww-perl-6.04.tar.gz
" - Entpacken der Datei: "
tar -xzvf libwww-perl-6.04.tar.gz
" - Wechsel in das neu entstandene Verzeichnis: "
cd libwww-perl-6.04
" - Nun kann es nach dem Standardvorgehen weitergehen:
- "
perl Makefile.PL
" - "
make
" - "
make install
"
- "
Manuelle Installation SOAP::Lite
Wenn sich dieses Paket nicht einfach per CPAN-Anweisung installieren läßt, dann hilft folgende Anleitung weiter. Beim Abbruch der Installation mittels CPAN erscheint mittendrin ein Fehler, das die Datei nicht entpackt werden könne (couldn't untar). Da scheint es einen Fehler im Installationsskript zu geben.
Man kann das aber auch Manuell installieren:
- Am Einfachsten ist ein Wechsel in den Kontext des Benutzers root: "
sudo su -
" - Erstellen eines Ordners, z.B. "
mkdir soaplite
" - Wechsel in diesen Ordner "
cd soaplite
" - Herunterladen der Datei von CPAN-SOAP-Lite-0.715 oder direkter Link: SOAP-Lite-0.715.tar.gz: z.B. "
wget http://mirror.informatik.uni-mannheim.de/pub/mirrors/CPAN/authors/id/M/MK/MKUTTER/SOAP-Lite-0.715.tar.gz
" - Entpacken der Datei: "
tar -xzvf SOAP-Lite-0.715.tar.gz
" - Wechsel in das neu entstandene Verzeichnis: "
cd SOAP-Lite-0.715
" - Nun kann es nach der Anleitung weitergehen:
- "
perl Makefile.PL
" - Dann kommt eine Nachfrage, was zusammengebaut werden soll. An dieser Stelle ist es jetzt wie eine normale CPAN Installation. Einfach mit <Enter> weitermachen lassen.
- "
make
" - "
make install
"
- "
Einrichtung von Samba für Sprachausgabemöglichkeit
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.
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:
- Lokales Verzeichnis für die Ablage der Tondateien erzeugen. z.B.:
sudo mkdir /mnt/SonosSpeak
- Installation der notwendigen Pakete für Samba:
sudo apt-get install samba samba-common-bin
- Starten des Editors zum Anpassen der Konfigurationsdatei:
sudo nano /etc/samba/smb.conf
- Folgende Zeilen hinzufügen (Pfade müssen natürlich u.U. angepasst werden):
[SonosSpeak] comment = Audio-Files for SonosPlayer to Speak read only = false path = /mnt/SonosSpeak guest ok = yes
- Samba-Server neustarten:
sudo /etc/init.d/samba restart
Damit wird eine Freigabe mit dem Namen SonosSpeak erzeugt, die von allen ohne Anmeldung gelesen werden kann.
Interner Aufbau
Um die Kommunikation mit dem UPnP-Netzwerk parallel zum normalen Betrieb von FHEM zu ermöglichen, werden Threads eingesetzt. Dadurch sind manche Hardwareplattformen leider überfordert und können u.U. nicht mit diesem Modul verwendet werden.
Das läßt sich aus technologischen Gründen auch nicht umgehen.
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 Queue "nach oben" zum Hauptthread übertragen, und dann mittels eines Telnetaufrufs die Verarbeitung im Hauptthread angestossen.
Dadurch wird gewährleistet, dass die Daten immer im Hauptthread (also dem "eigentlichen" FHEM-Thread) verfügbar sind.
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.
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: "SONOS_
", wobei der Unterstrich durch die Nummer des aktiven, loggenden Threads ersetzt wird. Damit kann man sehr leicht feststellen, auf welcher "Ebene" diese Ausgabe erfolgt ist, und ob das alles so seine Richtigkeit hat.
Durch diese getrennten Schichten, und bedingt durch die Einschränkung des freien Aufbaus meiner Kommandoqueue, müssen oftmals auf "der anderen Seite" Objekte herausgesucht werden, die man auf "seiner Seite" der Queue eigentlich bereits zur Hand hatte. Das nimmt etwas Zeit in Anspruch, wirkte sich in meinen Tests aber nicht sonderlich nachteilig auf die Perfomance aus.
Der Rest sind nur viele Zeilen, die XML-Strukturen (mittels regulärer Ausdrücke) parsen oder erzeugen, und die entsprechenden Informationen setzen oder abfragen.
Installation
Dieser Part ist nur solange interessant, wie das Modul (noch) nicht offiziell ist.
Für den Betrieb ist das Modul PerlUPnP notwendig.
Folgende Dateien sind nötig:
- 00_SONOS.pm
- 21_SONOSPLAYER.pm
- 2 Dateien der PerlUPnP-Library
- Dateien für MP3-Tags bei der Sprachausgabe (Wenn nicht vorhanden, fehlt nur die Funktionalität, das Modul sollte aber dennoch lauffähig sein)
- Die unter Softwarevoraussetzungen genannten Perlmodule
Die beiden SONOS-Perlmodule müssen einfach in das Verzeichnis FHEM
kopiert werden (wie alle anderen FHEM-Module auch).
Die PerlUPnP-Library muss komplett in das Verzeichnis FHEM/lib/
abgelegt werden. Dabei muss das Verzeichnis UPnP
genannt werden.
Es werden für den Betrieb nicht alle Dateien des Standard-Pakets benötigt, sondern nur zwei .pm Dateien.
Die resultierende Ordnerstruktur (inkl. Dateien von PerlUPnP) lautet dann wie folgt:
- FHEM/lib
- FHEM/lib/UPnP
- FHEM/lib/UPnP/Common.pm
- FHEM/lib/UPnP/ControlPoint.pm
Die Dateien für die MP3-Tags müssen ebenfalls in das Verzeichnis lib
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.
Die Laufzeit z.B. wird für die Pausenberechnung aber gebraucht, und muss dementsprechend auf anderem Wege ermittelt werden.
Die resultierende Ordnerstruktur lautet dann wie folgt:
- FHEM/lib/
- FHEM/lib/MP3
- FHEM/lib/MP3/Tag.pm
- FHEM/lib/MP3/Info.pm
- FHEM/lib/MP3/Tag
- FHEM/lib/MP3/Tag/File.pm
- FHEM/lib/MP3/Tag/LastResort.pm
- FHEM/lib/MP3/Tag/ImageExifTool.pm
- FHEM/lib/MP3/Tag/CDDB_File.pm
- FHEM/lib/MP3/Tag/ID3v2_Data.pod
- FHEM/lib/MP3/Tag/ImageSize.pm
- FHEM/lib/MP3/Tag/ID3v1.pm
- FHEM/lib/MP3/Tag/ParseData.pm
- FHEM/lib/MP3/Tag/Cue.pm
- FHEM/lib/MP3/Tag/ID3v2.pm
- FHEM/lib/MP3/Tag/Inf.pm
- FHEM/lib/Normalize
- FHEM/lib/Normalize/Text
- FHEM/lib/Normalize/Text/Music_Fields.pm
- FHEM/lib/Normalize/Text/Music_Fields
- FHEM/lib/Normalize/Text/Music_Fields/Music_Fields-rus.lst
- FHEM/lib/Normalize/Text/Music_Fields/G_Gershwin.comp
- FHEM/lib/Normalize/Text/Music_Fields/A_Dvor_k.comp
- FHEM/lib/Normalize/Text/Music_Fields/J_Brahms.comp
- FHEM/lib/Normalize/Text/Music_Fields/L_van_Beethoven.comp
- FHEM/lib/Normalize/Text/Music_Fields/A_Schnittke.comp
- FHEM/lib/Normalize/Text/Music_Fields/D_Shostakovich.comp
- FHEM/lib/Encode
- FHEM/lib/Encode/transliterate_win1251.pm
Nach einem Neustart von FHEM kann das Modul wie beschrieben verwendet werden.
Modul SONOS
Dieses Modul erledigt die eigentliche Kommunikationsarbeit zu den ZonePlayern mittles UPnP. Es startet (und läßt ihn dauerhaft laufen) einen Discovery Prozess, der alle ZonePlayer auffordert, sich zu melden, und reagiert auf entsprechende Signalisierungen. Es instantiiert einen Listener und meldet diesen bei allen ZonePlayern für Abspielaktualisierungen an.
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.
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.
Wenn das Feature mit minVolume
oder maxVolume
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.
Als Nebeneffekt wird für jede Lautstärkenänderung auch ein Event in FHEM erzeugt (als Folge einer Aktualisierung des Readings Volume
).
Attribute von SONOS
pingType(tcp,udp,icmp,syn)
: Definiert die Art, wie der Alive-Check eines Zoneplayers erfolgen soll. Die Verfahren funktionieren unterschiedlich gut. Am Ressourcensparsamsten ist icmp, benötigt aber "root
"-Rechte. An zweiter Stelle ist syn zu empfehlen. Die anderen Verfahren melden manchmal fehlerhafte not alives. Einfach probieren.targetSpeakDir
: Das Verzeichnis, in dem dieses Modul die Sprachdateien vonSpeak
(siehe Set-Befehle an den SONOSPLAYER) ablegen soll. Es wird empfohlen, dass dieses Verzeichnis nicht von Sonos indiziert ist.
z.B. Pfade unter *Nix:/home/www/Sonos
oder unter Windows:C:\InetPub\Sonos
targetSpeakURL
: Die URL, unter der von außen auf die abgelegte Sprachdatei zugegriffen werden kann.
z.B.\\192.168.178.45\Sonos
targetSpeakFileTimestamp(0,1)
: Definiert, ob in der Sprachausgabedatei ein Zeitstempel enthalten sein soll. Das sorgt dafür, dass alle Dateien beibehalten werden (da nicht mit demselben Namen überschrieben wird).
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.
Anderseits muss man sich dabei Gedanken über eine Aufräumstrategie machen, da die alten Dateien immer vorhanden bleiben.
Modul SONOSPLAYER
Dieses Modul dient im großen und ganzen als Platzhalter für FHEM, damit der Anwender FHEM-Konform informiert werden, bzw. steuern kann.
Hier werden die Informationen, die vom SONOS-Modul erkannt werden, abgelegt, und die Aktualisierungs-Events erzeugt.
Readings von SONOSPLAYER
Folgende Informationen werden im SONOSPLAYER als Reading abgelegt:
- Grundlegendes
presence
: Erreichbarkeit des Players. Kann "appeared" oder "disappeared" seinroomName
: Originalname des ZonePlayers. Kann Leer- oder Sonderzeichen enthaltensaveRoomName
: Sicherer Name des Zoneplayer. Sonderzeichen wurden in Unterstriche umgewandelt. Das Device wird beim Anlegen mit diesem Namen angelegtplayerType
: Typbezeichnung des ZonePlayer. z.B. "ZP90"location
: URL zum Informationsdokument des ZonePlayerssoftwareRevision
: Version der installierten Software. z.B. "3.8.4"serialNum
: Seriennummer des ZonePlayers. Entspricht weitestgehend der MAC-Adresse. z.B. "00-0E-58-28-D0-F4:2"LastGetActionName
: Enthält den Namen der letzten Get-AnweisungLastGetActionResult
: Enthält das Ergebnis der letzten Get-AnweisungLastSetActionName
: Enthält den Namen der letzten Set-AnweisungLastSetActionResult
: Enthält das Ergebnis der letzten Set-AnweisungVolume
: Enthält im Normalfall die am Player eingestellte Laustärke zum Zeitpunkt der Erkennung. Wenn eines der beiden AttributeminVolume
odermaxVolume
gesetzt wurde, wird diese Lautstärke bei jeder Änderung am Player mit aktualisiert.
Wenn zusätzlich noch das AttributgenerateVolumeEvent
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.Mute
: Enthält, wenn eines der beiden AttributeminVolume
odermaxVolume
gesetzt wurde, den aktuellen Zustand des Mute.
Wenn zusätzlich noch das AttributgenerateVolumeEvent
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.Shuffle
: Enthält den aktuellen Zustand von Shuffle. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation).Repeat
: Enthält den aktuellen Zustand von Repeat. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation).CrossfadeMode
: Enthält den aktuellen Zustand von CrossfadeMode. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation).Balance
: Enthält im Normalfall die am Player eingestellte Balance zum Zeitpunkt der Erkennung. Wenn eines der beiden AttributeminVolume
odermaxVolume
gesetzt wurde, wird diese Balance bei jeder Änderung am Player mit aktualisiert.
Wenn zusätzlich noch das AttributgenerateVolumeEvent
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.HeadphoneConnected
: Enthält, wenn eines der beiden AttributeminVolume
odermaxVolume
(oder auchminVolumeHeadphone
undmaxVolumeHeadphone
) gesetzt wurde, den Zustand, ob ein Kopfhörer verwendet wird, oder nicht.
Wenn zusätzlich noch das AttributgenerateVolumeEvent
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.SleepTimer
: Enthält die Restzeit des Sleeptimers. Diese Information wird vom Player beim setzen und ablaufen gemeldet, und erzeugtnsomit ein Event zu Beginn und Ende des Timers. Während der Timer läuft, wird hier nix aktualisier. Man muss also, falls benötigt, selber die verbleibende Restzeit mittels des Readings-Timestamps und diesem Wert ermitteln.
Diese Information wird automatisch aktualisiert, wenn sie bei einem Player verändert wird.SleepTimerVersion
: Dieses Reading enthält die Information über die aktuelle Version der gespeicherten SleepTimer-Informationen. Diese Information wird Hauptsächlich intern benötigt, um beurteilen zu können, ob das Reading SleepTimer neu geladen werden muss.DailyIndexRefreshTime
: Enthält die aktuell gültige DailyIndexRefreshTime, zu der der Medienindex neu aufgebaut werden soll.
Diese Information wird automatisch aktualisiert, wenn sie bei einem Player verändert wird, wenn das Attribut getAlarms des Player auf 1 gesetzt wurde.AlarmList
: Enthält den Hash mit den aktuell für diesen Player gültigen Alarminformationen. Diese Information wird automatisch aktualisiert, wenn das Attribut getAlarms auf 1 gesetzt wurde, ansonsten steht sie nicht zur Verfügung. Das Format des Hashs entspricht dem, das zum Setzen oder Anpassen eines Alarms notwendig ist.
Folgene Schlüssel sind dort zulässig/notwendig:- Enabled(0,1): Gibt an, ob der Alarm aktiviert ist.
- Volume(0..100): Die Lautstärke, mit der der Alarm wiedergegeben werden soll.
- StartTime(Timstamp): Die Uhrzeit, zu der Alarm starten soll.
- Duration(Timstamp): Die Dauer, die der Alarm laufen soll.
- Repeat(0,1): Gibt an, ob die Wiedergabe wiederholt werden soll.
- Shuffle(0,1): Gibt an, ob die Wiedergabe zufällig erfolgen soll.
- RoomUUID: Die ID der Zone, in der der Alarm wiedergegeben werden soll.
- ProgramURI: Die abzuspielende URI.
- ProgramMetaData: Die Metadaten zu der abzuspielenden URI.
- Recurrence_Once(0,1): Gibt an, dass der Alarm nur einmal laufen soll. Wenn hier eine 1 angegeben wurde, dann werden die anderen Recurrence-Angaben ignoriert.
- Recurrence_Monday(0,1): Gibt an, dass der Alarm jeden Montag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.
- Recurrence_Tuesday(0,1): Gibt an, dass der Alarm jeden Dienstag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.
- Recurrence_Wednesday(0,1): Gibt an, dass der Alarm jeden Mittwoch laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.
- Recurrence_Thursday(0,1): Gibt an, dass der Alarm jeden Donnerstag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.
- Recurrence_Friday(0,1): Gibt an, dass der Alarm jeden Freitag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.
- Recurrence_Saturday(0,1): Gibt an, dass der Alarm jeden Samstag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.
- Recurrence_Sunday(0,1): Gibt an, dass der Alarm jeden Sonntag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.
- IncludeLinkedZones(0,1): Gibt an, ob die aktuell verlinkten Zonen diesen Alarm ebenfall abspielen sollen.
- Beispiel-Hash: { Enabled => 1, Volume => 12, StartTime => '16:00:00', Duration => '00:15:00', Repeat => 0, Shuffle => 0, RoomUUID => 'RINCON_000E5828D0F401400', ProgramURI => 'x-rincon-buzzer:0', ProgramMetaData => ' ', Recurrence_Once => 0, Recurrence_Monday => 1, Recurrence_Tuesday => 1, Recurrence_Wednesday => 1, Recurrence_Thursday => 1, Recurrence_Friday => 1, Recurrence_Saturday => 0, Recurrence_Sunday => 0, IncludeLinkedZones => 0 }
AlarmListIDs
: Enthält die Hash-Schlüssel der Alarme als komma-separierte Liste. Dieses Reading gibt es Hauptsächlich zur Vereinfachung des Zugriffs auf das Reading AlarmList. Damit hat man direkt die Anzahl und Primärschlüssel im Zugriff.AlarmListVersion
: 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.
- Infos zum aktuellen Titel
currentTitle
: Titelbezeichnung des aktuellen TitelscurrentArtist
: Interpret des aktuellen TitelscurrentAlbum
: Albumname zum aktuellen TitelcurrentAlbumArtist
: Interpret des Albums. Kann z.B. auch "(compilations)" sein, wenn mit iTunes verwaltetcurrentOriginalTrackNumber
: Nummer des aktuellen Titels bezogen auf das AlbumcurrentTrack
: Nummer des aktuellen Titels in der AbspiellistecurrentTrackURI
: Dateipfad des aktuellen Titels in der Abspielliste. Gültige Formate siehe PlayURI.currentTrackDuration
: Länge des aktuellen Titels im Format H:MM:SScurrentSender
: Senderbezeichnung, wenn es ein Radiostram istcurrentSenderCurrent
: Zusatzinformationen zur Radiosendung, meist der Programmtitel wie 'Pop&Weck'currentSenderInfo
: Zusatzinforationen zur Radiosendung, meist der Titel des aktuellen LiedescurrentAlbumArtURI
: Relativer Verzeichnis-Pfad im lokalen FHEM (physisch). Beginnt momentan mit "www"infoSummarize1
: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize]infoSummarize2
: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize]infoSummarize3
: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize]infoSummarize4
: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize]currentStreamAudio
: Boolean. 1 wenn gerade ein Radiostream läuft, sonst 0. Momentan faktisch Negation zu <normalAudio>currentNormalAudio
: Boolean. 1 wenn gerade ein normaler Titel läuft, sonst 0. Momentan faktisch Negation zu <streamAudio>
- Infos zum Gesamtstatus
transportState
: Aktueller Abspielstatus. Kann "ERROR", "STOPPED", "PLAYING" oder "PAUSED_PLAYBACK" sein. Wobei ERROR heißt, dass es keine Verbindung zum Player gibtnumberOfTracks
: Anzahl der momentan in der Abspielliste befindlichen TitelCurrentTempPlaying
: Boolean. 1 wenn gerade eine Temporäre Ausgabe (PlayURITemp
oderSpeak
) auf dem ZonePlayer läuft, 0, wenn der Player frei ist.
Attribute von SONOSPLAYER
disable(0,1)
: Deaktiviert die Verarbeitung von Events dieses DevicesgenerateVolumeSlider(0,1)
: Aktiviert einen Slider für die Lautstärkeneinstellung auf der Detailansicht. Standardmäßig ist dieser aktiviert (=1).generateVolumeEvent(0,1)
: Aktiviert die Generierung eines Events bei Lautstärkeänderungen, wenn mindestens eines der AttributeminVolume
,maxVolume
,minVolumeHeadphone
odermaxVolumeHeadphone
definiert ist. Standardmäßig ist dies deaktiviert (=0), um die Zeitverzögerung so gering wie möglich zu halten.generateInfoAnswerOnSet(0,1)
: Wenn auf 1 gesetzt (Standard), dann wird auf Set-Andorderungen mit Texten und neuen Einstellungswerten geantwortet, wenn 0, dann gibt Set immer "undef
" zurück. Damit wird erreicht, dass in der Übersichtsanzeige nach dem Drücken eines WebCmd diesselbe Seite wieder angezeigt wird, und man direkt weitersteuern kann. Der Wert vonLastSetActionResult
bzw.LastGetActionResult
wird natürlich trotzdem gesetzt.generateSomethingChangedEvent(0,1)
: Bestimmt, ob ein Event mit dem Namen 'SomethingChanged' generiert werden soll, wenn überhaupt ein Event generiert wurde. Das ist nützlich, wenn man auf eine beliebige Änderung des Player reagieren möchte.generateInfoSummarize1
: Generiert das Reading 'InfoSummarize1' mit dem angegebenen Format.generateInfoSummarize2
: Generiert das Reading 'InfoSummarize2' mit dem angegebenen Format.generateInfoSummarize3
: Generiert das Reading 'InfoSummarize3' mit dem angegebenen Format.generateInfoSummarize4
: Generiert das Reading 'InfoSummarize4' mit dem angegebenen Format.stateVariable(TransportState,NumberOfTracks,Track,TrackDuration,Title,Artist,Album,
OriginalTrackNumber,AlbumArtist,Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,
: Legt fest, welcher Variablenwert in den State geschrieben werden soll.
AlbumArtURI,Volume,Mute,Shuffle,Repeat,CrossfadeMode,Balance,HeadphoneConnected,SleepTimer,
Presence,RoomName,SaveRoomName,PlayerType,Location,SoftwareRevision,SerialNum,InfoSummarize1,
InfoSummarize2,InfoSummarize3,InfoSummarize4)
minVolume(0..100)
: 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.- Wenn eine untere oder obere Grenze festgelegt wurde, so wird das Reading Volume am entsprechenden SonosPlayer bei jeder Änderung am Player aktualisiert.
Möchte man also immer die aktuelle Lautstärke kennen, aber keine Enschränkung machen, dann sollte der Wert vonminVolume
auf0
odermaxVolume
auf100
gesetzt werden. Desweiteren werden gleichzeitig auch Änderungen an der Balance aktualisiert, da diese mit übertragen werden. - Achtung!: 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.
- Wenn eine untere oder obere Grenze festgelegt wurde, so wird das Reading Volume am entsprechenden SonosPlayer bei jeder Änderung am Player aktualisiert.
maxVolume(0..100)
: 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.- Wenn eine untere oder obere Grenze festgelegt wurde, so wird das Reading Volume am entsprechenden SonosPlayer bei jeder Änderung am Player aktualisiert.
Möchte man also immer die aktuelle Lautstärke kennen, aber keine Enschränkung machen, dann sollte der Wert vonminVolume
auf0
odermaxVolume
auf100
gesetzt werden. Desweiteren werden gleichzeitig auch Änderungen an der Balance aktualisiert, da diese mit übertragen werden. - Achtung!: 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.
- Wenn eine untere oder obere Grenze festgelegt wurde, so wird das Reading Volume am entsprechenden SonosPlayer bei jeder Änderung am Player aktualisiert.
minVolumeHeadphone(0..100)
: Legt die untere Grenze für die einstellbare Lautstärke dieses ZonePlayers im Kopfhörerbetrieb fest.- Hinweis!: Es gelten die gleichen Bedingungen und Hinweise wie bei
minVolume
.
- Hinweis!: Es gelten die gleichen Bedingungen und Hinweise wie bei
maxVolumeHeadphone(0..100)
: Legt die obere Grenze für die einstellbare Lautstärke dieses ZonePlayers im Kopfhörerbetrieb fest.- Hinweis!: Es gelten die gleichen Bedingungen und Hinweise wie bei
maxVolume
.
- Hinweis!: Es gelten die gleichen Bedingungen und Hinweise wie bei
getAlarms(0,1)
: 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 DailyIndexRefreshTime mit aktualisiert.
Get-Befehle an den SONOSPLAYER
CurrentTrackPosition
: Liefert die aktuelle Zeitposition im LiedVolume
: Liefert die aktuelle Lautstärke des PlayersBalance
: Liefert den aktuellen Balancewert des PlayersMute
: Liefert den aktuellen Mute-Zustand (on/off)Shuffle
: Liefert den aktuellen Shuffle-Zustand (on/off)Repeat
: Liefert den aktuellen Repeat-Zustand (on/off)CrossfadeMode
: Liefert den aktuellen Crossfade-Mode (on/off)Playlists
: 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. "Liste 1","Liste 2","Test"Radios
: 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. "Sender 1","Sender 2","Test"
Set-Befehle an den SONOSPLAYER
Play
: Startet die WiedergabePause
: Pausiert die WiedergabeStop
: Stoppt die WiedergabeNext
: Springt zum Anfang des nächsten LiedesPrevious
: 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.LoadPlaylist <Playlistname>
: Lädt die benannte Playliste in die aktuelle Abspielliste. Dabei wird die bestehende Abspielliste überschrieben. Der Parameter kann/muss URL-Encoded sein, um auch Leer- und Sonderzeichen angeben zu können.SavePlaylist <Playlistname>
: 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.EmptyPlaylist
: Löscht die aktuelle AbspiellisteLoadRadio <Radiostationname>
: 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.Mute <State>
: Setzt den Mute-Zustand auf den angegebenen Wert. Der Wert kann on oder off sein. Liefert als Ergebnis den neuen Zustand.MuteT
: Schaltet den Mute-Zustand um. Liefert als Ergebnis den neuen Zustand.Shuffle
: Legt den Zustand des Shuffle-Zustands fest. Liefert den aktuell gültigen Shuffle-Zustand.Repeat
: Legt den Zustand des Repeat-Zustands fest. Liefert den aktuell gültigen Repeat-Zustand.CrossfadeMode
: Legt den Zustand des Crossfade-Mode fest. Liefert den aktuell gültigen Crossfade-Mode.SleepTimer
: 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 'off'.DailyIndexRefreshTime
: Legt die aktuell gültige DailyIndexRefreshTime fest, zu der der Medienindex neu aufgebaut werden soll. Der Wert muss ein kompletter Zeitstempel sein (HH:MM:SS).VolumeD
: Verringert die Lautstärke um 10 Einheiten.VolumeU
: Erhöht die Lautstärke um 10 Einheiten.Volume <VolumeLevel>
: 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.Balance
: 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.VolumeSave <VolumeLevel>
: 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.VolumeRestore
: Stellt die mittels VolumeSave gespeicherte Lautstärke wieder her.CurrentTrackPosition <TimePosition>
: Setzt die aktuelle Zeitposition im LiedTrack <TrackNumber>
: Stellt das Lied an der Position TrackNumber in der Abspielliste als aktuelles Lied einPlayURI <SongURI> [Volume]
: 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.
Folgende Formate werden momentan akzeptiert:- UNC-Pfade: z.B.
\\Server\Freigabe\Dateiname.mp3
. Erkennungsmerkmal ist der Doppelte Backslash am Anfang. Darstellung aller üblichen Informationen inkl. Cover u.ä. - Web-Streams: z.B.
http://www.energyradio.de/hot
. Erkennungsmerkmal ist die Angabe vonhttp://
am Anfang. Es werden keine Cover aber Streaminformationen dargestellt. - Sonstige URI-Typen: z.B.
x-sonos-spotify:spotify:track:0jkLC0noG4A4i9lob2gSc3?sid=9&flags=0
. Darstellung aller üblichen Informationen. Die verfügbaren Formate können durch Sonos erweitert/verändert werden.
Hinweis: Das Format der URI, das hier angegeben werden kann, ist stets identisch zum Reading currentTrackURI, das bedeutet, dass die URI, die man dort sieht, hier direkt wieder angegeben werden kann.
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).
- UNC-Pfade: z.B.
PlayURITemp <SongURI> [Volume]
: 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.- Für Streams (genauer: Für Dateien, deren Abspiellänge nicht ermittelt werden kann) ist dieser Aufruf identisch zu
PlayURI
, es wird im Anschluß nichts wiederhergestellt. - Zulässige Formate stehen unter
PlayURI
. - Achtung!: Zum Ermitteln der Liedlänge wird u.U. eine zusätzliche Library verwendet (Wenn die Info nicht vom SonosPlayer bereitgestellt wird):
MP3::Info
. Diese Library muss zusätzlich in das FHEM-Lib-Verzeichnis kopiert werden. - Achtung!: Wenn bereits eine temporäre Ausgabe erfolgt, so wird die Aufforderung mit einer entsprechenden Meldung verworfen. Es kann nur eine geben :-)
- Für Streams (genauer: Für Dateien, deren Abspiellänge nicht ermittelt werden kann) ist dieser Aufruf identisch zu
AddURIToQueue <SongURI>
: Fügt die angegebene Datei in die aktuelle Abspielliste an die Stelle hinter dem aktuellen Titel hinzu. Ändert nichts am aktuell abgespielten Titel.
Zulässige Formate stehen unterPlayURI
.- Achtung!: 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
PlayURI
direkt (ohne Verwendung der Queue) abgespielt wird.
- Achtung!: 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
Speak <Volume> <Language> <Text>
: Wandelt den angegebenen Text mittels Google in gesprochenen Text um und spielt diesen mittelsPlayURITemp
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.- Hinweis: 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.
- Achtung!: Für die korrekte Funktionsweise müssen die Attribute
targetSpeakDir
undtargetSpeakURL
am Sonos-Device konfiguriert sein (siehe Attribute von SONOS). - Mögliche Sprachparameter können bei Google herausgefunden werden. Diese sind z.B. de, en, es, fr, it...
- Achtung!: Die Textlänge ist durch Google begrenzt. Wenn die Größe überschritten wird, erhält man eine Fehlermeldung im Log: "404 Not found". Leider erhielt ich in meinen Tests unterschiedliche Ergebnisse bzgl. der verwendbaren Länge. Einfach probieren.
- Achtung!: Wenn bereits eine temporäre Ausgabe erfolgt, so wird die Aufforderung mit einer entsprechenden Meldung verworfen. Es kann nur eine geben :-)
Alarm <Create|Update|Delete> <ID> <Datenhash>
: Diese Anweisung wird für die Bearbeitung der Alarme verwendet:- Create: Erzeugt einen neuen Alarm-Eintrag mit den übergebenen Hash-Daten.
- Update: Aktualisiert den Alarm mit der übergebenen ID und den angegebenen Hash-Daten.
- Delete: Löscht den Alarm-Eintrag mit der übergebenen ID.
- Datenhash: Das Format ist ein Perl-Hash und wird mittels der eval-Funktion interpretiert. Eine Beschreibung befindet sich bei der Dokumentation des Readings AlarmList
e.g.: { Repeat => 1 } - Beispiele:
set Sonos_Wohnzimmer Alarm Create 0 { Enabled => 1, Volume => 35, StartTime => '00:00:00', Duration => '00:15:00', Repeat => 0, Shuffle => 0, RoomUUID => 'RINCON_000E5828D0F401400', ProgramURI => 'x-rincon-buzzer:0', ProgramMetaData => ' ', Recurrence_Once => 0, Recurrence_Monday => 1, Recurrence_Tuesday => 1, Recurrence_Wednesday => 1, Recurrence_Thursday => 1, Recurrence_Friday => 1, Recurrence_Saturday => 0, Recurrence_Sunday => 0, IncludeLinkedZones => 0 }
: Erzeugt einen neuen Alarm mit den angegebenen Informationen. Die neue ID wird als Ergebnis zurückgegeben.set Sonos_Wohnzimmer Alarm Update 17 { Shuffle => 1 }
: Aktualisiert den Alarm mit der ID 17, und passt dort Shuffle an.set Sonos_Wohnzimmer Alarm Delete 17
: Löscht den Alarm mit der ID 17.
Definition der InfoSummarize
infoSummarizeX := <NormalAudio>:sumElem:</NormalAudio> <StreamAudio>:sumElem:</StreamAudio>| :sumElem: sumElem := <:variable:[ prefix=":text:"][ suffix=":text:"][ instead=":text:"] [ ifempty=":text:"][ emptyval=":text:"]/> variable := TransportState|NumberOfTracks|Track|TrackDuration|Title|Artist|Album| OriginalTrackNumber|AlbumArtist|Sender|SenderCurrent|SenderInfo|StreamAudio|NormalAudio| AlbumArtURI|Volume|Mute|Shuffle|Repeat|CrossfadeMode|Balance|HeadphoneConnected|SleepTimer| Presence|RoomName|SaveRoomName|PlayerType|Location|SoftwareRevision|SerialNum| InfoSummarize1|InfoSummarize2|InfoSummarize3|InfoSummarize4 text := [Beliebiger Text ohne doppelte Anführungszeichen]
Die Unterscheidung zwischen <NormalAudio>
und <StreamAudio>
liegt bei der anliegenden Musikquelle. Gestreamte Audioquellen habe nur einen kleineren Set an Informationen vorliegen, während bei einer "normalen" Musikquelle z.B. eine Unterscheidung zwischen Artist und Title gemacht wird, und im Gegenzug z.B. kein Sendername existiert.
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).
Die Tag-Erweiterungen prefix
und suffix
werden jeweils vor bzw. hinter den Feldwert in die Ausgabe gesetzt, wenn es einen Feldwert zum Ausgeben gibt.
Die Erweiterung instead
wird anstatt des Feldwerts ausgegeben, wenn normalerweise der Feldwert ausgegeben werden würde (abhängig davon, ob der Feldwert als empty angesehen wird, oder nicht).
Die Erweiterung ifempty
wird eingesetzt, wenn es gerade keinen Feldinhalt gibt. In diesem Fall werden natürlich auch keine Pre- und Suffixe sowie Instead-Angaben ausgegeben.
Die Erweiterung emptyval
legt fest, was neben einem undefinierten Feldwert noch als leer gelten soll. Dies ist interessant, wenn man z.B. den Zahlwert 0 als leer festlegen möchte.
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 :-)
Desweiteren können Verweise auf andere InfoSummarize
-Felder nur in aufsteigender Reihenfolge erfolgen. Es sind also keine Vorwärtsreferenzen oder Rekursionen möglich.
Fehlende Kommandos
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 :-)
Ideenpipeline
Folgende Ideen sind bereits in der gedanklichen Pipeline. Aber alles Schritt für Schritt und der Reihe nach:
- Zonentopologie verwenden/anpassen: 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 "Szenen" 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).
Erledigte Ideen:
- Zwischendurchsage: Eine Datei abspielen, und danach wieder an der alten Stelle mit der alten Lautstärke weiterspielen (In Version 1.5 hinzugekommen)
- Beliebige MP3s in die Queue legen oder abspielen: 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)
- Beliebige Radiostationen abspielen: 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)
- Lautstärkegrenzen festlegen: 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 keine 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)
Beispiele
Hier können mit der Zeit ein paar Beispiele eingestellt werden, um die Möglichkeiten zu verdeutlichen.
Beispiel zum automatischen Abspielen einer Liste nach dem Einschalten eines Players
define Sonos_Wohnzimmer_Appeared_Notify notify Sonos_Wohnzimmer:presence:.appeared { \ fhem "set Sonos_Wohnzimmer LoadPlaylist R.%%20Spielliste" ;; \ fhem "set Sonos_Wohnzimmer Volume 15" ;; \ fhem "set Sonos_Wohnzimmer Track ".(273 + int(rand(60)-30)) ;; \ fhem "set Sonos_Wohnzimmer Play" \ }
Hier wird auf das Event presence: appeared reagiert und eine Playlist geladen (hier mit Leerzeichen im Namen, darum mittels "%20</code"> HTML-kodiert, was wiederum wegen FHEM auf "
%%20
" kodiert werden muss). Anschließend wird die Lautstärke gesetzt, ein Titel ausgewählt (mit Zufallszahl, im Bereich +-30, damit nicht immer der gleiche Titel kommt) und das Abspielen gestartet.
Beispiel für eine Verstärkerschaltung auf Basis des Player-Zustands
define Sonos_Wohnzimmer_GoPlaying_Notify notify Sonos_Wohnzimmer:transportState.*PLAYING { \
fhem "delete wohnzimmer_Sonos_Ton_Off_Timer" ;; \
if (Value('wohnzimmer_Sonos_Ton') ne 'on') { \
fhem "set wohnzimmer_Sonos_Ton on") \
} \
}
define Sonos_Wohnzimmer_GoNotPlaying_Notify notify \
Sonos_Wohnzimmer:transportState.*(STOPPED|PAUSED_PLAYBACK) { \
fhem "delete wohnzimmer_Sonos_Ton_Off_Timer";; \
fhem "define wohnzimmer_Sonos_Ton_Off_Timer at +00:05:00 \
set wohnzimmer_Sonos_Ton off" \
}
Hier wird beim Wechsel des transportState
auf "PLAYING
" der Verstärker angeschaltet, und beim Wechsel auf "STOPPED
" oder "PAUSED_PLAYBACK
" ein Timer zum Ausschalten des Verstärkers in 5 Minuten definiert.
Der Timer ist notwendig, da beim Wechsel zwischen einem "normalen" Titel und einem Radiostream ein kurzer Zwischenwechsel auf "STOPPED
" erfolgt, und ich nicht den Verstärker innerhalb von ein paar Sekunden aus- und wieder einschalten will.
Beispiel für das Loggen des gerade abgespielten Titels
define FileLog_Sonos_Wohnzimmer FileLog /etc/fhem/log/Sonos_Wohnzimmer-%Y-%m.log \
Sonos_Wohnzimmer:infoSummarize2:.{2,}
attr FileLog_Sonos_Wohnzimmer room Sonos
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 :-)
Beispiel für eine Stummschaltung bei einem Anruf
define fritzBox_anrufstartring_notify notify fritzBox:.*ring set Sonos_Wohnzimmer VolumeSave 15
define fritzBox_anrufstartcall_notify notify fritzBox:.*call set Sonos_Wohnzimmer VolumeSave +0
define fritzBox_anrufende_notify notify fritzBox:.*disconnect set Sonos_Wohnzimmer VolumeRestore
Der Trigger auf 'call' existiert nur, damit ausgehende Telefonate beim Beenden nicht die Lautstärke verändern. Das passiert, weil das Disconnected-Event auch nach ausgehenden Anrufen kommt.
Das Beispiel kann man natürlich noch beliebig erweitern, vielleicht etwas mit Anrufererkennung usw.
Beispiel für eine Anrufsignalisierung per MP3 bei einem Anruf
define fritzBox_anrufstartringsong_notify notify fritzBox:.*ring set Sonos_Wohnzimmer \
PlayURITemp \\Server\Audio\RingRingRing.mp3 30
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.
Beispiel für beide Varianten beim Telefonanruf gleichzeitig
define fritzBox_anrufstartring_notify notify fritzBox:.*ring set Sonos_Wohnzimmer VolumeSave 15 \
;; set Sonos_Wohnzimmer PlayURITemp \\Server\Audio\RingRingRing.mp3 30
define fritzBox_anrufstartcall_notify notify fritzBox:.*call set Sonos_Wohnzimmer VolumeSave +0
define fritzBox_anrufende_notify notify fritzBox:.*disconnect set Sonos_Wohnzimmer VolumeRestore
Dieses Beispiel soll nur die Kombinationsmöglichkeiten verdeutlichen, und hat mehr spielerischen Character.
Beispiel für eine Sprachdurchsage auf Basis eines Notify
define wohnzimmer_Tastenfeld_1_Notify notify wohnzimmer_Tastenfeld_1 set Sonos_Wohnzimmer Speak \
45 de Hier dann die Textnachricht, wie sie auf dem Player ausgegeben werden soll.
define wohnzimmer_Tastenfeld_2_Notify notify wohnzimmer_Tastenfeld_2 set Sonos_Wohnzimmer Speak \
+10 de Hier dann die Textnachricht, wie sie auf dem Player ausgegeben werden soll.
define wohnzimmer_Tastenfeld_3_Notify notify wohnzimmer_Tastenfeld_3 set Sonos_Wohnzimmer Speak \
+0 en Hello, this is a short Message.
1: Hier wird auf Basis eines Notify (hier ein FS20-Taster) eine Textnachricht auf Deutsch mit der Lautstärke 45 auf dem SonosPlayer ausgegeben.
2: Hier wird eine deutsche Textnachricht mit 10 Einheiten lauter als aktuell eingestellt ausgegeben.
3: Hier wird eine englische Textnachricht mit der gleichen Lautstärke wie aktuell eingestellt ausgegeben.
Beispiel zu InfoSummarize
Standard, wie er angelegt wird:
InfoSummarize1 = <NormalAudio><Artist prefix="(" suffix=")"/>\
<Title prefix=" '" suffix="'" ifempty="[Keine Musikdatei]"/>\
<Album prefix=" vom Album '" suffix="'"/></NormalAudio> \
<StreamAudio><Sender suffix=":"/>\
<SenderCurrent prefix=" '" suffix="' -"/>\
<SenderInfo prefix=" "/></StreamAudio>
InfoSummarize2 = <TransportState/><InfoSummarize1 prefix=" => "/>
InfoSummarize3 = <Volume prefix="Lautstärke: "/>\
<Mute instead=" ~ Kein Ton" ifempty=" ~ Ton An" emptyval="0"/>\
~ Balance: <Balance ifempty="Mitte" emptyval="0"/>\
<HeadphoneConnected instead=" ~ Kopfhörer aktiv" ifempty=" ~ Kein Kopfhörer" \
emptyval="0"/>
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.