Sonos: Sprachdurchsage auf mehreren Boxen

Begonnen von ares, 16 Januar 2016, 12:17:58

Vorheriges Thema - Nächstes Thema

ares

Im Wiki für die Anbindung des Sonos-Systems steht Unter Punkt 13.8 (Beispiel für eine Sprachdurchsage auf Basis eines Notify), dass speak den angegebenen Text mittels Google in gesprochenen Text umwandelt und diesen mittels PlayURITemp abspielt. Das klappt bei mir problemlos, jedoch nur auf einer Sonos-Box bzw. Sonos-Gruppe.

Ich möchte den gesprochenen Text auf allen Boxen (oder mehren vorher noch nicht als Gruppe definierten Boxen) abspielen. Gibt es dafür schon eine fertige Lösung oder muss muss hier alles manuell gesichert und nach der Ausgabe auf einer temporären Party-Gruppierung alles wiederhergestellt werden?

justme1968

wenn die player nicht synchron sein müssen geht es so:set TYPE=SONOSPLAYER:FILTER=presence=appeared speak 35 de ...

du kannst auch eine liste der player angeben. siehe devspec in der commandref.

der FILTER teil ist deshalb drin weil es manchmal probleme gibt etwas auf einem player auszugeben der gerade ausgeschaltet ist.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

ares

#2
Ein Traum, vielen herzlichen Dank!

Edit sagt:
Leider wurde die Nachricht nur auf der ersten Box, die dummerweise noch direkt neben mir steht, ausgegeben. Beim zweiten Versuch geht dann gar nichts mehr und fhem muss neu gestartet werden.

Edit2 sagt:
Es war auch kein Play/Stop mehr über fhem möglich. Nach dem x-ten Neustart funktioniert es nun aber komischerweise ohne irgendwelche Änderungen und Updates (hoffentlich dauerhaft).
Macht es Sinn, die Ausgabe nur einmal pro Gruppe zu starten?
set TYPE=SONOSPLAYER:FILTER=presence=appeared:FILTER=currentTitle!=Gruppenwiedergabe speak 35 de ...

Reinerlein

Hallo ares,

es ist sogar wichtig, dass du die Durchsage nur einmal pro Gruppe machst. Alle Ausgabeanweisungen an ein Gruppenmitglied werden automatisch an den Gruppenmaster übergeben, der das dann für die ganze Gruppe abspielt (und die Wiedergabe koordiniert).
Wenn du das also in Fhem an mehrere Teilnehmer sendest, wird es auch mehrmals ausgegeben...

Alternativ kannst du dir auch die Gruppenkonstellation merken, eine große Gruppe bauen, die Durchsage machen und die alte Konstellation wiederherstellen...
Dazu gibt es im Thread "Sonos steuern" auch ein Beispiel...

Grüße
Reinerlein

ares

Hallo Reinerlein,

im Thread "Sonos steuern" habe ich die Stelle hoffentlich nicht überlesen, eventuell meinst Du aber diesen Post von Dir: http://forum.fhem.de/index.php/topic,39549.msg356987.html#msg356987

Die Variante hatte ich nach folgendem manuellen Test verworfen:

Ausgangslage: eine Gruppe ABCD
set Sonos Groups [Sonos_A, Sonos_B, Sonos_C, Sonos_D]

Wunsch: Zwei Gruppen AB und CD bilden, danach Speak auf Gruppe CD und die Ausgangslage ABCD wiederherstellen.
Problem: Speak wird auf AB durchgeführt anstatt auf CD. Eventuell wird die Ausgabe noch auf Sonos_A umgeleitet bevor die Gruppe aufgelöst ist.
set Sonos Groups [Sonos_A, Sonos_B], [Sonos_C, Sonos_D];set Sonos_C Speak 10 de Durchsage';set Sonos Groups [Sonos_A, Sonos_B, Sonos_C, Sonos_D]

Viele Grüße
ares

Reinerlein

Hi ares,

vielleicht solltest du etwas Zeit mittels eines "sleep"-Befehl vergehen lassen. Das Aufbauen der Gruppe dauert etwas...
Dabei beachten, dass es ein Fhem-Sleep ist, der von einem Fhem-Befehl gefolgt ist. Dann blockiert Fhem auch nicht...

Leider habe ich zu meinem Post bislang keine Reaktion erhalten... Du bist der erste :)

Grüße
Reinerlein

ares

Der Aufbau der Gruppe dauert (bei insgesamt vier Boxen) länger als 2 Sekunden, daher ist mindestens Sleep 3 erforderlich:
set Sonos Groups [Sonos_A, Sonos_B], [Sonos_C, Sonos_D];set Sonos_D Speak 10 de Durchsage';set Sonos Groups [Sonos_A, Sonos_B, Sonos_C, Sonos_D]

Die Zeit ist aber wahrscheinlich nicht fix (aktuellen CPU-Auslastung?, Anzahl Boxen), ...), daher würde ich eher zu Sleep 5 tendieren, was die Durchsage doch merklich verzögert und je nach Anwendungsfall auch stören kann.
Unschön an dieser Lösung finde ich auch, dass unter Umständen durch das Gruppieren bis zur Ausführung des Speak noch "Musik" an den neuen Gruppenmitgliedern abgespielt wird.
Ist nach der Durchsage auch nochmal ein Sleep erforderlich, da die Lautstärke der Box D nach PlayURITemp auf 10 geblieben ist. Zusätzlich musste fhem nach den meisten Versuchen neu gestartet werden, da die Steuerung von Sonos generell nicht mehr möglich war.

ares

Hallo Reinerlein,

kann man das Sonos-Modul eigentlich auch ohne kompletten Neustart von fhem neu starten?
Brauchst Du noch weitere Rückmeldungen oder reichen die Informationen?

Viele Grüße
ares

Reinerlein

Hi ares,

du kannst einfach das Attribut disable am Sonos-Device für ein paar Sekunden auf "1" setzen, und dann wieder löschen...
Das startet den SubProzess neu.

Wielange hast du denn auf eine Reaktion gewartet. Im Normalfall kommt das irgendwann wieder. Ansonsten wäre eine 5er Logausgabe von diesem Zeitpunkt interessant...

Das Problem ist, dass die Befehle von Fhem in einer Queue abgelegt werden, und die Sprachausgabe daran vorbei direkt mit den Playern redet (da ich relativ schnell das Ende der Zwischenwiedergabe feststellen muss). Dadurch müsste man eigentlich auf die entsprechenden Events warten (kommen ja in LastActionResult oder bei der Gruppierung im ZoneGroupState am Sonosdevice an), und dann erst den nächsten Schritt anstarten...

Grüße
Reinerlein

ares

Hallo Reinerlein,

die ersten Versuche länger. Später vielleicht 2-3 Minuten, da ich davon ausgegangen bin dass sich das Modul nicht mehr selbst fängt.

Für den Fall einer "Hausdurchsage" funktioniert der erste Vorschlag, auch wenn die Ausgabe dann nicht synchron ist.
set TYPE=SONOSPLAYER:FILTER=presence=appeared:FILTER=currentTitle!=Gruppenwiedergabe speak 35 de ...
Der Vorschlag hat mir aber schon für einen Teil meiner Wünsche sehr geholfen

Komplizierter wird es, wenn die Ausgabe z.B. auf einer einzelnen Box erfolgen soll:

  • Ist die Box in keiner Gruppe, dann kann die Ausgabe wie bisher über Speak erfolgen.
  • Bedienung und weitere Speak pausieren?
    (warten auf Rückmeldung "fertig")
    Damit der Rest jedoch nicht unterbrochen wird, darf die Box nicht die "erste Box der Gruppe" sein, die Gruppe muss eventuell umgesteltl werden.
    (warten auf Rückmeldung "fertig")
    Ist die Box in einer Gruppe, dann muss diese vorübergehend entfernt werden.
    (warten auf Rückmeldung "fertig")
    speak
    (warten auf Rückmeldung "fertig")
    Box wieder in die ursprüngliche Gruppe nehmen.
    (warten auf Rückmeldung "fertig")
    Bedienung und weitere Speak freigeben?

Noch schlimmer wird es vermutlich, wenn die Aussage auf mehrere definierte Boxen gleichzeitig erfolgen soll. Für all die Fälle ist das Sonos-System meiner Meinung nach nicht ausgelegt.

Ich rede aber glaube ich gerade wirres Zeug. Was ich eigentlich sagen wollte war, dass ich den Ablauf UND Perl leider zu wenig verstehe, um die Anforderung vernünftig in ein fhem-Modul auszulagern.

Viele Grüße
ares

der-Lolo

Mir ist so als ob Loredo mit seinem MSG modul auch ausgabe auf Sonos devices hat, hast Du Dir das mal angeschaut?

ares

Vorher nicht. Nach kurzer Suche erfolgt die Ausgabe meiner Meinung nach aber nur auf eine Box bzw. falls gruppiert die komplette Gruppe (Details siehe SONOS Doku).
$defaults{audio}{Normal}    = "set \$DEVICE Speak 40 de |\$TITLE| \$MSG";
$defaults{audio}{ShortPrio} = "set \$DEVICE Speak 30 de |\$TITLE| Achtung!";
$defaults{audio}{Short}     = "set \$DEVICE Speak 30 de |\$TITLE|";

Quelle: http://forum.fhem.de/index.php/topic,39983.msg326440.html#msg326440

Falls ich mich täusche, bitte um Korrektur.