FHEM, sonos2mqtt & TTS im Docker: keine Ausgabe am Sonos

Begonnen von rallye, 31 März 2023, 10:38:51

Vorheriges Thema - Nächstes Thema

rallye

Hallo zusammen!
Nun habe ich meine gesamte Umgebung erfolgreich in eine Docker-Installation gepackt. Das Thema mit was-Polly habe ich mal auf Eis gelegt doch ich "hänge" auch bei noch so genauer Einhaltung der Beschreibung im WIKI. Ich kann zwar meinen Sonos 1 mit basic commands (play, stop, ...) steuern, aber Sprachausgabe will einfach nicht funktionieren.
Hier mein compose.yml in der Testumgebung abgespeckt zur Fehlereingrenzung:
version: '3'
services:

  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    ports:
      - "8000:8000"
      - "9443:9443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
    restart: unless-stopped
#
#
  fhem:
    image: ghcr.io/fhem/fhem/fhem-docker:bullseye
    container_name: fhem
    hostname: fhem
    hostname: fhem
    restart: always
    network_mode: host
    volumes:
      - /opt/fhem/:/opt/fhem/
    environment:
      FHEM_UID: 999
      FHEM_GID: 20
      TZ: Europe/Vienna
#
  sonos:
    image: ghcr.io/svrooij/sonos2mqtt
    restart: unless-stopped
    network_mode: host
    environment:
      - SONOS2MQTT_DEVICE=192.168.57.77
      - SONOS2MQTT_MQTT=mqtt://192.168.57.34
      - SONOS_LISTENER_HOST=192.168.57.34 # Docker host IP
#
volumes:
  portainer_data:
    name: portainer_data
    external: true
Mein Sonos ONE hat die feste IP 192.168.57.77, der Testrechner auf dem der Docker läuft hat die feste IP 192.168.57.34

Der MQTT2-Server in FHEM ist so definiert:
defmod MQTT_Shellies MQTT2_SERVER 1883 global
attr MQTT_Shellies autocreate simple
attr MQTT_Shellies room HW & Gateways

setstate MQTT_Shellies 2023-03-31 09:40:32 nrclients 1
setstate MQTT_Shellies 2023-03-30 16:31:42 state Initialized

Die Sonos-Bridge sieht so aus:
defmod SonosBridge MQTT2_DEVICE
attr SonosBridge bridgeRegexp sonos/(RINCON_[A-Z0-9]+)[:/].* "$1"
attr SonosBridge devStateIcon 0:10px-kreis-rot 1:10px-kreis-gelb 2:10px-kreis-gruen
attr SonosBridge devicetopic sonos
attr SonosBridge getList Favorites:noArg Favorites {sonos2mqtt($NAME,$EVENT)}\
Reply:Favorites,Radios,Playlists Reply {sonos2mqtt($NAME,$EVENT)}\
listalarms:noArg Alarms {sonos2mqtt($NAME,$EVENT)}
attr SonosBridge icon mqtt_bridge_2
attr SonosBridge model sonos2mqtt_bridge
attr SonosBridge readingList homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),;; { "config_$1"=>$EVENT }}\
sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites\
sonos/RINCON_([0-9A-Z]+)/Reply:.* Reply\
sonos/alarms:.* Alarms\
sonos/connected:.* connected\
sonos/status/[^/]+/avtransport:.* {}\
sonos/status/[^/]+/renderingcontrol:.* {}
attr SonosBridge room MQTT2_DEVICE
attr SonosBridge setList CheckSubscription:noArg $DEVICETOPIC/cmd/check-subscriptions\
PauseAll:noArg $DEVICETOPIC/cmd/pauseall\
announcementall:textField {sonos2mqtt($NAME,$EVENT)}\
notifyall:textField {sonos2mqtt($NAME,$EVENT)}\
setalarm:textField $DEVICETOPIC/cmd/setalarm\
speak:textField {sonos2mqtt($NAME,$EVENT)}
attr SonosBridge stateFormat connected
attr SonosBridge userReadings favlist:Favorites.* {sonos2mqtt_ur($name,'favlist')},\
grouplist:Favorites.* {sonos2mqtt_ur($name,'grouplist')}

setstate SonosBridge 2
setstate SonosBridge 2023-03-30 16:31:42 IODev MQTT_Shellies
setstate SonosBridge 2023-03-21 17:29:14 attrTemplateVersion 20210303
setstate SonosBridge 2023-03-31 09:40:32 config_RINCON_F0F6C18AF44201400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","notifytwo","pause","play","playmode","previous","queue","seek","selecttrack","setbass","setbuttonlockstate","setledstate","setnightmode","setavtransporturi","settreble","sleep","speak","speaktwo","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_F0F6C18AF44201400/control","device":{"identifiers":["RINCON_F0F6C18AF44201400"],"manufacturer":"Sonos","name":"Esszimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_F0F6C18AF44201400","name":"Esszimmer","state_topic":"sonos/RINCON_F0F6C18AF44201400","unique_id":"sonos2mqtt_RINCON_F0F6C18AF44201400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
setstate SonosBridge 2023-03-31 09:40:32 connected 2
setstate SonosBridge 2023-03-30 16:20:29 state speak

Und mein Sonos-Speaker ist wie folgt definiert:
defmod MQTT2_RINCON_F0F6C18AF44201400 MQTT2_DEVICE RINCON_F0F6C18AF44201400
attr MQTT2_RINCON_F0F6C18AF44201400 alias Esszimmer
attr MQTT2_RINCON_F0F6C18AF44201400 devStateIcon {sonos2mqtt($name,'devStateIcon')}
attr MQTT2_RINCON_F0F6C18AF44201400 devicetopic sonos
attr MQTT2_RINCON_F0F6C18AF44201400 icon Sonos2mqtt_icon-S18
attr MQTT2_RINCON_F0F6C18AF44201400 jsonMap volume_Master:volume mute_Master:mute
attr MQTT2_RINCON_F0F6C18AF44201400 model sonos2mqtt_speaker
attr MQTT2_RINCON_F0F6C18AF44201400 readingList $DEVICETOPIC/RINCON_F0F6C18AF44201400/ZoneInfo:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/RINCON_F0F6C18AF44201400:.* { json2nameValue($EVENT,'',$JSONMAP) }\
$DEVICETOPIC/status/(.*)/avtransport:.* { sonos2mqtt_reading($NAME,$EVENT,$TOPIC) }
attr MQTT2_RINCON_F0F6C18AF44201400 room MQTT2_DEVICE
attr MQTT2_RINCON_F0F6C18AF44201400 setList alarm:textField { sonos2mqtt_alarm($NAME,$EVENT) }\
input:Queue {sonos2mqtt($NAME,$EVENT)}\
joinGroup: {sonos2mqtt($NAME,$EVENT)}\
leaveGroup:noArg {sonos2mqtt($NAME,$EVENT)}\
mute:true,false {sonos2mqtt($NAME,$EVENT)}\
next:noArg {sonos2mqtt($NAME,$EVENT)}\
notify:textField {sonos2mqtt($NAME,$EVENT)}\
pause:noArg {sonos2mqtt($NAME,$EVENT)}\
play:noArg {sonos2mqtt($NAME,$EVENT)}\
playUri:textField {sonos2mqtt($NAME,$EVENT)}\
previous:noArg {sonos2mqtt($NAME,$EVENT)}\
sayText:textField {sonos2mqtt($NAME,$EVENT)}\
setAVTUri:textField {sonos2mqtt($NAME,$EVENT)}\
sleep:selectnumbers,0,15,120,0,lin {sonos2mqtt($NAME,$EVENT)}\
snoozeAlarm:textField { sonos2mqtt($NAME,$EVENT) }\
speak:textField {sonos2mqtt($NAME,$EVENT)}\
stop:noArg {sonos2mqtt($NAME,$EVENT)}\
toggle:noArg {sonos2mqtt($NAME,$EVENT)}\
volume:slider,0,1,100 {sonos2mqtt($NAME,$EVENT)}\
volumeDown:noArg {sonos2mqtt($NAME,$EVENT)}\
volumeUp:noArg {sonos2mqtt($NAME,$EVENT)}\
x_raw_payload:textField {sonos2mqtt($NAME,$EVENT)}
attr MQTT2_RINCON_F0F6C18AF44201400 stateFormat transportState
attr MQTT2_RINCON_F0F6C18AF44201400 userReadings Master:groupName.* {(split(' \+',ReadingsVal($name,'groupName','')))[0]},\
isMaster:coordinatorUuid.* {ReadingsVal($name,'coordinatorUuid','') eq ReadingsVal($name,'uuid','')?1:0},\
inGroup:groupName.* {ReadingsVal($name,'groupName','') =~ / \+ /?1:0},\
inCouple:coordinatorUuid.* {(ReadingsVal($name,'coordinatorUuid','') ne ReadingsVal($name,'uuid','') and (index(ReadingsVal($name,'groupName',''), ReadingsVal($name,'name','')) != -1))?1:0},\
Input:currentTrack_TrackUri.* {sonos2mqtt_ur($name,'Input')}

setstate MQTT2_RINCON_F0F6C18AF44201400 PLAYING
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 09:40:32 AlarmRunning false
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:56 CopyrightInfo © 2003-2021, Sonos, Inc. All rights reserved.
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:56 DisplaySoftwareVersion 15.1.1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:56 Flags 0
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:56 HTAudioIn 0
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:56 HardwareVersion 1.26.1.9-2.2
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-30 16:31:42 IODev MQTT_Shellies
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:56 IPAddress 192.168.57.77
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 Input Radio
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:56 MACAddress F0:F6:C1:8A:F4:42
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 Master Esszimmer
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:56 SerialNumber F0-F6-C1-8A-F4-42:C
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 09:40:32 SleepTimerGeneration 0
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 09:40:32 SnoozeRunning false
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:56 SoftwareVersion 71.1-38240
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:55 associatedWith SonosBridge
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:56 attrTemplateVersion 20210303
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 bass 5
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 coordinatorUuid RINCON_F0F6C18AF44201400
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 currentTrack_AlbumArtUri http://192.168.57.77:1400/getaa?s=1&u=x-sonosapi-stream%3atunein%253a6778%3fsid%3d303%26flags%3d8232%26sn%3d1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 currentTrack_Artist taio cruz
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 currentTrack_ItemId -1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 currentTrack_ParentId -1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 currentTrack_ProtocolInfo sonos.com-http:*:*:*
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 currentTrack_Title dynamite
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 currentTrack_TrackUri x-sonosapi-stream:tunein:6778?sid=303&flags=8232&sn=1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 currentTrack_UpnpClass object.item
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-29 08:21:14 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s15532/images/logoq.png?t=636887910150000000
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 enqueuedMetadata_ItemId -1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 enqueuedMetadata_ParentId -1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 enqueuedMetadata_Title kronehit 105,8
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 groupName Esszimmer
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 inCouple 0
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 inGroup 0
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 isMaster 1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 model Sonos One
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:56 modelNumber S18
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 mute false
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 mute_LF false
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:55 mute_Master false
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 mute_RF false
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 name Esszimmer
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 playmode NORMAL
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 09:29:06 state notify
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 transportState PLAYING
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 treble -1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 ts 1680250381686
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 uuid RINCON_F0F6C18AF44201400
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 volume 6
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 volume_LF 100
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-21 17:35:55 volume_Master 7
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-03-31 10:13:02 volume_RF 100

Mit diesen Definitionen kann ich meinen Sonos starten, stoppen, Lautstärke ändern u.s.w.
Nun habe ich nach WIKI Text2Speech Variante einrichten den SonosTTS definiert
defmod SonosTTS Text2Speech none
attr SonosTTS TTS_CacheFileDir cache
attr SonosTTS TTS_Language Deutsch
attr SonosTTS TTS_UseMP3Wrap 1
attr SonosTTS room MQTT2_DEVICE
attr SonosTTS userReadings httpName:lastFilename.* {'http://'.ReadingsVal($name,'host','set host:port first').'/fhem/'.ReadingsVal($name,'lastFilename','')}

setstate SonosTTS 2023-03-31 10:19:46 host fhem:8083
setstate SonosTTS 2023-03-30 16:15:30 httpName http://fhem:8083/fhem/cache/832ef86c494075ffffbcbe745e11519b.mp3
setstate SonosTTS 2023-03-30 16:15:30 lastFilename cache/832ef86c494075ffffbcbe745e11519b.mp3
setstate SonosTTS 2023-03-30 16:15:30 playing 0
und den SonosTTS
defmod SonosTTS Text2Speech none
attr SonosTTS TTS_CacheFileDir cache
attr SonosTTS TTS_Language Deutsch
attr SonosTTS TTS_UseMP3Wrap 1
attr SonosTTS room MQTT2_DEVICE
attr SonosTTS userReadings httpName:lastFilename.* {'http://'.ReadingsVal($name,'host','set host:port first').'/fhem/'.ReadingsVal($name,'lastFilename','')}

setstate SonosTTS 2023-03-31 10:19:46 host fhem:8083
setstate SonosTTS 2023-03-30 16:15:30 httpName http://fhem:8083/fhem/cache/832ef86c494075ffffbcbe745e11519b.mp3
setstate SonosTTS 2023-03-30 16:15:30 lastFilename cache/832ef86c494075ffffbcbe745e11519b.mp3
setstate SonosTTS 2023-03-30 16:15:30 playing 0

Der im WIKI angegebene Beispielsbefehl
set EG.KU.Sonos speak de-DE Vicki 25 Test auf meine Umgebung adaptiert
set alias=Esszimmer speak de-DE Vicki 25 Testmacht nichts ausser einem Log-Eintrag. Ein
set alias=Esszimmer notify 25 {('http://[SonosTTS:host]/fhem/cache/pull-bell-short.mp3')}unterbricht die laufende Musik, der Sonos bleibt ein paar Sekunden still und spielt dann wieder weiter. Die Datei pull-bell-short.mp3 ist selbstverständlich in meiner /opt/fhem/cache vorhanden.
Ein Click auf SonosSpeakWeb führt zum Screen mit dem Inhalt:
File not found: cache/index.html
Also absolut kein Erfolgserlebnis. Mir würde es schon reichen, wenn ich einen Trigger schalten könnte, wenn die Türglocke bedient wird, dass ein Läuten Uder ein fixer Text am Sonos ausgegeben wird. Doch daran scheitere ich kläglich.

Einzig was ich aus dem WIKI nicht befolgt habe ist der Satz:" Für FHEM innerhalb Docker muss man die Adresse des Docker Host angeben." - weil ich einfach nicht verstehe WO ich das angeben soll. Aber vielleicht hat das mit meinem Problem überhaupt nichts zu tun.

Bin für jede Hilfe dankbar

Der Vollständigkeit halber: ich habe einen Share
[SonosSpeak]
comment = Audio-Files for SonosPlayer to Speak
guest ok = Yes
path = /mnt/SonosSpeak
read only = No

definiert, doch der spielt in dieser Umgebung ohnehin keine Rolle (denke ich)

LG Rallye
RaspiPi v4, HM-LGW, 6x HM-TC-IT-WM-W-EU, 11x HM-CC-RT-DN, 1x HUE Bridge, 4x HUE-RC, 5x HUE White&Color, 15xHUE White, 3xHM-LC-SW1-FM, 1xHM-LC-SW2-FM, 1x ConBeeII, 15x Shelly1, 5xShellyplug, Aquara: 2x Temp-Sensor, 1x Vibrationssensor, 2x Lichtsensor, 19x Tür/Fenstersensor

Otto123

#1
Zitat von: rallye am 31 März 2023, 10:38:51Der im WIKI angegebene Beispielsbefehl
Du hast den falschen Befehl erwischt, der gilt für sonos-tts
https://wiki.fhem.de/wiki/Sonos2mqtt#Speak_Befehl
In deiner Umgebung so
set alias=Esszimmer speak 25 textAber dein SonosTTS ist falsch konfiguriert. Sonos muss ja eine URL bekommen die wirklich erreicht werden kann
Dein Dockerhost ist in deinem normalen Netzwerk sicher nicht unter dem Namen fhem zu erreichen, Du musst den Befehl nochmal mit deinem Dockerhostnamen und dem Port ausführen, also so wie Du in deinem Browser auf dein FHEM zugreifen kannst
setreading SonosTTS host <hostname>:<port>
Das share kannst Du löschen das spielt hier keinerlei Rolle!
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

rallye

Super, danke! Kaum macht man's richtig, funktioniert's auch schon!  :)

Grüße aus Wien

Rallye
RaspiPi v4, HM-LGW, 6x HM-TC-IT-WM-W-EU, 11x HM-CC-RT-DN, 1x HUE Bridge, 4x HUE-RC, 5x HUE White&Color, 15xHUE White, 3xHM-LC-SW1-FM, 1xHM-LC-SW2-FM, 1x ConBeeII, 15x Shelly1, 5xShellyplug, Aquara: 2x Temp-Sensor, 1x Vibrationssensor, 2x Lichtsensor, 19x Tür/Fenstersensor