AudioManager / Sonos2Mqtt

Begonnen von Guybrush, 26 August 2026, 17:36:42

Vorheriges Thema - Nächstes Thema

Guybrush

Ich hab jetzt auch mal meinen AudioManager auf github hochgeladen. Mit dem AudioManager kann man seine Sonos Lautsprecher komfortabel ohne eigenen Logikcode steuern. Dabei kümmert sich das Modul um Parallelität, Abfolge, Konflikte usw selbst. Es geht natürlich auch über direkte Befehle an Lautsprecher, aber das erfordert je nach Komplexität dann doch einiges an Logikcode. Beispielsweise bei Sprachdurchsagen müsste man selbst sicherstellen, dass diese richtig eingereiht und nicht parallel laufen. Das macht alles der AudioManager. Auch das Fortsetzen des Streams/Queue/Mp3 nach einer Sprachdurchsage wird automatisch verwaltet. Man kann beispielsweise auch definieren, wie laut was um welche Uhrzeit sein darf/muss. Ich hab das alles in der Readme so gut es ging festgehalten:

https://github.com/next81/fhem.AudioManager

Hintergrund für die Entwicklung war, dass es bei mir ständig Konflikte mit Sprachansagen, Musik usw gab und die Logik in fhem immer größer und nicht mehr wartungsfreundlich bei mir war. Der AudioManager ist modular aufgebaut und unterstützt grundsätzlich auch andere backends, wobei derzeit nur sonos2mqtt integriert ist, da ich selbst auch nur Sonos hab. AudioManager ersetzt nichts, sondern fungiert als reine zentrale Verwaltung beliebig vieler Lautsprecher/Gruppen. Die Lautsprecher könnten also theoretisch weiterhin parallel angesteuert werden. Das bringt dann nur keinen Komfortgewinn.

Installation:
update all https://raw.githubusercontent.com/next81/fhem.AudioManager/main/controls_AudioManager.txt
define Audio AudioManager sonos2mqtt=Sonos.FlurEG,Sonos.Kueche,Sonos.Wintergarten

Statt Sonos.FlurEG,Sonos.Kueche,Sonos.Wintergarten einfach die  Devicenames der Sonos Lautsprecher in Fhem angeben, die darüber gesteuert werden sollen.

Die Sonos Devices selbst müssen in setList zumindest x_raw_payload (als eigene Zeile) anbieten. playUri, volume, mute, play, pause usw sind optional. playFav muss zumindest bei einem player definiert sein, wenn man Radio per Name steuern will.

binford6000

2026.08.26 19:32:16 1: UPD FHEM/90_AudioManager.pm
2026.08.26 19:32:16 1: Got 14 bytes for FHEM/90_AudioManager.pm, expected 103656
2026.08.26 19:32:16 1: aborting.

Zitatsollte behoben sein. Der Generator zählte Windows-CRLF-Bytes. GitHub liefert das Modul mit LF aus: 72144 statt 73810 Bytes. Hatte für die generierung der controls noch keinen unittest hinterlegt. dadurch viel das nicht auf

Hallo Guybrush,
gleiches Thema wie hier.

VG Sebastian

Guybrush

tatsächlich nicht. Ich hab nur vergessen den pre-commit hook dafür anzulegen, so dass die Datei garnicht aktualisiert wurde. jetzt sollte es aber gehen

binford6000

Zitattatsächlich nicht. Ich hab nur vergessen den pre-commit hook dafür anzulegen, so dass die Datei garnicht aktualisiert wurde. jetzt sollte es aber gehen

Na gut, dann so ;-)

Ein sehr mächtiges Modul! 

Und gleich eine Frage: Ich nutze sonos2mqtt + sonos-tts-polly via docker. Auf dem Testsystem habe ich dazu das Text2Speech Modul installiert und konfiguriert. Das möchte ich auf meinem Prod System nicht machen da ja alles praktisch schon im sonos-tts-Polly vorhanden ist und läuft. Wäre es also möglich, alternativ zu einem TTS-Device sonos-tts-polly zu nutzen?

Gruß,
Sebastian

Guybrush

klar, TTS ist ja nur ein backend. Solang es ähnlich funktioniert, ist das kein Problem auch TTS-Polly zu unterstützen. Es Bedarf nur eine Stelle, die aus Text ein MP3 macht.

binford6000

ZitatEs Bedarf nur eine Stelle, die aus Text ein MP3 macht.
lastError
ttsDevice fehlt oder existiert nicht
2026-08-27 09:14:49

Mit set audio speak... kommt der obige Fehler. Es wird also ein TTS-Device vorausgesetzt.

Im Falle von SONOS brauchtes das aber gar nicht. Eigentlich(TM) nur einen Schalter (Attribut),
welcher bei SONOS-Devices die bereits eingebaute speak Funktionalität nutzt.
Diese wiederum nutzt den bei sonos2mqtt konfigurierten sonos-tts-polly container.

Guybrush

#6
Du musst das Attribut ttsDevice im AudioManager Device setzen für speak. Das funktioniert mit Text2Speech. Für Polly müsste man vermutlich was anpassen, probiert habe ich das aber noch nicht. Eine native Sprachumwandlung in den Sonos Lautsprechern kenn ich nicht. Die haben doch keine Logik drin oder meintest du Polly?

Guybrush

grad geschaut: https://wiki.fhem.de/wiki/Text2Speech

das unterstützt Polly bereits nativ. Dann sollte das auch direkt mit dem AudioManager funktionieren. Du musst nur als Attribut ttsDevice den devicename deines text2speech devices setzen

binford6000

ZitatEine native Sprachumwandlung in den Sonos Lautsprechern kenn ich nicht. Die haben doch keine Logik drin oder meintest du Polly?
Ja ich meinte Polly (https://github.com/svrooij/node-sonos-tts-polly).

  • set Beam speak blabla
  • sonos2mqtttUtils -> sonos2mqtt container
  • sonos2mqtt container -> sonos-tts-polly container
  • sonos-tts-polly container -> AWS Polly

Damit benötige ich kein Text2Speech Device.

services:
  # sonos2mqtt + polly tts
  sonos:
    container_name: sonos2mqtt
    image: ghcr.io/svrooij/sonos2mqtt:4.0.0-beta.7
    restart: unless-stopped
    ports:
      - 6329:6329
    environment:
      SONOS2MQTT_DEVICE: 10.3.3.142
      SONOS2MQTT_DISCOVERY: true
      SONOS2MQTT_MQTT: "mqtt://user:pass@10.3.3.6:1883"
      SONOS2MQTT_CLIENTID: sonos2mqtt[/font]
      SONOS_LISTENER_HOST: 10.3.3.12
      SONOS_TTS_ENDPOINT: http://10.3.3.12:5601/api/generate
      SONOS2MQTT_TTSLANG: de-DE
      TZ: Europe/Berlin
      # New AudioClip notifications (latest beta version needed):
      SONOS2MQTT_EXPERIMENTAL: true
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
  polly:
    container_name: sonos-tts-polly
    image: ghcr.io/svrooij/node-sonos-tts-polly:1.0.10-beta.2
    restart: unless-stopped
    ports:
      - 5601:5601
    environment:
      SONOS_TTS_AMAZON_KEY: key
      SONOS_TTS_AMAZON_SECRET: secret
      SONOS_TTS_AMAZON_REGION: eu-central-1
      SONOS_TTS_CACHE_URI: http://10.3.3.12:5601/cache/
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


Guybrush

also das geht mit dem AudioManager zur Zeit nicht direkt. Polly geht, wenn du text2speech verwendest. Das ist im Kern ja das gleiche und bietet sogar den Vorteil, dass du keinen separaten docker container brauchst. Ich hatte tatsächlich mal überlegt tts als modularen Renderer zu integrieren. Ähnlich wie bei den player backends. Ich hab das aber damals verworfen, weil text2speech robust funktioniert und ich nicht redundantes entickeln wollte. Kann man aber drüber nachdenken, da es ja genug tts Alternativen gibt, die text2speech nicht unterstützt. Ich weiß nur nicht, ob das dann Sinn macht extra sonos2utils zu integrieren, statt Polly direkt zu integrieren. Was sind denn aus deiner Sicht die Vorteile, dass du das so nutzt statt text2speech?

binford6000

ZitatWas sind denn aus deiner Sicht die Vorteile, dass du das so nutzt statt text2speech?
  • Der s2m Stack ist halt bereits vorhanden und könnte somit einfach weiter genutzt werden
  • Möchte mein FHEM im LXC möglichst schlank halten
  • Daher s2m gänzlich in Container verfrachtet. Gleiches gilt für alexa.
    Damit ist das System auch Node-befreit ;-)
  • Daher auch erstmal nur in einem Wegwerf-LXC getestet und Text2Speech installiert

Ich finde das Audio-Mudul wirklich sehr mächtig und es schließt mMn. auch einige Lücken zu globalMsg.
Perspektivisch wären ja auch die Echo Devices interessant einzubinden. Die benötigen ebenfalls kein Text2Speech.

Und last but not least:
ZitatCoordinates prioritized streams, queues, clips, speech and alarms through versioned backend adapters. The initial backend supports sonos2mqtt speakers.

...wäre es ja der Beschreibung des Moduls nach nur konsequent, s2m gänzlich zu unterstützen. ob nun im Container
oder via Node lokal laufend. ;-)

Guybrush

Wie ist denn dein aktueller Ablauf für eine Sprachausgabe? Beispiel wäre schön