ich eröffne jetzt mal einen Thread in der Hoffnung das sich hier alle diejenigen, die Interesse daran haben ihr Sonos System optimaler in ihr Loxone System zu integrieren. Mit sogenannten Bordmitteln stößt man schnell an seine Grenzen, von daher bin ich vor längerer Zeit schon auf die aus anderen Smart Home Systemen bekannte PHPSonos.inc.php und entsprechende Skripte gestoßen und habe mir vor 2 Wochen einen Raspberry Pi angeschafft um das ganze nun umzusetzen. Ein Pi ist nicht zwingend notwendig, die Skripte laufen auf allen php fähigen Webservern und auch auf php fähigen NAS und werden mittels Ausgangsverbinder per http Befehlen vom MS aufgerufen
php Skripte für Sonos gibt es ja genug im Netz, manche sind sehr umfassend und dadurch auch komplex, manche sehr rudimentär. Da ich mich selber als Newbie im Bereich Pi, php und Skripte bezeichne habe ich mich darauf konzentriert existierende Skripte für meine Zwecke zu untersuchen, zusammenzufassen und zu optimieren und auch auch ein wenig was hinzuzufügen.
Vielleicht schaffen wir es ja auch wie in anderen Foren auch (Homematic, IP-Symcon, etc.) das Skript für Loxone zu optimieren, neue Funktionen hinzuzufügen und zu erweitern. Wie gesagt, ich bin kein Experte in scripting, aber die Lernkurve ist relativ gut :-)
Ich weiß auch aus dem alten Forum das es schon einige User gibt die per Skript ihr Sonos System integriert haben, aber aufgrund der Arbeit die teilweise in den Skripten steckt, diese nicht teilen wollen. Deshalb jetzt mal ein Versuch ob wir es gemeinsam schaffen unser Sonos System integrativer nutzen zu können.
Jetzt mal zum eigentlichen Thema. Die Skripte bestehen grundsätzlich aus 9 Dateien die alle auf der PHPSonos.inc.php Class beruhen:
System/PHPSonos.php --> Klasse zum Steuern von Sonos
README.md --> unbedingt lesen bevor man anfängt
System/config.php --> Hier wird eure jeweilige Konfiguration eingetragen
index.php --> Aufruf der Funktionen
sonos2.php --> Das eigentliche Skript
Voice_Engines/Ivona --> Das text-to-speech Skript für Ivona.com
Voice_Engines/VoiceRSS --> Das text-to-speech Skript für VoiceRSS.org
Voice_Engines/MAC_OSX --> Das text-to-speech Skript für den Mac Server
weather-to-speech --> Das weather-to-speech Skript
clock-to-speech --> Das clock-to-speech Skript
sonos-to-speech --> Das Sonos-to-speech skript
Zusätzlich wird eine Log Datei erstellt
Folgende Funktionen stehen derzeit je Sonos Zone zur Verfügung:
Play, Stop, Pause, nächster Song, vorheriger Song, Song erneut, Toggle Play/Stop, Playmode (Normal, Shuffle, Repeat), Mute, Volume Up, Volume Down, setzen von Volume in Prozent, nächste Radiostation von Liste, vorherige Radiostation von Liste, löschen von Song aus der Playliste, löschen der gesamten Playliste.
Darüber hinaus Funktionen die für die meisten am Interessantesten sind:
Abspielen vordefinierter Nachrichten von NAS oder USB Stick
Ich nutze diese ich um z.B. wiederkehrende Sprachdurchsagen abzuspielen („Waschmaschine ist fertig“, „Das Fenster im Bad ist seid 30 Minuten offen. Bitte umgehend schließen“) oder um einen Telefonanruf oder Klingeln an der Haustür akustisch über Sonos zu singnalisieren. Das kann relativ einfach über Eingangs Trigger im MS bewerkstelligt werden. Die vordefinierten Sprachnachrichten generiere ich mir über die TTS Engine (siehe im nächsten Abschnitt) und benenne dann die zurückkommende gespeicherte Datei einfach um in z.B.: 1.mp3, 2.mp3 um Sie später dann per http Befehl aufzurufen. Wichtig: Nur numerische Dateien sind per Aufruf mit Hilfe des Skriptes möglich
Abspielen von Text-to-speech Nachrichten
Mit Hilfe der Online TTS Engine VoiceRSS.org oder Ivona.com könnt ihr eigene Sprachdurchsagen erstellen und nutzen. Dazu benötigt ihr jeweils einen Key, da die Google TTS Engine mittlerweile dicht gemacht hat. Mit Hilfe der TTS Engine bekommt man dann den jeweils eingegeben Text als MP3 File zurück und er wird auf der angegebenen Zone in gewünschter Lautstärke abgespielt.
Darüberhinaus kann auch der Wert eines Status (v) in die TTS Engine mit eingebunden werden, dieser wird auch in Sprache umgewandelt. In dem angehängten ZIP File habe ich mal eine Beispiel mp3 hinzugefügt damit ihr ein Gefühl für die Qualität der Stimme erhaltet.
Als Bonbon dieser beiden Funktionen merkt sich das Skript beim Aufruf den Status der jeweiligen Zone (Spielt gerade Playliste/Song/Radiostation und dessen Volume) und ruft den Ursprungszustand nach erfolgter Sprachausgabe anschließend wieder auf. Falls die Zone eine aktive Playliste/Radiostation hat, aber auf Pause/Stop steht, bleibt die Zone nach erfolgter Sprachausgabe weiterhin stumm. Zusätzlich könnt ihr vor der Sprachausgabe noch ein .mp3 file (jingle oder gong) als Art Signalisierung abspielen.
Die Syntax für die o.g. Befehle befinden sich alle in der README.md Datei, getestet habe ich die Funktionen erfolgreich unter Sonos 7.0 und Loxone Config 8.0.7.19.
Mich würde es sehr freuen wenn wir im Laufe der Zeit das Skript, wie oben bereits erwähnt, erweitern könnten. Ich selber bin kein php Experte, hangele mich eher so durch, aber mir macht es Spaß und es gibt bestimmt noch einige sinnvolle Funktionen. Ich arbeite gerade am Gruppieren von Zonen und das entsprechende Lösen der Gruppierungen.
Für Fragen bzw. Anmerkungen bin ich gerne offen, nur kann ich niemanden z.B. bei Inbetriebnahme eines Pi aktiv unterstützen, dafür gibt es auch genügend links im Netz wie man ihn konfiguriert. Alles halb so wild, hatte ihn an 2 Abenden fertig.
Update: folgende Funktionen sind neu:
rampto = 3 verschiedene Möglichkeiten der Lautstärkeanhebung
group/ungroup = gruppieren aller Zonen und vice versa
addmember/removemember = einzelne Zone hinzufügen und vice versa
sonosplaylist = laden einer Sonos Playliste (auch nutzbar für Streaming Playlisten vorausgesetzt sie wurde vorher als Sonos Playliste gespeichert)
radioplaylist = laden eines Radio Senders
radiourl = Die Radio URL des gegenwärtigen Senders auslesen um den Sender zur Radioliste hinzuzufügen
Bei den group/addmember funktionen gehen derzeit noch die vorher gespielten Playlisten verloren.
Außerdem können jetzt folgende Infos an Loxone zur Weiterverarbeitung übertragen werden.
Titel/Interpret Info, Lautstärke, Play Status (1=Play, 2=Pause, 3=Stop)
nähere Infos dazu in der README.md
Auch gibt es jetzt eine Debug und Info Möglichkeit um die Fehleranalyse einfacher zu machen, auch hier mehr dazu in der o.g. Datei
Da ich nicht alle Syntax Kombination testen kann, empfehle ich euch die Dateien in ein anderes Verzeichnis zu speichern, eure config.php zu kopieren und zu ergänzen, bevor ihr das Skript produktiv in Loxone nutzt. Falls Bugfixes auftreten bitte lasst es mich wissen.
Auch habe ich einige gemeldete Bugfixes behoben und Wünsche (Titel/Interpret Info, Playstatus für Loxone) realisiert.
Vielleicht findet sich ja noch der ein oder andere der bereit ist sich mit php auseinanderzusetzen und sich an der Entwicklung zu beteiligen.
Ansonsten viel Spaß und gebt doch mal ein Feedback ob ihr einen Mehrwert in der Nutzung seht.
PS: Die Syntax ist jetzt alles in KLEINBUCHSTABEN :-)
Die Scripts sind ab jetzt nur noch auf github.com verfügbar
Viel Spaß mit den Skripten
Oliver
Change History:
# 1.2.0 Veröffentlichung des Skriptes
# 1.2.2 Aufgrund von diverser Groß-/kleinschreibung Problematiken jetzt die komplette Syntax in kleinschreibung
# 1.3.0 Neue Funktionen hinzugefügt: group/ungroup // Achtung: Playlisten/Radiosender gehen bei ungroup verloren
# addmember/removemember // zu einer Zone eine weitere hinzufügen
# Achtung: Playlisten/Radiosender gehen bei removemember von verlassende Zone
# verloren
# sonosplaylist // lädt Sonos Playliste und spielt Sie dann ab
# radiourl // Identifizieren der URL des gegenwärtig spielenden Radiosenders um die URL
# dann in der config.php zu der Radioliste hinzuzufügen.
# rampto // Anpassung der Art der Lautstärkeregelung bei Play (3 Varianten möglich)
#
# Desweiteren neue Parameter in der config.php:
# stdvolume // Standardlautstärke wenn nichts anderes mit angegeben wurde
# messagevolume // Standardlautstärke für Durchsagen wenn nichts anderes angegeben wurde
# rampto // Standard für den Befehl Play wenn der Parameter rampto in der Syntax nicht
# angegeben wurde.
#
# Details bzgl. Syntax bitte der README.md und der Parameter in config.php entnehmen
# 1.3.1 Fehler bei Loxone Titelinfo und Volume behoben
# 1.3.2 Fehler in der Funktion 'ungroup' behoben
# Rampto default bei gewissen Funktionen geändert, Parameter zu config.php hinzugefügt
# Fehler in der Funktion 'Logging' in Verbindung mit Loxone Anbindung behoben
# 1.3.3 Google, Napster und die Sonos TV Bar bei Wiederherstellung nach TTS hinzugefügt
# 1.4.0 Weather-to-speak und Clock-to-speak Funktionen hinzugefügt
# Ramp-to-sleep (ca. 16 Sekunden) bei Beginn TTS Ansage und laufender Zone hinzugefügt
# 1.4.1 w2s aktualisiert, Windstärkenangaben hinzugefügt, Bugfix für Windrichtung wenn Werte in Kürzel
# zurückgegegben werden,
# 1.4.2 Funktion softstop hinzugefügt (reduziert die Lautstärke linear in 17 Sekunden
# auf Null, dann Stop und zurück zur Original Lautstärke
# 1.4.3 Bugfix in Loxone Titel/Interpret Information behoben, TV Playbar Parameter geändert
# 1.4.4 Die messageid 100 (File 100.mp3) ist für eine Klingelfunktion reserviert. Wenn Sonos läuft wird somit verhindert
# das die Ramp-to-sleep Funktion greift und stattdessen das Klingel MP3 file sofort abgespielt wird. (Voraussetzung
# man ein Klingelsignal an der Loxone)
# Zusätzlicher Code für Playbar im TV Modus hinzugefügt (muss noch getestet werden)
# 1.4.5 Code Optimierung und Error handling hinzugefügt (Verzeichnis log wird erstellt und die log dateien dort hineingeschrieben)
# max. Skript Laufzeit auf 60 Sekunden erhöht (sollte die Fatal Error Probleme mit SonosPHP.inc.php lösen)
# Funktion Telefonmute hinzugefügt (reduziert Volume langsam auf Wert 5%)
# TV Playbar funktioniert nicht wenn Playbar im TV Modus ist.
# 1.4.6 Fixed Problem bei TTS und eingeschaltetem Shuffle
# Fixed t2s für Playbar im TV Modus
# folgende Funktion hinzugefügt:
# - Neuer Online Text-to-speech Provider Ivona.com implementiert:
# alternativer Anbieter bei dem 2 Stimmen (männlich und weiblich) genutzt werden können. Eine default Stimme kann in der config.php
# voreingestellt werden, aber in der Syntax individuell angepasst werden. Steuerung welcher Provider genutzt werden soll erfolgt ebenso
# über die config.php (mehr Details bitte der Readme.md entnehmen)
# - Zonestatus (prüft ob alle Player Online sind)
# - beim Errorhandling wird eine Info an Loxone Text Eingangsverbinder S-Error geschickt
# - clearlox (löscht Fehler in Loxone Benachrichtigung S-Error)
# - getbass (gibt die Bass Einstellung zurück) + setbass (setzt den Bass auf angegebenen Wert)
# - gettreble (gibt die Treble Einstellung zurück) + settreble (setzt den Treble auf angegebenen Wert)
# - getloudness (gibt die Loudness Einstellung zurück [0 oder 1]) + setloudness (setzt den Bass auf angegebenen Wert [0 oder 1])
# 1.4.7 Fixed Problem mit nextradio und prevradio
# 1.4.8 Fixed loxgettitelinfo (Bei Radio wird der Sender und nicht mehr Titel/Interpret übergeben)
# maximale Skriptlaufzeit auf 90 Sekunden erhöht
# Zeitspanne (10 Sekunden oder abruptes verringern der Lautstärke) vor dem Abspielen der t2s konfigurierbar (config.php)
# s2s (sonos-to-speech) sagt den laufenden Titel/Interpret kurz an (Titel stoppt abrupt, dann Titel/Interpret Ansage, Titel startet abrupt wieder)
# Fixed Problem mit w2s und ivona_tts
# 1.4.9
# monatliches Logfile wird erstellt
# Bugfix in weather-to-speech behoben
# bei nextradio und prevradio die Lautstärke Parameter optimiert. Zone spielt = Volume bleibt, Zone spielt nicht = Volume aus Parameter $Volume wird zum Start verwendet
# Folgende Funktionen wurden hinzugefügt:
# - getgroupmute = Gibt den gegenwärtigen Mute Status einer Gruppe zurück
# - setgroupmute = Setzt für eine Gruppe den Mute Status (0=Unmute, 1=Mute)
# - getgroupvolume = Gibt die gegenwärtige Lautstärke einer Gruppe zurück
# - setgroupvolume = Setzt für eine Gruppe die angegebene Laustärke gleich
# - setrelativegroupvolume = Erhöht für eine Gruppe die angegebene Laustärke relativ in Prozent je Zone. ACHTUNG! vorheriges Lautstärkeverhältnis beachten!
# - becomegroupcoordinator = Nimmt angegebene Zone aus einer Gruppe heraus
# - Sleeptimer = Ausschaltverzögerung in Minuten (1-59 Minuten möglich)
# 1.4.9.1
# Typo in sonos2.php korrigiert (keine T2S möglich)
# 1.5.0 Offline Mac basierende T2S Engine hinzugefügt (danke schön an Patrick (patriwag))
# 1.5.1 Erstellen von Gruppen bzw. auflösen einzelner Zonen basierend auf Auswahl der Zonen. Die jeweiligen Zonen müssen mit einem Komma aufgelistet werden, falls nur eine Zone dann ohne Komma
# - addmember erstellt basierend auf der Auswahl von Zonen eine Gruppe. (inklusive speichern der jeweiligen Zustände)
# - removemember löscht die angegeben(n) Zone(n) aus einer bestehenden Gruppe. (inklusive des Ladens der Originalzustände)
# max. Scriptlaufzeit auf 120 Sekunden erhöht
# Neue Funktion um eine T2S an eine Gruppe zu schicken. Vorher wird je Zone der Zustand gespeichert, dann die gewünschten Zonen
# gruppiert, die t2s in gewünschter Lautstärke je Zone (siehe config.php) abgespielt und zum Schluß wieder der Originalzustand jeder Zone hergestellt.
# - sendgroupmessage
# Zusätzlich gibt es am Ende der Syntax den Parameter "groupvolume", der die Volume default Werte aus der config.php um den angegebenen Prozentwert erhöht.
# - groupsonosplaylist = spielt eine Sonos Playliste in einer Gruppe von Zonen ab (analog zu sonosplaylist für einzelne Zone)
# - groupradioplaylist = spielt einen ausgewählten Radiosender in einer Gruppe von Zonen ab (analog zu radioplaylist für einzelne Zone)
# 1.5.2 Spotify für Wiederherstellung hinzugefügt
# - Korrektur Groupvolume
# - Korrektur Play()
# - Korrektur Playmode (Shuffle ausschalten) vor Gruppendurchsage
# 1.5.3 neuer Folder für MP3 Dateien hinzugefügt
# 2.0.5 - Erweiterung Gruppenmanagement (egal ob eine Zone als SingleZone oder in einer Gruppe spielt wird nach einer T2S der Ursprungszustand
# oder die Gruppenzugehörigkeit wiederhergestellt)
# - Automatische Löschung der vom T2S Provider erhaltenen MP3 Dateien im Verzeichnis 'messageStorePath'
# - Korrektur Playmode Shuffle wiederherstellen bei Gruppendurchsagen (nicht 100%ig behoben --> andere Song)
# - Korrektur Wiederherstellung Radiosender bei Einzeldurchsage
# - Erweiterung des Error Managements mit individuellen Messages
# 2.0.6 Bugfix bzgl. Online Status der Zonen hinzugefügt --> nur Zonen die im Netzwerk Online sind werden genutzt, egal ob Sie in der Syntax
# angegeben sind oder nicht.
# Bugfix bei T2S Durchsage behoben (Playlist im Shuffle Modus noch in der Queue und Radio läuft)
# - diverse kleinere Bugfix gelöst (sonos-to-speech, T2S Volume bei Gruppendurchsagezone für Master)
# 2.0.7 add-/removemember gefixt
Kommentar