Sonos steuern

Begonnen von Will, 05 Januar 2013, 15:51:12

Vorheriges Thema - Nächstes Thema

poempel

Hallo zusammen,

ich habe eine Frage zum Sonos-Modul:

Mein Ziel ist es, dass wenn ich das Haus verlassen habe der aktuelle Sender des SonosPlayers in einer Variablen gespeichert wird und wenn ich wieder nach Hause komme genau dieser Sender wieder geladen (nicht abgespielt) wird.
In der Zwischenzeit werden meine Sonos-Komponenten vom Netz getrennt.
Das Detektieren der Anwesenheit funktioniert schon, das Ein- und Ausschalten ebenfalls, ich bekomme es auch schon hin, dass mein "Lieblings-"Radiosender nach dem Einschalten geladen wird.
Fehlt also nur die Information: Wie komme ich an die Info, welcher Sender gerade geladen ist?

Vielen Dank vorab für Eure Hilfe!

Reinerlein

Hallo poempel,

die aktuelle Abspiel-URL kannst du dir über "currentTrackURI" holen. Diese ist immer eine an "PlayURI" übergebbare Adresse, und sollte auch den Stream oder Titel normal abspielen...

Leider werden dann nicht mehr die 'normalen' Radioinformationen, wie Cover o.ä. angezeigt. Das passiert (meines Wissens nach) nur, wenn man den Player einen Radiofavoriten (oder Sonos-Favoriten) abspielen läßt...

Bei 'normalen' Titeln, die in der aktuellen Abspielliste stehen, sollte man die Liste laden (OK, auch diesen Namen bekommt man nicht mehr nachträglich raus), und den in "currentTrackNumber" stehenden Titel anstarten.

Du siehst, das wird leider nicht so schön werden, da die Sonos-Player diese Information, welcher Radiosender gestartet wurde, bzw. welche Playliste mal geladen wurde, nicht mehr zurückliefern.... was bei genauer Überlegung ja auch gar nicht anders sein kann :-)

Grüße
Reiner

poempel

Danke an der Stelle schon mal.
Leider komme ich mit der Syntax noch nicht so ganz klar bei dem Sonos-Modul.
Kannst du mir kurz einen Einzeiler vorgeben, wie ich in die Variable "myvar" die Track Informationen des Players Sonos_Bad schreibe?
Hab grad diverses ausprobiert, entweder ich bin zu doof oder ich steh auf dem Schlauch :-)

Vielen Dank

Reinerlein

Hi poempel,

hier mal kurz aus dem Stehgreif:
{...
my $myVar = ReadingsVal('Sonos_Bad', 'currentTrackURI', '');
...}

Wenn das Reading nicht existieren sollte (sollte hier nicht auftreten), wird der letzte Parameter (hier ein Leerstring) in die Variable geschrieben...

Ich habe übrigens nochmal nachgeschaut. Es sollten sogar alle üblichen Stream- und Cover-Informationen dargestellt werden... da habe ich mich wohl falsch erinnert...

Grüße Reiner

Spartacus

Hallo,
ich habe eine Frage zu Sonos Speak:
Ich möchte eine Sprachausgabe auf mehrere Geräte parallel ausgeben, ohne vorher eine Gruppe zu bilden. Wenn ich das so mache, dann kommt die Ansage natürlich nacheinander...

*06:50:00
{
if (!($we))
{
  my $var = Value("Sommerferien");;
  fhem "set Sonos_Buero Speak 20 de noch $var Tage bis zu den Sommerferien.";;
  fhem "set Sonos_Bad Speak 20 de noch $var Tage bis zu den Sommerferien."
}
}


Der Text ist natürlich nur ein Beispiel :-)

Jemand eine Idee?
Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

der-Lolo

versuch es mal mit nur einem Semikolon...

Spartacus

Hi,
Eingabe im "Eingabe Fenster" von fhem:
{
if (!($we))
{
  my $var = Value("Sommerferien");;
  fhem "set Sonos_Buero Speak 20 de noch $var Tage bis zu den Sommerferien.";
  fhem "set Sonos_Bad Speak 20 de noch $var Tage bis zu den Sommerferien."
}
}


Antwort fhem:
Unknown command {, try help.
Unknown command fhem, try help.


die zwei Semikolons müssen offenbar schon sein!
Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Reinerlein

Hallo Spartacus,

im Prinzip werden die Ausgaben angestartet, und das Modul kommt sofort zurück. Das bedeutet, dass die Ausgaben in Wirklichkeit nicht nacheinander sondern überlappend kommen. Das hilft dir jetzt aber auch nicht, da es bei solch kurzen Texten natürlich trotzdem faktisch nacheinander kommt :-)

Da das Modul von Fhem aus Single-Threaded läuft, wirst du das auch nicht weiter beeinflussen können...

Du kannst also, meiner Meinung nach, nur was mit einer Gruppierung der Player werden, oder deine Fhem-Maschine soweit aufrüsten, dass dort die Verarbeitung schneller wird (auf meinem Entwicklungssystem läuft ein Windows 2003 auf einer Mehr-CPU-Maschine mit ein paar GHz und GB, das brummt natürlich mehr als mein Produktiv-Raspberry-Pi :-)

Grüße
Reiner

P.S.: Das, was hier die meiste Zeit verbraucht, ist das Abrufen der Textausgabe von Google. Da kannst also viel gewinnen, wenn du entweder ein lokales Programm für die Texterzeugung verwendest (schau mal dazu im Wiki nach), oder den Text in einem ersten Schritt selber ablegst, und das Fhem-Modul dann mittels "PlayURI" diese Datei angibst...
Ausserdem könntest du etwas tricksen: Wenn du keinen Timestamp und keinen Hashwert in den abgelegten Namen generieren lässt (Parameter "targetSpeakFileTimestamp" und "targetSpeakFileHashCache" auf 0), dann kannst du dem zweiten Player das bereits erzeugt File mittels "PlayURI" übergeben, da der Name dann ja bekannt ist... Das hat aber auch wieder andere Nachteile...

Spartacus

Hallo Reiner,
danke! Ich denke, dann ist für dieses Beispiel das Gruppieren sicherlich die Bessere Lösung! Die lokale Sprachdateierzeugung gucke ich mir mal an. Ist das qualitativ mit Google vergleichbar?

Ich plane eine BigBen-mp3 als Türgong über Sonos abzuspielen. Das soll dann auch über alle Player ausgegeben werden. Bis die Gruppen gebildet sind und der "Türgong" dann ertönt, ist der Besuch sicherlich schon wieder weg!
Aber vielleicht ist das Abspielen der mp3 nicht so zeitkritisch und man hört den Zeitversatz nicht, wenn man die Player einzeln ansteuert.

Danke und Gruß,
Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Reinerlein

Hi Spartacus,

in meinen Test war die Stimme etwas "gehetzt" aber verständlich, da kann man aber wohl auch noch dran drehen. Mir ging es damals nur um die Integration in das Modul :-)
Ein Vorteil war auf jeden Fall, dass es keine Grenze bei der Länge des Textes gibt. Google blockiert ja zu lange Texte...

Auf jeden Fall geht das Anstarten eines bestehenden MP3s schneller vonstatten. Einfach mal probieren.

Ich hatte aber einen Tippfehler: Natürlich musst du "PlayURITemp" verwenden, damit es danach mit den vorhergehenden Titel weitergeht...

Grüße
Reiner

poempel

Nochmal eine Frage zum automatischen Playlist-Laden:

Ich habe bei mir jetzt eingebaut, dass wenn mein Presence-Status von absent auf present wechselt, die Sonos Komponenten per IT-Steckdose wieder eingeschaltet werden, anschließend 80 Sekunden gewartet wird und dann der Radiosender PULS geladen wird.
Manchmal funktioniert es und manchmal schmiert mir FHEM komplett ab und reagiert nicht mehr. Dann muss ich den kompletten Raspberry Pi neu starten.

Das Logfile gibt folgendes aus:

2014.06.26 17:22:46 2: IT set SonosPlaybar off
2014.06.26 21:17:37 1: Including fhem.cfg
2014.06.26 21:17:38 3: telnetPort: port 7072 opened
2014.06.26 21:17:40 3: WEB: port 8083 opened
2014.06.26 21:17:40 3: WEBphone: port 8084 opened
2014.06.26 21:17:40 3: WEBtablet: port 8085 opened
2014.06.26 21:17:42 3: Opening CUL0 device /dev/ttyACM0
2014.06.26 21:17:43 3: Setting CUL0 baudrate to 9600
2014.06.26 21:17:43 3: CUL0 device opened
2014.06.26 21:17:43 3: CUL0: Possible commands: BCFiAZEGMKRTVWXefmltux
2014.06.26 21:32:33 1: SONOS0: Kein UPnP-Server gefunden... Starte selber einen und warte 8 sekunden darauf...
2014.06.26 21:32:41 3: Opening SonosPlayer device localhost:4711
2014.06.26 21:32:41 3: SonosPlayer device opened
2014.06.26 21:32:42 1: Including ./log/fhem.save
2014.06.26 21:32:42 1: statefile: Reading SonosPlayer_BRIDGE->presence must not be used out of statefile.
Reading SonosPlayer_Bad->AlarmList must not be used out of statefile.
Reading SonosPlayer_Bad->AlarmListIDs must not be used out of statefile.
Reading SonosPlayer_Bad->AlarmListVersion must not be used out of statefile.
Reading SonosPlayer_Bad->LastActionResult must not be used out of statefile.
Reading SonosPlayer_Bad->presence must not be used out of statefile.
Reading SonosPlayer_K__che->AlarmList must not be used out of statefile.
Reading SonosPlayer_K__che->AlarmListIDs must not be used out of statefile.
Reading SonosPlayer_K__che->AlarmListVersion must not be used out of statefile.
Reading SonosPlayer_K__che->LastActionResult must not be used out of statefile.
Reading SonosPlayer_K__che->presence must not be used out of statefile.
Reading SonosPlayer_Wohnzimmer->AlarmList must not be used out of statefile.
Reading SonosPlayer_Wohnzimmer->AlarmListIDs must not be used out of statefile.
Reading SonosPlayer_Wohnzimmer->AlarmListVersion must not be used out of statefile.
Reading SonosPlayer_Wohnzimmer->presence must not be used out of statefile.
Reading SonosPlayer_Wohnzimmer_LR->AlarmList must not be used out of statefile.
Reading SonosPlayer_Wohnzimmer_LR->AlarmListIDs must not be used out of statefile.
Reading SonosPlayer_Wohnzimmer_LR->AlarmListVersion must not be used out of statefile.
Reading SonosPlayer_Wohnzimmer_LR->presence must not be used out of statefile.
Reading SonosPlayer_Wohnzimmer_RR->AlarmList must not be used out of statefile.
Reading SonosPlayer_Wohnzimmer_RR->AlarmListIDs must not be used out of statefile.
Reading SonosPlayer_Wohnzimmer_RR->AlarmListVersion must not be used out of statefile.
Reading SonosPlayer_Wohnzimmer_RR->presence must not be used out of statefile.


Kann mir jemand sagen, was hier schief läuft? Ich werde leider daraus nicht schlau.

Danke!

det.

den gleichen Effekt habe ich auf dem Cubie2 leider seit kurzem (letzte 2 Wochen) bei mir auch. Da es schon mal stabil lief, scheint es an irgenwelchen Veränderungen des restlichen FHEM Systems liegen. SONOS Update fand nicht statt in der Zwischenzeit. Mir ist klar, dass das zur Fehlersuche nicht wirklich hilfreich ist. Da mein Verbose bei SONOS auf 0 steht, gibt es auch keine Log Einträge...
nur bevor sich poempel die Haare rauft und den Fehler ausschließlich bei sich sucht....
LG
det.

der-Lolo

Hallo Sonos-Freunde,
hat jemand einen ipod Dock WD-100 im Einsatz?
Ich bastle gerade an meinem Player Interface und bekomme den CrossfadeMode nicht aktiviert, wird der mode vielleicht vom WD-100 gar nicht unterstützt?
Komisch - Shuffle funktioniert, Crossfade geht beim ZP90 komischerweise auch problemlos... nur eben nicht wenn die Wiedergabe vom WD-100 kommt.

Reinerlein

Hallo der-Lolo,

kannst du den Crossfademode denn über den normalen Controller setzen? Wenn ja, wird in dem entsprechenden Fhem-Device-Reading der neue Wert korrekt verzeichnet?

Sonos-intern wird die Information zu Shuffle und Crossfade in einer einzigen Information abgelegt, die entsprechend 4 verschiedene Werte annehmen kann, und die ich dann beim Ermitteln in die beiden getrennten booleschen Informationen für die Fhem-Readings zerlege.
Das bedeutet, dass zumindest kein prinzipielles Problem beim Setzen/Ermitteln der Information auftritt, sonst würde Shuffle auch nicht gehen...

Grüße
Reiner

der-Lolo

Na danach hätte ich ja auch mal schauen können - in der App geht es auch nicht, also steht die funktion mit einem gedocktem iPod wohl nicht zur verfügung. In der App ist sogar das symbol ausgegraut.

Ok, also verzichte ich auf den Button... danke wie immer für die Hilfe.
Es ging trotzdem gut voran in letzter Zeit, Sonos lies sich recht gut einbinden.
Danke für das tolle Modul!