Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

Begonnen von Otto123, 31 Mai 2020, 18:30:55

Vorheriges Thema - Nächstes Thema

TomLee

Wenn nicht den "FHEM-eigenen MQTT2-Server" nutzt, brauchst in FHEM eine MQTT2_CLIENT-Definition welche die "Kommunikation" übernimmt:

https://wiki.fhem.de/wiki/MQTT2_CLIENT

Otto123

Zitat von: valvak am 08 November 2023, 18:26:21Ich hab keine Ahnung woran es liegt, ist es möglich dass es nur mit MQTT2_Server klappt?
Hallo Mark,

ich habe es ausschließlich mit MQTT2_Server "entwickelt" - für einen extra MQTT Broker sah ich keinen Sinn.
Zitat von: valvak am 08 November 2023, 18:26:21Per MQTT2_Device den EMQX Broker mit fhem verbunden.
Das wäre Unfug! Oder ein "Versprecher" wenn schon müsste es ein MQTT2_Client sein.
Zitat von: valvak am 08 November 2023, 18:26:21Zumindest lese ich die Wiki so, da meine Vorgehensweise nirgends beschrieben wurde.
Du kannst das gerne ausarbeiten und ins Wiki einarbeiten, ist ja ein Community Projekt.

Ich sehe nicht zwingend einen Grund warum es nicht mit einem MQTT2_Client funktionieren sollte. Aber es kann sein, dass ich an manchen Stellen "zu kurz" gedacht habe.

Gruß Otto
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

valvak

Erst mal danke für die Antworten. Natürlich meinte ich das MQTT_Client device.

Hier mein ,,Broker" im LXC-Container. Sonos sendet an den Broker, das kann ich am Handy verifizieren.
Internals:
   BUF       
   Clients    :MQTT2_DEVICE:MQTT_GENERIC_BRIDGE:
   ClientsKeepOrder 1
   DEF        10.0.3.5:1883
   DeviceName 10.0.3.5:1883
   FD         55
   FUUID      654b9918-f33f-55ff-6803-7bc3d66ba5499949
   NAME       MQTT_Media
   NR         643
   PARTIAL   
   STATE      opened
   TYPE       MQTT2_CLIENT
   WBCallback
   clientId   raspHOME
   eventCount 22
   lastMsgTime 1699480699.05062
   nextOpenDelay 10
   nrConnects 12
   MatchList:
     1:MQTT2_DEVICE ^.
     2:MQTT_GENERIC_BRIDGE ^.
   READINGS:
     2023-11-08 22:18:16   state           opened
   hmccu:
Attributes:
   DbLogExclude .*
   alias      MQTT Media
   autocreate simple
   clientId   raspHOME
   keepaliveTimeout 600
   room       99a_Data

Und hier die SonosBridge
Internals:
   FUUID      654bada7-f33f-55ff-985c-b1e4e9aaba5f6ab9
   IODev      MQTT_Media
   NAME       SonosBridge
   NR         1981
   STATE      connected
   TYPE       MQTT2_DEVICE
   eventCount 5
   OLDREADINGS:
   READINGS:
     2023-11-08 17:23:11   IODev           MQTT_Media
     2023-11-08 17:07:17   attrTemplateVersion 20210301
   hmccu:
Attributes:
   DbLogExclude .*
   IODev      MQTT_Media
   bridgeRegexp sonos/(RINCON_[A-Z0-9]+)[:/].* "$1"
   devStateIcon 0:10px-kreis-rot 1:10px-kreis-gelb 2:10px-kreis-gruen
   devicetopic sonos
   getList    Favorites:noArg Favorites {sonos2mqtt($NAME,$EVENT)}
Reply:Favorites,Radios,Playlists Reply {sonos2mqtt($NAME,$EVENT)}
listalarms:noArg Alarms {sonos2mqtt($NAME,$EVENT)}
   icon       mqtt_bridge_2
   model      sonos2mqtt_bridge
   readingList sonos/connected:.* connected
  homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; { "config_$1"=>$EVENT }}
  sonos/status/[^/]+/avtransport:.* {}
  sonos/status/[^/]+/renderingcontrol:.* {}
   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)}
   stateFormat connected
   userReadings favlist:Favorites.* {sonos2mqtt_ur($name,'favlist')},
grouplist:Favorites.* {sonos2mqtt_ur($name,'grouplist')}

Wie gesagt fruchtet ein ,,PauseAll" in der SonosBridge auch. Heißt für mich die Kopplung mit dem externen Broker klappt prinzipiell.

Get SonosBridge Favorites zb führt nur zu einem
Timeout reading answer for sonos/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}
In erster Linie verstehe ich aber erst mal nicht wieso der

Internals:
   FUUID      5e9eb9da-f33f-55ff-30c3-09bc77194cb3f386
   NAME       autocreate
   NOTIFYDEV  global
   NR         264
   NTFY_ORDER 50-autocreate
   STATE      active
   TYPE       autocreate
Attributes:
   DbLogExclude .*
   alias      autocreate
   room       99_System

 nix macht...

Stehe da echt auf dem Schlauch. Und Otto ich meinte nicht dass die Wiki schlecht dokumentiert ist, ging eigentlich eher in die Richtung dass explizit vom FHEM internen Broker gesprochen wird der benötigt wird.
Auch in der externen Sonos2MQTT Doku

Gruß
Mark


valvak

Achso... und notify wurde laut Wiki natürlich auch erstellt

Internals:
   DEF        global:DEFINED.MQTT2_RINCON_[A-Z0-9]+|MQTT2_RINCON_[A-Z0-9]+:IPAddress:.* {sonos2mqtt_nty($NAME,$EVENT)}
   FUUID      654b9985-f33f-55ff-00e1-24cfd19d5b3d49a1
   NAME       n_configSonos
   NR         645
   NTFY_ORDER 50-n_configSonos
   REGEXP     global:DEFINED.MQTT2_RINCON_[A-Z0-9]+|MQTT2_RINCON_[A-Z0-9]+:IPAddress:.*
   STATE      active
   TYPE       notify
   eventCount 2
   READINGS:
     2023-11-08 17:06:34   state           active
Attributes:
   DbLogExclude .*

Otto123

Zitat von: valvak am 08 November 2023, 23:12:27Und Otto ich meinte nicht dass die Wiki schlecht dokumentiert ist,
Meinte ich auch nicht. Wie schon gesagt: Es ist explizit so, dass ich das Ganze mit dem FHEM MQTT2_Server gemacht habe. Und damit ist es nachvollziehbar dokumentiert.
Ich versteh nicht, warum man es mit einem anderen, exklusiven SONOS MQTT Broker machen sollte.  :-X Nur weil man es kann?

Aber kommen denn überhaupt Nachrichten im richtigen Format in deinem MQTT_Media an? Topic sonos/....?

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

valvak

Zitat von: Otto123 am 08 November 2023, 23:54:16
Zitat von: valvak am 08 November 2023, 23:12:27Und Otto ich meinte nicht dass die Wiki schlecht dokumentiert ist,
Meinte ich auch nicht. Wie schon gesagt: Es ist explizit so, dass ich das Ganze mit dem FHEM MQTT2_Server gemacht habe. Und damit ist es nachvollziehbar dokumentiert.
Ich versteh nicht, warum man es mit einem anderen, exklusiven SONOS MQTT Broker machen sollte.  :-X Nur weil man es kann?

Aber kommen denn überhaupt Nachrichten im richtigen Format in deinem MQTT_Media an? Topic sonos/....?



Ja das ist ja das komische. Im MQTT Analyser auf dem Handy sehe ich die topics in sonos/#
und die SonosBridge in FHEM kann per PauseAll die Player ja auch pausieren.

Es werden nur eben keine Player erstellt.

valvak

Ok nevermind.  ;D

Die auf Sonos2MQTT vorgeschlagene Docker-compose klappt nicht.
Dieser EMQX Broker scheint nicht mit FHEM zu funktionieren.

Ich habe in der docker-compose einen mosquito verwendet, dann klappt's sofort.
Da ich die topics auf dem Handy gesehen hab scheint das Problem wirklich an dem MQTT_Client in Verbindung mit EMQX zu liegen.

(Hab bisher auch noch nicht von EMQX gehört)

version: "3.7"
services:
  sonos:
    image: ghcr.io/svrooij/sonos2mqtt
    # or the dockerhub svrooij/sonos2mqtt
    restart: unless-stopped
    ports:
      - "6329:6329"
    environment:
      - SONOS2MQTT_DEVICE=10.0.3.10 # Service discovery doesn't work very well inside docker, so start with one device.
      - SONOS2MQTT_MQTT=mqtt://mqtt5:1883 # EMQX is a nice mqtt broker
#      - SONOS2MQTT_DISTINCT=true # if your want distinct topics
#      - SONOS2MQTT_TOPIC=sonos
      - SONOS_LISTENER_HOST=10.0.3.5 # Docker host IP
      - SONOS_TTS_ENDPOINT=http://sonos-tts:5601/api/generate # If you deployed the TTS with the same docker-compose
    depends_on:
#      - emqx
      - mqtt5

# You can skip the TTS server if you want. See https://github.com/svrooij/node-sonos-ts#text-to-speech
# Set the amazon keys to your own
# Set the SONOS_TTS_CACHE_URI to http://[ip_of_docker_host]:5601/cache
  sonos-tts:
    image: svrooij/sonos-tts-polly
    restart: unless-stopped
    ports:
      - "5601:5601"
    environment:
      - SONOS_TTS_AMAZON_KEY=your_key_id_here
      - SONOS_TTS_AMAZON_SECRET=your_secret_access_token_here
      - SONOS_TTS_AMAZON_REGION=eu-west-1
      - SONOS_TTS_CACHE_URI=http://192.168.50.44:5601/cache

# Optional MQTT server (I like emqx over mosquitto)
#  emqx:
#    image: emqx/emqx
#    restart: unless-stopped
#    ports:
#      - "1883:1883"
#      - "18083:18083"

  mqtt5:
    image: eclipse-mosquitto
    container_name: mqtt5
    ports:
      - "1883:1883" #default mqtt port
      - "9001:9001" #default mqtt port for websockets
    volumes:
      - ./config:/mosquitto/config:rw
      - ./data:/mosquitto/data:rw
      - ./log:/mosquitto/log:rw

Die mosquitto.conf dann noch auf ,,allow_anonymous true" Weil die dockercompose wohl kein Username:Passwort@mqtt schluckt (hatte erst meinen Standard Broker versucht, das mag der Sonos2MQTT Container aber nicht)

Gruß
Mark

Otto123

Zitat von: valvak am 09 November 2023, 09:50:54Ja das ist ja das komische. Im MQTT Analyser auf dem Handy sehe ich die topics in sonos/#
Ich hätte es zunächst im MQTT2_Client Links ganz oben: Show MQTT Traffic versucht ;), da weiß man ob das Gerät überhaupt was empfängt.

Was bringt die zusätzliche Instanz in der Kette : sonos2mqtt - extra Broker - fhem : für Vorteile?
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

valvak

Zitat von: Otto123 am 09 November 2023, 11:22:28
Zitat von: valvak am 09 November 2023, 09:50:54Ja das ist ja das komische. Im MQTT Analyser auf dem Handy sehe ich die topics in sonos/#
Ich hätte es zunächst im MQTT2_Client Links ganz oben: Show MQTT Traffic versucht ;), da weiß man ob das Gerät überhaupt was empfängt.

Was bringt die zusätzliche Instanz in der Kette : sonos2mqtt - extra Broker - fhem : für Vorteile?

Naja wirkliche Vorteile bringt die zusätzliche Instanz als solches bestimmt nicht.
Aber meine FHEM Installation mit MQTT/Portainer/Lepresenced/iBeacon/collectord/Sonos/Homebridge etc. Lief auf einer Ubuntu VM und ist ziemlich in die Jahre gekommen.

Da ich mittlerweile die Vorzüge von LXC-Containern auf Proxmox zu schätzen weiß macht es schon Sinn einzelne Komponenten mal restoren zu können und der Rest läuft weiter.
Seitdem ich ein paar einzelne Komponenten bereits umgezogen hab läuft der Host wesentlich entspannter. (Lenovo Tiny auf dem auch die CCU als Raspberrymatic läuft)

LXCs teilen sich halt den Kernel mit dem Host und die VM muss einen zusätzlichen Kernel laden.

Ralli

Ich gestehe, ich habe es tatsächlich auch so gemacht. Einen LXC nur mit Nodejs, sonos2mqtt und mosquitto, den ich dann aus FHEM (in einem anderen LXC) heraus mit  einem MQTT2_Client_Device anspreche. So habe ich das - nach meiner Vorstellung - schön modular aufgebaut. Auch andere benachbarte Systeme/Services habe ich in mehrere LXCs verteilt. So gibt's noch einen LXC für Grafana, einen für Homebridge, einen für PSA-Car-Controller, einen für ein schlankes FHEM, welches mir eine Bresser 7in1 auf MQTT umsetzt, und einen für Bündelung und "MQTT-Wandlung" aller PV- und Energiemesser.
Gruß,
Ralli

Proxmox 8.2 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.7.20240420) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

TomLee

Hallo Otto,

auf einem neuen System werden bei mir Mp3s verzögert ausgegeben, umso größer (so ab 300KB) sie sind und FHEM hängt auch in der Zeit. Bei kleineren Dateien fällt mir keine Verzögerung auf. Das ist auf dem "alten" System nichts so. An was könnte das liegen ? Ich hab die ganzen Bibliotheken die im Wiki zu Text2speech zu mp3wrap aufgeführt werden nicht installiert bis auf mp3wrap, weil ein abspielen auch so klappt, kann es daran liegen ?

Und, wenn ich auf dem neuen System einen Sound abspiele, mit der gleichen Konfig aus dem alten System, bekomme ich im Log nach jedem playsound Befehl noch unsupported HTTP method HEAD, rejecting it-Meldungen. Ob das was mit den Verögerungen zu tun hat ?
Die bekommt man aber weg wenn man in der FHEMWEB-Defintion in das Attribut allowedHttpMethods GET|POST|HEAD setzt.
Auf dem alten System ist das nicht so und das ist aktuell.

2023.11.20 15:35:24 3: MQTT2_DEVICE set Sonos_Wohnzimmer notify 20 http://192.168.188.30:8084/fhem/www/sounds/LastChristmas_30.mp3
2023.11.20 15:35:24 3: WEBs2m_192.168.188.23_42744: unsupported HTTP method HEAD, rejecting it.
2023.11.20 15:35:24 3: WEBs2m_192.168.188.23_42745: unsupported HTTP method HEAD, rejecting it.
2023.11.20 15:35:29 3: WEBs2m_192.168.188.23_42767: unsupported HTTP method HEAD, rejecting it.
2023.11.20 15:35:56 3: MQTT2_DEVICE set Sonos_Wohnzimmer playSound 40 LastChristmas_60.mp3
2023.11.20 15:35:56 3: MQTT2_DEVICE set Sonos_Wohnzimmer notify 40 http://192.168.188.30:8084/fhem/www/sounds/LastChristmas_60.mp3
2023.11.20 15:36:06 3: WEBs2m_192.168.188.23_42781: unsupported HTTP method HEAD, rejecting it.
2023.11.20 15:36:13 3: WEBs2m_192.168.188.23_42799: unsupported HTTP method HEAD, rejecting it.
2023.11.20 15:36:37 3: WEBs2m_192.168.188.23_42801: unsupported HTTP method HEAD, rejecting it.

Otto123

Hallo Tom,
Liegt das an text2speech oder an sonos2mqtt? Was ist wenn Du den Befehl direkt absetzt? Die Sounddatei liegt ja jetzt einmal da ;)
 set Sonos_Wohnzimmer notify 40 http://192.168.188.30:8084/fhem/www/sounds/LastChristmas_60.mp3
Gruß Otto
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

TomLee

FHEM hängt kurz, die Datei wird abgespielt, aber nicht ganz.

TomLee

Es gibt einen kleinen Unterschied von neu zu alt, nicht das es was damit zu tun hat:

Zitatdefmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb

Zitatdefmod SonosTTS Text2Speech none
attr SonosTTS TTS_CacheFileDir cache/Toene
attr SonosTTS TTS_FileMapping Vibrating:Vibrating.mp3 Temple:Temple.mp3
attr SonosTTS TTS_Language Deutsch
attr SonosTTS TTS_Speed 10
attr SonosTTS TTS_UseMP3Wrap 1
attr SonosTTS group s2m
attr SonosTTS room Media
attr SonosTTS userReadings httpName:lastFilename.* {'http://'.readingsval($name,'host','set host:port first').'/fhem/'.ReadingsVal($name,'lastFilename','')}

setstate SonosTTS 2020-12-11 14:56:03 host 192.168.188.26:8084
setstate SonosTTS 2023-11-20 16:41:07 httpName http://192.168.188.26:8084/fhem/cache/Toene/d603004c0fe64b261b69ed3eaf9b82bd.mp3
setstate SonosTTS 2023-11-20 16:41:07 lastFilename cache/Toene/d603004c0fe64b261b69ed3eaf9b82bd.mp3
setstate SonosTTS 2023-11-20 16:41:07 playing 0
setstate SonosTTS 2021-02-17 13:24:27 vol 15

Neu:
Zitatdefmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb

Zitatdefmod SonosTTS Text2Speech none
attr SonosTTS TTS_CacheFileDir www/sounds
attr SonosTTS TTS_FileMapping Vibrating:Vibrating.mp3 Temple:Temple.mp3
attr SonosTTS TTS_Language Deutsch
attr SonosTTS TTS_Speed 10
attr SonosTTS TTS_UseMP3Wrap 1
attr SonosTTS group s2m
attr SonosTTS room Media
attr SonosTTS userReadings httpName:lastFilename.* {'http://'.readingsval($name,'host','set host:port first').'/fhem/'.ReadingsVal($name,'lastFilename','')}

setstate SonosTTS 2023-11-20 02:27:40 host 192.168.188.30:8084
setstate SonosTTS 2023-11-20 16:41:06 httpName http://192.168.188.30:8084/fhem/www/sounds/fe0c96afd36b5590dd840557a0b29320.mp3
setstate SonosTTS 2023-11-20 16:41:06 lastFilename www/sounds/fe0c96afd36b5590dd840557a0b29320.mp3
setstate SonosTTS 2023-11-20 16:41:06 playing 0

Otto123

Das dies überhaupt funktioniert? Da passt doch jetzt SonosSpeakWeb und FileDir nicht zusammen?
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